diff --git a/03_source/cms_backend/src/app/services/AppLog.service.ts b/03_source/cms_backend/src/app/services/AppLog.service.ts index abc6956..ae22333 100644 --- a/03_source/cms_backend/src/app/services/AppLog.service.ts +++ b/03_source/cms_backend/src/app/services/AppLog.service.ts @@ -16,6 +16,7 @@ import prisma from '../lib/prisma'; type CreateAppLog = { level: number; message: string; + metadata: Record; }; // type UpdateAppLog = { @@ -31,6 +32,10 @@ async function getAppLog(appLogId: string) { return prisma.appLog.findFirst({ where: { id: appLogId } }); } +async function createAppLog(level: number, message: string, metadata: Record) { + return prisma.appLog.create({ data: { level, message, metadata } }); +} + async function createNewAppLog(createForm: CreateAppLog) { return prisma.appLog.create({ data: createForm }); } @@ -48,5 +53,6 @@ export { listAppLogs, // updateAppLog, deleteAppLog, + createAppLog, createNewAppLog, }; diff --git a/03_source/cms_backend/src/app/services/event.service.ts b/03_source/cms_backend/src/app/services/event.service.ts index 8c22679..2ede8a7 100644 --- a/03_source/cms_backend/src/app/services/event.service.ts +++ b/03_source/cms_backend/src/app/services/event.service.ts @@ -7,10 +7,6 @@ // - Follows same pattern as helloworld.service.ts // -import type { Event } from '@prisma/client'; - -import prisma from '../lib/prisma'; - type CreateEvent = { eventDate: DateTime; title: string; @@ -39,27 +35,33 @@ type UpdateEvent = { memberId?: number; }; -async function listEvents(): Promise { - return prisma.event.findMany(); -} +// async function listEvents(): Promise { +// return prisma.event.findMany(); +// } -async function getEvent(eventId: number) { - return prisma.event.findFirst({ where: { id: eventId } }); -} +// async function getEvent(eventId: number) { +// return prisma.event.findFirst({ where: { id: eventId } }); +// } -async function createNewEvent(createForm: CreateEvent) { - return prisma.event.create({ data: createForm }); -} +// async function createNewEvent(createForm: CreateEvent) { +// return prisma.event.create({ data: createForm }); +// } -async function updateEvent(eventId: number, updateForm: UpdateEvent) { - return prisma.event.update({ - where: { id: eventId }, - data: updateForm, - }); -} +// async function updateEvent(eventId: number, updateForm: UpdateEvent) { +// return prisma.event.update({ +// where: { id: eventId }, +// data: updateForm, +// }); +// } -async function deleteEvent(eventId: number) { - return prisma.event.delete({ where: { id: eventId } }); -} +// async function deleteEvent(eventId: number) { +// return prisma.event.delete({ where: { id: eventId } }); +// } -export { getEvent, listEvents, updateEvent, deleteEvent, createNewEvent }; +export { + listEvents, + // getEvent, + // updateEvent, + // deleteEvent, + // createNewEvent, +}; diff --git a/03_source/cms_backend/src/app/services/eventItem.service.ts b/03_source/cms_backend/src/app/services/eventItem.service.ts new file mode 100644 index 0000000..9476612 --- /dev/null +++ b/03_source/cms_backend/src/app/services/eventItem.service.ts @@ -0,0 +1,71 @@ +// src/app/services/event.service.ts +// +// PURPOSE: +// - Service for handling Event records +// +// RULES: +// - Follows same pattern as helloworld.service.ts +// + +import type { EventItem } from '@prisma/client'; + +import prisma from '../lib/prisma'; + +type CreateEvent = { + eventDate: DateTime; + title: string; + joinMembers?: Json[]; + price: number; + currency: string; + duration_m: number; + ageBottom: number; + ageTop: number; + location: string; + avatar?: string; + memberId?: number; +}; + +type UpdateEvent = { + eventDate?: DateTime; + title?: string; + joinMembers?: Json[]; + price?: number; + currency?: string; + duration_m?: number; + ageBottom?: number; + ageTop?: number; + location?: string; + avatar?: string; + memberId?: number; +}; + +async function listEvents(): Promise { + return prisma.eventItem.findMany(); +} + +async function getEvent(eventId: string): Promise { + return prisma.eventItem.findFirst({ where: { id: eventId } }); +} + +// async function createNewEvent(createForm: CreateEvent) { +// return prisma.event.create({ data: createForm }); +// } + +// async function updateEvent(eventId: number, updateForm: UpdateEvent) { +// return prisma.event.update({ +// where: { id: eventId }, +// data: updateForm, +// }); +// } + +// async function deleteEvent(eventId: number) { +// return prisma.event.delete({ where: { id: eventId } }); +// } + +export { + getEvent, + listEvents, + // updateEvent, + // deleteEvent, + // createNewEvent, +}; diff --git a/03_source/cms_backend/src/app/services/product.service.ts b/03_source/cms_backend/src/app/services/product.service.ts index c8b5967..b29c83f 100644 --- a/03_source/cms_backend/src/app/services/product.service.ts +++ b/03_source/cms_backend/src/app/services/product.service.ts @@ -68,7 +68,7 @@ async function listProducts(): Promise { return prisma.productItem.findMany(); } -async function getProduct(productId: string) { +async function getProduct(productId: string): Promise { return prisma.productItem.findUnique({ where: { id: productId } }); } diff --git a/03_source/cms_backend/src/app/services/user.service.ts b/03_source/cms_backend/src/app/services/user.service.ts new file mode 100644 index 0000000..6dbf675 --- /dev/null +++ b/03_source/cms_backend/src/app/services/user.service.ts @@ -0,0 +1,127 @@ +// src/app/services/user.service.ts +// +// PURPOSE: +// - Handle User Record CRUD operations +// +// RULES: +// - Follow Prisma best practices for database operations +// - Validate input data before processing +// + +import type { User } from '@prisma/client'; + +import prisma from '../lib/prisma'; + +type CreateUser = { + email: string; + // name?: string; + // password: string; + // role?: Role; + // isEmailVerified?: boolean; + // admin?: boolean; +}; + +type UpdateUser = { + email?: string; + // name?: string; + // password?: string; + // role?: Role; + // isEmailVerified?: boolean; + isAdmin?: boolean; +}; + +// async function listUsers(): Promise { +// return prisma.userItem.findMany(); +// } + +// async function getUserItem(userId: string): Promise { +// return prisma.userItem.findFirst({ where: { id: userId } }); +// } + +// async function updateUser(userId: string, updateForm: UpdateUser): Promise { +// return prisma.userItem.update({ +// where: { id: userId }, +// data: updateForm, +// }); +// } + +// // check if userId is a admin +// // check if userId is a admin +// async function isAdmin(userId: string): Promise { +// const user = await getUserItem(userId); +// return user?.isAdmin === true; +// } + +// async function changeToAdmin(userIdToPromote: string, userIdOfApplicant: string) { +// // check the applicant is admin or not +// const userApplicant = await getUserItem(userIdOfApplicant); +// let promoteResult = {}; + +// if (userApplicant && userApplicant.isAdmin) { +// // applicant is an admin +// promoteResult = await updateUser(userIdToPromote, { isAdmin: true }); +// } else { +// promoteResult = { status: 'failed', message: 'applicant is not a admin' }; +// } + +// return promoteResult; +// } + +// async function changeToUser(userIdToPromote: string, userIdOfApplicant: string) { +// // check the applicant is admin or not +// const userApplicant = await getUserItem(userIdOfApplicant); +// let promoteResult = {}; + +// if (userApplicant && userApplicant.isAdmin) { +// // applicant is an admin +// promoteResult = await updateUser(userIdToPromote, { isAdmin: false }); +// } else { +// promoteResult = { status: 'failed', message: 'applicant is not a admin' }; +// } + +// return promoteResult; +// } + +async function getUserById(id: string): Promise { + return prisma.user.findFirst({ where: { id } }); +} + +// async function getUserByEmail(email: string): Promise { +// // return prisma.userItem.findUnique({ +// // where: { email }, +// // include: { +// // Token: true, +// // }, +// // }); +// } + +// async function createNewUser(createForm: CreateUser): Promise { +// // return prisma.userItem.create({ +// // data: { +// // email: createForm.email, +// // name: createForm.name, +// // password: createForm.password, +// // role: createForm.role || 'USER', +// // isEmailVerified: createForm.isEmailVerified || false, +// // }, +// // }); +// } + +// async function deleteUser(userId: number): Promise { +// // return prisma.userItem.delete({ where: { id: userId } }); +// } + +export { + // getUser, + getUserById, + // isAdmin, + // listUsers, + // updateUser, + // deleteUser, + // changeToUser, + // createNewUser, + // changeToAdmin, + // getUserByEmail, + // type CreateUser, + // type UpdateUser, +}; diff --git a/03_source/cms_backend/src/app/services/userItem.service.ts b/03_source/cms_backend/src/app/services/userItem.service.ts index 8b9cadc..95c7c0e 100644 --- a/03_source/cms_backend/src/app/services/userItem.service.ts +++ b/03_source/cms_backend/src/app/services/userItem.service.ts @@ -82,6 +82,10 @@ async function changeToUser(userIdToPromote: string, userIdOfApplicant: string) return promoteResult; } +async function getUserById1(id: string): Promise { + return prisma.userItem.findFirst({ where: { id } }); +} + async function getUserByEmail(email: string): Promise { // return prisma.userItem.findUnique({ // where: { email }, @@ -113,6 +117,7 @@ export { listUsers, updateUser, deleteUser, + getUserById, changeToUser, createNewUser, changeToAdmin,