133 lines
4.5 KiB
TypeScript
Executable File
133 lines
4.5 KiB
TypeScript
Executable File
import type { HttpContext } from '@adonisjs/core/http'
|
|
import RestaurantMenuItem from '#models/restaurant_menu_item'
|
|
import RestaurantMenu from '#models/restaurant_menu'
|
|
import logger from '@adonisjs/core/services/logger'
|
|
import { menuItemValidator } from '#validators/menu'
|
|
|
|
export default class RestaurantMenuItemsController {
|
|
/**
|
|
* Retrieve all restaurant menu items.
|
|
*
|
|
* @returns An array of all restaurant menu items.
|
|
*/
|
|
async getAll() {
|
|
const items = await RestaurantMenuItem.query().preload('category').preload('menus')
|
|
return items
|
|
}
|
|
|
|
/**
|
|
* Retrieve a single restaurant menu item.
|
|
*
|
|
* @param request - The HTTP context containing the request data.
|
|
* @returns The restaurant menu item with the specified id.
|
|
*/
|
|
|
|
async getOne({ request }: HttpContext) {
|
|
try {
|
|
const id = request.body().id
|
|
const item = await RestaurantMenuItem.query()
|
|
.where('id', id)
|
|
.preload('category')
|
|
.preload('menus')
|
|
.first()
|
|
return item
|
|
} catch (error) {
|
|
logger.error('Menu item retrieval failed: %s', error)
|
|
}
|
|
}
|
|
|
|
// The following methods require authentication. Log user activity.
|
|
|
|
/**
|
|
* Create a restaurant menu item.
|
|
*
|
|
* @bodyParam *name* - string | The name of the menu item.
|
|
* @bodyParam *priceSmall* - number | The price of the small serving of the menu item.
|
|
* @bodyParam *priceLarge* - number | The price of the large serving of the menu item.
|
|
* @bodyParam *description* - string | The description of the menu item.
|
|
* @bodyParam *menu_id* - number | The menu id of the menu item.
|
|
* @returns The created menu item.
|
|
*/
|
|
async create({ request, auth }: HttpContext) {
|
|
const data = await request.validateUsing(menuItemValidator)
|
|
try {
|
|
const item = await RestaurantMenuItem.create(data)
|
|
logger.info('Menu item created: %s by %s', item.name, auth.getUserOrFail().email)
|
|
return item
|
|
} catch (error) {
|
|
logger.error('Menu item creation failed: %s', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update a restaurant menu item.
|
|
*
|
|
* @bodyParam *id* - number | The id of the menu item to update.
|
|
* @bodyParam *name* - string | The new name of the menu item.
|
|
* @bodyParam *priceSmall* - number | The new price of the small size of the menu item.
|
|
* @bodyParam *priceLarge* - number | The new price of the large size of the menu item.
|
|
* @bodyParam *description* - string | The new description of the menu item.
|
|
* @bodyParam *menu_id* - number | The new menu id of the menu item.
|
|
*/
|
|
async update({ request, auth }: HttpContext) {
|
|
const data = request.body()
|
|
try {
|
|
const item = await RestaurantMenuItem.find(data.id)
|
|
item?.merge(data)
|
|
await item?.save()
|
|
logger.info('Menu item updated: %s by %s', item?.name, auth.getUserOrFail().email)
|
|
} catch (error) {
|
|
logger.error('Menu item update failed: %s', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Delete a restaurant menu item.
|
|
*
|
|
* @bodyParam *id* - number | The id of the menu item to delete.
|
|
*/
|
|
async delete({ request, auth, response }: HttpContext) {
|
|
const id = request.body().id
|
|
try {
|
|
const item = await RestaurantMenuItem.find(id)
|
|
if (!item) {
|
|
return response.notFound({ message: 'Menu item not found' })
|
|
}
|
|
// Detach from all menus first
|
|
await item.related('menus').detach()
|
|
await item.delete()
|
|
logger.info('Menu item deleted: %s by %s', item.name, auth.getUserOrFail().email)
|
|
return response.ok({ message: 'Menu item deleted' })
|
|
} catch (error) {
|
|
logger.error('Menu item deletion failed: %s', error)
|
|
return response.internalServerError({ message: 'Menu item deletion failed' })
|
|
}
|
|
}
|
|
|
|
// This method connects the menu item to a menu.
|
|
|
|
/**
|
|
* Connect a restaurant menu item to a restaurant menu.
|
|
*
|
|
* @bodyParam *item_id* - number | The id of the menu item to connect.
|
|
* @bodyParam *menu_id* - number | The id of the menu to connect the menu item to.
|
|
*/
|
|
async connectToMenu({ request, response }: HttpContext) {
|
|
const data = request.body()
|
|
try {
|
|
const item = await RestaurantMenuItem.find(data.item_id)
|
|
const menu = await RestaurantMenu.find(data.menu_id)
|
|
|
|
if (!item || !menu) {
|
|
return response.notFound({ message: 'Menu or Item not found' })
|
|
}
|
|
|
|
await item.related('menus').attach([menu.id])
|
|
return response.ok({ message: 'Menu item connected to menu' })
|
|
} catch (error) {
|
|
logger.error('Menu item connection failed: %s', error)
|
|
return response.internalServerError({ message: 'Menu item connection failed' })
|
|
}
|
|
}
|
|
}
|