167 lines
5.1 KiB
TypeScript
167 lines
5.1 KiB
TypeScript
import { Request, Response } from 'express';
|
|
import db, { handlePrismaError } from '../../../handlers/db.js'; // Database
|
|
import log from '../../../handlers/log.js';
|
|
import { parseDynamicSortBy } from '../../../helpers/prisma_helpers.js';
|
|
import { schema_get, schema_post, schema_patch, schema_del } from './user_schema.js';
|
|
|
|
// MARK: GET user
|
|
async function get(req: Request, res: Response) {
|
|
const { error, value } = schema_get.validate(req.query);
|
|
if (error) {
|
|
log.api?.debug('GET user Error:', req.query, value, error.details[0].message);
|
|
res.status(400).json({ status: 'ERROR', errorcode: 'VALIDATION_ERROR', message: error.details[0].message });
|
|
} else {
|
|
log.api?.debug('GET user Success:', req.query, value);
|
|
|
|
if (value.search !== undefined || value.id !== undefined) {
|
|
// if search or get by id
|
|
await db
|
|
.$transaction([
|
|
// Same query for count and findMany
|
|
db.user.count({
|
|
where: {
|
|
OR: [{ id: value.id }, { name: { search: value.search } }]
|
|
},
|
|
orderBy: parseDynamicSortBy(value.sort.toString(), value.order.toString()),
|
|
skip: value.skip,
|
|
take: value.take
|
|
}),
|
|
db.user.findMany({
|
|
where: {
|
|
OR: [{ id: value.id }, { name: { search: value.search } }]
|
|
},
|
|
orderBy: parseDynamicSortBy(value.sort.toString(), value.order.toString()),
|
|
skip: value.skip,
|
|
take: value.take
|
|
})
|
|
])
|
|
.then(([count, result]) => {
|
|
if (result.length !== 0) {
|
|
result.forEach((element: { id: number; name: string; code: string | null | boolean }) => {
|
|
// code-> true if code is set
|
|
element.code = element.code !== '';
|
|
});
|
|
res.status(200).json({ count, result });
|
|
} else {
|
|
res.status(404).json({ status: 'ERROR', errorcode: 'NOT_FOUND', message: 'Could not find specified object' });
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
handlePrismaError(err, res, 'GET user');
|
|
});
|
|
} else {
|
|
// get all
|
|
await db
|
|
.$transaction([
|
|
// Same query for count and findMany
|
|
db.user.count({
|
|
orderBy: parseDynamicSortBy(value.sort.toString(), value.order.toString()),
|
|
skip: value.skip,
|
|
take: value.take
|
|
}),
|
|
db.user.findMany({
|
|
orderBy: parseDynamicSortBy(value.sort.toString(), value.order.toString()),
|
|
skip: value.skip,
|
|
take: value.take
|
|
})
|
|
])
|
|
.then(([count, result]) => {
|
|
if (result.length !== 0) {
|
|
result.forEach((element: { id: number; name: string; code: string | null | boolean }) => {
|
|
// code-> true if code is set
|
|
element.code = element.code !== '';
|
|
});
|
|
res.status(200).json({ count, result });
|
|
} else {
|
|
res.status(404).json({ status: 'ERROR', errorcode: 'NOT_FOUND', message: 'Could not find specified object' });
|
|
}
|
|
})
|
|
.catch((err) => {
|
|
handlePrismaError(err, res, 'GET user');
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: CREATE user
|
|
async function post(req: Request, res: Response) {
|
|
const { error, value } = schema_post.validate(req.body);
|
|
if (error) {
|
|
log.api?.debug('POST user Error:', req.body, value, error.details[0].message);
|
|
res.status(400).json({ status: 'ERROR', errorcode: 'VALIDATION_ERROR', message: error.details[0].message });
|
|
} else {
|
|
log.api?.debug('POST user Success:', req.body, value);
|
|
await db.user
|
|
.create({
|
|
data: {
|
|
name: value.name,
|
|
code: value.code === '0000' ? null : value.code
|
|
},
|
|
select: {
|
|
id: true
|
|
}
|
|
})
|
|
.then((result) => {
|
|
res.status(201).json({ status: 'CREATED', message: 'Successfully created user', id: result.id });
|
|
})
|
|
.catch((err) => {
|
|
handlePrismaError(err, res, 'POST user');
|
|
});
|
|
}
|
|
}
|
|
|
|
// MARK: UPDATE user
|
|
async function patch(req: Request, res: Response) {
|
|
const { error, value } = schema_patch.validate(req.body);
|
|
if (error) {
|
|
log.api?.debug('PATCH user Error:', req.body, value, error.details[0].message);
|
|
res.status(400).json({ status: 'ERROR', errorcode: 'VALIDATION_ERROR', message: error.details[0].message });
|
|
} else {
|
|
log.api?.debug('PATCH user Success:', req.body, value);
|
|
await db.user
|
|
.update({
|
|
where: {
|
|
id: value.id
|
|
},
|
|
data: {
|
|
name: value.name,
|
|
code: value.code === '0000' ? null : value.code
|
|
},
|
|
select: {
|
|
id: true
|
|
}
|
|
})
|
|
.then((result) => {
|
|
res.status(200).json({ status: 'UPDATED', message: 'Successfully updated user', id: result.id });
|
|
})
|
|
.catch((err) => {
|
|
handlePrismaError(err, res, 'PATCH user');
|
|
});
|
|
}
|
|
}
|
|
|
|
// MARK: DELETE user
|
|
async function del(req: Request, res: Response) {
|
|
const { error, value } = schema_del.validate(req.body);
|
|
if (error) {
|
|
log.api?.debug('DEL user Error:', req.body, value, error.details[0].message);
|
|
res.status(400).json({ status: 'ERROR', errorcode: 'VALIDATION_ERROR', message: error.details[0].message });
|
|
} else {
|
|
log.api?.debug('DEL user Success:', req.body, value);
|
|
await db.user
|
|
.delete({
|
|
where: {
|
|
id: value.id
|
|
}
|
|
})
|
|
.then((result) => {
|
|
res.status(200).json({ status: 'DELETED', message: 'Successfully deleted user', id: result.id });
|
|
})
|
|
.catch((err) => {
|
|
handlePrismaError(err, res, 'DEL user');
|
|
});
|
|
}
|
|
}
|
|
|
|
export default { get, post, patch, del };
|