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 { 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;
}
}

View File

@@ -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
);
}

View File

@@ -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<typeof createViewInput>;
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(
{
createViewInput,
updateViewInput,
pageQueryParams,
setDefaultView,
},
{ $id: "view" }
);

View File

@@ -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 }
);
}