feat(meal-plan): add servings field to MealPlanEntry and update related functionality

feat(products): implement bulk update for product categories

feat(recipes): add servings input to WriteRecipePage and update MealPlanClient for servings management

refactor(types): enhance Product and Category types with additional properties
This commit is contained in:
Nils-Johan Gynther
2026-04-17 22:50:41 +02:00
parent a81bd6b460
commit 21dc06829a
12 changed files with 323 additions and 52 deletions
@@ -0,0 +1,12 @@
import { IsArray, IsInt, IsNumber, IsOptional, ArrayMinSize } from 'class-validator';
export class BulkUpdateProductsDto {
@IsArray()
@ArrayMinSize(1)
@IsInt({ each: true })
ids: number[];
@IsOptional()
@IsNumber()
categoryId?: number | null;
}
+7 -1
View File
@@ -17,7 +17,7 @@ import { ProductsService } from './products.service';
import { MergeProductsDto } from './dto/merge-products.dto';
import { UpdateCanonicalNameDto } from './dto/update-canonical-name.dto';
import { SetTagsDto } from './dto/set-tags.dto';
import { UpsertNutritionDto } from './dto/upsert-nutrition.dto';
import { BulkUpdateProductsDto } from './dto/bulk-update-products.dto';
@Controller('products')
export class ProductsController {
@@ -116,4 +116,10 @@ export class ProductsController {
resetAll() {
return this.productsService.resetAll();
}
@Post('bulk-update')
@HttpCode(200)
bulkUpdate(@Body() body: BulkUpdateProductsDto) {
return this.productsService.bulkUpdate(body.ids, { categoryId: body.categoryId });
}
}
+10
View File
@@ -397,4 +397,14 @@ export class ProductsService {
]);
return { ok: true };
}
async bulkUpdate(ids: number[], data: { categoryId?: number | null }) {
const updateData: Record<string, any> = {};
if ('categoryId' in data) {
updateData.categoryId = data.categoryId;
}
if (Object.keys(updateData).length === 0) return { updated: 0 };
await this.prisma.product.updateMany({ where: { id: { in: ids } }, data: updateData });
return { updated: ids.length };
}
}