diff --git a/src/view/view.controller.ts b/src/view/view.controller.ts index 4f81ca3..fb857e4 100644 --- a/src/view/view.controller.ts +++ b/src/view/view.controller.ts @@ -1,13 +1,19 @@ -import { FastifyReply, FastifyRequest } from 'fastify'; -import { CreateViewInput, UpdateViewInput } from './view.schema'; +import { FastifyReply, FastifyRequest } from "fastify"; +import { + CreateViewInput, + SetDefaultView, + UpdateViewInput, +} from "./view.schema"; import { createView, deleteView, + getDefaultViews, getView, listViews, + updateDefaultView, updateView, -} from './view.service'; -import { PageQueryParams } from '../pagination'; +} from "./view.service"; +import { PageQueryParams } from "../pagination"; export async function createViewHandler( req: FastifyRequest, @@ -29,7 +35,7 @@ export async function getViewHandler(req: FastifyRequest, res: FastifyReply) { try { const view = await getView(viewId, req.user.tenantId); if (view === null) - return res.code(404).send({ error: 'resource not found' }); + return res.code(404).send({ error: "resource not found" }); return res.code(200).send(view); } catch (err) { @@ -58,7 +64,7 @@ export async function updateViewHandler( try { const updatedView = await updateView(viewId, input, req.user.tenantId); if (!updatedView) - return res.code(404).send({ error: 'resource not found' }); + return res.code(404).send({ error: "resource not found" }); return res.code(200).send(updateView); } catch (err) { @@ -75,10 +81,36 @@ export async function deleteViewHandler( try { const deleteResult = await deleteView(viewId); if (deleteResult.deletedCount == 0) - return res.code(404).send({ error: 'resource not found' }); + return res.code(404).send({ error: "resource not found" }); return res.code(204).send(); } catch (err) { return err; } } + +export async function getDefaultViewsHanlder( + req: FastifyRequest, + res: FastifyReply +) { + try { + const recInDb = await getDefaultViews(req.user); + return res.code(200).send(recInDb); + } catch (err) { + return err; + } +} + +export async function updateDefaultViewsHanlder( + req: FastifyRequest, + res: FastifyReply +) { + const input = req.body as SetDefaultView; + + try { + const recInDb = await updateDefaultView(input, req.user); + return res.code(200).send({ ...recInDb.defaultViews }); + } catch (err) { + return err; + } +} diff --git a/src/view/view.route.ts b/src/view/view.route.ts index bcd70d9..d4455c0 100644 --- a/src/view/view.route.ts +++ b/src/view/view.route.ts @@ -2,8 +2,10 @@ import { FastifyInstance } from "fastify"; import { createViewHandler, deleteViewHandler, + getDefaultViewsHanlder, getViewHandler, listViewHandler, + updateDefaultViewsHanlder, updateViewHandler, } from "./view.controller"; import { $view } from "./view.schema"; @@ -84,4 +86,25 @@ export async function viewRoutes(fastify: FastifyInstance) { }, deleteViewHandler ); + + fastify.get( + "/defaultViews", + { + config: { requiredClaims: ["view:delete"] }, + preHandler: [fastify.authorize], + }, + getDefaultViewsHanlder + ); + + fastify.patch( + "/defaultViews", + { + schema: { + body: $view("setDefaultView"), + }, + config: { requiredClaims: ["view:delete"] }, + preHandler: [fastify.authorize], + }, + updateDefaultViewsHanlder + ); } diff --git a/src/view/view.schema.ts b/src/view/view.schema.ts index 1ce0306..f6afd76 100644 --- a/src/view/view.schema.ts +++ b/src/view/view.schema.ts @@ -1,6 +1,6 @@ import { buildJsonSchemas } from "fastify-zod"; import mongoose from "mongoose"; -import { z } from "zod"; +import { TypeOf, z } from "zod"; import { pageQueryParams } from "../pagination"; export const viewModel = mongoose.model( @@ -54,11 +54,28 @@ const updateViewInput = z.object({ export type CreateViewInput = z.infer; export type UpdateViewInput = z.infer; +export const defaultViewModel = mongoose.model( + "defaultView", + new mongoose.Schema({ + userId: { + type: mongoose.Types.ObjectId, + ref: "user", + }, + defaultViews: Object, + }), + "defaultView" +); + +const setDefaultView = z.record(z.string(), z.string()); + +export type SetDefaultView = z.infer; + export const { schemas: viewSchemas, $ref: $view } = buildJsonSchemas( { createViewInput, updateViewInput, pageQueryParams, + setDefaultView, }, { $id: "view" } ); diff --git a/src/view/view.service.ts b/src/view/view.service.ts index 9c40e97..d08e45f 100644 --- a/src/view/view.service.ts +++ b/src/view/view.service.ts @@ -3,6 +3,8 @@ import { getFilterObject, getSortObject, PageQueryParams } from "../pagination"; import { generateId } from "../utils/id"; import { CreateViewInput, + defaultViewModel, + SetDefaultView, UpdateViewInput, viewFields, viewModel, @@ -30,9 +32,6 @@ export async function listViews( params: PageQueryParams, user: AuthenticatedUser ) { - const page = params.page || 1; - const pageSize = params.pageSize || 10; - const sortObj = getSortObject(params, viewFields); const filterObj = getFilterObject(params) || []; return await viewModel.find({ @@ -59,3 +58,29 @@ export async function updateView( export async function deleteView(viewId: string) { return await viewModel.deleteOne({ pid: viewId }); } + +export async function getDefaultViews(user: AuthenticatedUser) { + const recInDb = await defaultViewModel.findOne({ userId: user.userId }); + if (!recInDb) return {}; + + return recInDb.defaultViews; +} + +export async function updateDefaultView( + input: SetDefaultView, + user: AuthenticatedUser +) { + const recInDb = await defaultViewModel.findOne({ userId: user.userId }); + if (!recInDb) { + return await defaultViewModel.create({ + defaultViews: input, + userId: user.userId, + }); + } + + return await defaultViewModel.findOneAndUpdate( + { userId: user.userId }, + { ...input }, + { new: true } + ); +}