added default views routes

This commit is contained in:
2025-05-20 16:30:02 +05:30
parent 690f8c71de
commit f0593fd928
4 changed files with 108 additions and 11 deletions

View File

@@ -1,13 +1,19 @@
import { FastifyReply, FastifyRequest } from 'fastify'; import { FastifyReply, FastifyRequest } from "fastify";
import { CreateViewInput, UpdateViewInput } from './view.schema'; import {
CreateViewInput,
SetDefaultView,
UpdateViewInput,
} from "./view.schema";
import { import {
createView, createView,
deleteView, deleteView,
getDefaultViews,
getView, getView,
listViews, listViews,
updateDefaultView,
updateView, updateView,
} from './view.service'; } from "./view.service";
import { PageQueryParams } from '../pagination'; import { PageQueryParams } from "../pagination";
export async function createViewHandler( export async function createViewHandler(
req: FastifyRequest, req: FastifyRequest,
@@ -29,7 +35,7 @@ export async function getViewHandler(req: FastifyRequest, res: FastifyReply) {
try { try {
const view = await getView(viewId, req.user.tenantId); const view = await getView(viewId, req.user.tenantId);
if (view === null) 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); return res.code(200).send(view);
} catch (err) { } catch (err) {
@@ -58,7 +64,7 @@ export async function updateViewHandler(
try { try {
const updatedView = await updateView(viewId, input, req.user.tenantId); const updatedView = await updateView(viewId, input, req.user.tenantId);
if (!updatedView) 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); return res.code(200).send(updateView);
} catch (err) { } catch (err) {
@@ -75,10 +81,36 @@ export async function deleteViewHandler(
try { try {
const deleteResult = await deleteView(viewId); const deleteResult = await deleteView(viewId);
if (deleteResult.deletedCount == 0) 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(); return res.code(204).send();
} catch (err) { } catch (err) {
return 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;
}
}

View File

@@ -2,8 +2,10 @@ import { FastifyInstance } from "fastify";
import { import {
createViewHandler, createViewHandler,
deleteViewHandler, deleteViewHandler,
getDefaultViewsHanlder,
getViewHandler, getViewHandler,
listViewHandler, listViewHandler,
updateDefaultViewsHanlder,
updateViewHandler, updateViewHandler,
} from "./view.controller"; } from "./view.controller";
import { $view } from "./view.schema"; import { $view } from "./view.schema";
@@ -84,4 +86,25 @@ export async function viewRoutes(fastify: FastifyInstance) {
}, },
deleteViewHandler 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
);
} }

View File

@@ -1,6 +1,6 @@
import { buildJsonSchemas } from "fastify-zod"; import { buildJsonSchemas } from "fastify-zod";
import mongoose from "mongoose"; import mongoose from "mongoose";
import { z } from "zod"; import { TypeOf, z } from "zod";
import { pageQueryParams } from "../pagination"; import { pageQueryParams } from "../pagination";
export const viewModel = mongoose.model( export const viewModel = mongoose.model(
@@ -54,11 +54,28 @@ const updateViewInput = z.object({
export type CreateViewInput = z.infer<typeof createViewInput>; export type CreateViewInput = z.infer<typeof createViewInput>;
export type UpdateViewInput = z.infer<typeof updateViewInput>; export type UpdateViewInput = z.infer<typeof updateViewInput>;
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<typeof setDefaultView>;
export const { schemas: viewSchemas, $ref: $view } = buildJsonSchemas( export const { schemas: viewSchemas, $ref: $view } = buildJsonSchemas(
{ {
createViewInput, createViewInput,
updateViewInput, updateViewInput,
pageQueryParams, pageQueryParams,
setDefaultView,
}, },
{ $id: "view" } { $id: "view" }
); );

View File

@@ -3,6 +3,8 @@ import { getFilterObject, getSortObject, PageQueryParams } from "../pagination";
import { generateId } from "../utils/id"; import { generateId } from "../utils/id";
import { import {
CreateViewInput, CreateViewInput,
defaultViewModel,
SetDefaultView,
UpdateViewInput, UpdateViewInput,
viewFields, viewFields,
viewModel, viewModel,
@@ -30,9 +32,6 @@ export async function listViews(
params: PageQueryParams, params: PageQueryParams,
user: AuthenticatedUser user: AuthenticatedUser
) { ) {
const page = params.page || 1;
const pageSize = params.pageSize || 10;
const sortObj = getSortObject(params, viewFields);
const filterObj = getFilterObject(params) || []; const filterObj = getFilterObject(params) || [];
return await viewModel.find({ return await viewModel.find({
@@ -59,3 +58,29 @@ export async function updateView(
export async function deleteView(viewId: string) { export async function deleteView(viewId: string) {
return await viewModel.deleteOne({ pid: viewId }); 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 }
);
}