mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-31 02:03:35 -04:00 
			
		
		
		
	* update naming * refactor tests to use shared structure * shorten names * add tools test case * refactor to support multi-tenant * set group_id on creation * initial refactor for multitenant tags/cats * spelling * additional test case for same valued resources * fix recipe update tests * apply indexes to foreign keys * fix performance regressions * handle unknown exception * utility decorator for function debugging * migrate recipe_id to UUID * GUID for recipes * remove unused import * move image functions into package * move utilities to packages dir * update import * linter * image image and asset routes * update assets and images to use UUIDs * fix migration base * image asset test coverage * use ids for categories and tag crud functions * refactor recipe organizer test suite to reduce duplication * add uuid serlization utility * organizer base router * slug routes testing and fixes * fix postgres error * adopt UUIDs * move tags, categories, and tools under "organizers" umbrella * update composite label * generate ts types * fix import error * update frontend types * fix type errors * fix postgres errors * fix #978 * add null check for title validation * add note in docs on multi-tenancy
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { BaseCRUDAPI } from "../_base";
 | |
| import { ApiRequestInstance } from "~/types/api";
 | |
| import {
 | |
|   ShoppingListCreate,
 | |
|   ShoppingListItemCreate,
 | |
|   ShoppingListItemOut,
 | |
|   ShoppingListOut,
 | |
| } from "~/types/api-types/group";
 | |
| 
 | |
| const prefix = "/api";
 | |
| 
 | |
| const routes = {
 | |
|   shoppingLists: `${prefix}/groups/shopping/lists`,
 | |
|   shoppingListsId: (id: string) => `${prefix}/groups/shopping/lists/${id}`,
 | |
|   shoppingListIdAddRecipe: (id: string, recipeId: string) => `${prefix}/groups/shopping/lists/${id}/recipe/${recipeId}`,
 | |
| 
 | |
|   shoppingListItems: `${prefix}/groups/shopping/items`,
 | |
|   shoppingListItemsId: (id: string) => `${prefix}/groups/shopping/items/${id}`,
 | |
| };
 | |
| 
 | |
| export class ShoppingListsApi extends BaseCRUDAPI<ShoppingListOut, ShoppingListCreate> {
 | |
|   baseRoute = routes.shoppingLists;
 | |
|   itemRoute = routes.shoppingListsId;
 | |
| 
 | |
|   async addRecipe(itemId: string, recipeId: string) {
 | |
|     return await this.requests.post(routes.shoppingListIdAddRecipe(itemId, recipeId), {});
 | |
|   }
 | |
| 
 | |
|   async removeRecipe(itemId: string, recipeId: string) {
 | |
|     return await this.requests.delete(routes.shoppingListIdAddRecipe(itemId, recipeId));
 | |
|   }
 | |
| }
 | |
| 
 | |
| export class ShoppingListItemsApi extends BaseCRUDAPI<ShoppingListItemOut, ShoppingListItemCreate> {
 | |
|   baseRoute = routes.shoppingListItems;
 | |
|   itemRoute = routes.shoppingListItemsId;
 | |
| 
 | |
|   async updateMany(items: ShoppingListItemOut[]) {
 | |
|     return await this.requests.put(routes.shoppingListItems, items);
 | |
|   }
 | |
| 
 | |
|   async deleteMany(items: ShoppingListItemOut[]) {
 | |
|     let query = "?";
 | |
| 
 | |
|     items.forEach((item) => {
 | |
|       query += `ids=${item.id}&`;
 | |
|     });
 | |
| 
 | |
|     return await this.requests.delete(routes.shoppingListItems + query);
 | |
|   }
 | |
| }
 | |
| 
 | |
| export class ShoppingApi {
 | |
|   public lists: ShoppingListsApi;
 | |
|   public items: ShoppingListItemsApi;
 | |
| 
 | |
|   constructor(requests: ApiRequestInstance) {
 | |
|     this.lists = new ShoppingListsApi(requests);
 | |
|     this.items = new ShoppingListItemsApi(requests);
 | |
|   }
 | |
| }
 |