diff --git a/03_source/cms_backend/prisma/schema.prisma b/03_source/cms_backend/prisma/schema.prisma index 5bf02d3..fa8dad9 100644 --- a/03_source/cms_backend/prisma/schema.prisma +++ b/03_source/cms_backend/prisma/schema.prisma @@ -1291,4 +1291,5 @@ model PartyUser { zipCode String @default("") // rank String @default("user") + sex String @default("") } diff --git a/03_source/cms_backend/prisma/seeds/partyUser.ts b/03_source/cms_backend/prisma/seeds/partyUser.ts index fb740ed..6de0f58 100644 --- a/03_source/cms_backend/prisma/seeds/partyUser.ts +++ b/03_source/cms_backend/prisma/seeds/partyUser.ts @@ -58,6 +58,7 @@ async function partyUser() { status: STATUS[0], role: ROLE[0], isVerified: true, + sex: 'F', }, }); @@ -78,6 +79,7 @@ async function partyUser() { isVerified: true, avatarUrl: 'https://images.unsplash.com/photo-1619970096024-c7b438a3b82a', rank: 'user', + sex: 'M', }, }); @@ -112,6 +114,7 @@ async function partyUser() { role: ROLE[Math.floor(Math.random() * ROLE.length)], status: STATUS[Math.floor(Math.random() * STATUS.length)], isVerified: true, + sex: i % 2 ? 'F' : 'M', }, }); } diff --git a/03_source/cms_backend/src/app/api/event/partyUserJoinEvent/route.ts b/03_source/cms_backend/src/app/api/event/partyUserJoinEvent/route.ts new file mode 100644 index 0000000..dea3c06 --- /dev/null +++ b/03_source/cms_backend/src/app/api/event/partyUserJoinEvent/route.ts @@ -0,0 +1,58 @@ +// src/app/api/product/createEvent/route.ts +// +// PURPOSE: +// create product to db +// +// RULES: +// T.B.A. +// + +import type { NextRequest } from 'next/server'; + +import _ from 'lodash'; + +import { STATUS, response, handleError } from 'src/utils/response'; + +import { getEventItemById } from 'src/app/services/eventItem.service'; +import { getPartyUserByEmail } from 'src/app/services/party-user.service'; + +// ---------------------------------------------------------------------- + +/** + *************************************** + * POST - Events + *************************************** + */ +export async function POST(req: NextRequest) { + // logger('[Event] list', events.length); + const { data } = await req.json(); + const { eventItemId, email } = data; + + try { + const eventItem = await getEventItemById(eventItemId); + const partyUser = await getPartyUserByEmail(email); + + if (partyUser) { + if (eventItem && eventItem?.joinMembers) { + const foundJoined = _.find(eventItem.joinMembers, { email }); + + if (foundJoined) { + console.log('user joined event already, skipping'); + } else { + const { sex } = partyUser; + eventItem.joinMembers.push({ email, sex }); + + await prisma?.eventItem.update({ + where: { id: eventItem.id }, + data: { joinMembers: JSON.parse(JSON.stringify(eventItem.joinMembers)) }, + }); + } + } + } + + return response({ result: 'joined' }, STATUS.OK); + } catch (error) { + console.log({ hello: 'world', data }); + return handleError('Event - Create', error); + } +} diff --git a/03_source/cms_backend/src/app/api/event/partyUserJoinEvent/test.http b/03_source/cms_backend/src/app/api/event/partyUserJoinEvent/test.http new file mode 100644 index 0000000..cfd5099 --- /dev/null +++ b/03_source/cms_backend/src/app/api/event/partyUserJoinEvent/test.http @@ -0,0 +1,13 @@ +### + +# username and password ok + +POST http://localhost:7272/api/event/partyUserJoinEvent +content-type: application/json + +{ + "data": { + "eventItemId": "e99f09a7-dd88-49d5-b1c8-1daf80c2d7b01", + "email": "alice@prisma.io" + } +} diff --git a/03_source/cms_backend/src/app/services/eventItem.service.ts b/03_source/cms_backend/src/app/services/eventItem.service.ts index cf87b36..61f067c 100644 --- a/03_source/cms_backend/src/app/services/eventItem.service.ts +++ b/03_source/cms_backend/src/app/services/eventItem.service.ts @@ -47,6 +47,10 @@ async function getEvent(eventId: string): Promise { return prisma.eventItem.findFirst({ where: { id: eventId } }); } +async function getEventItemById(eventId: string): Promise { + return prisma.eventItem.findFirst({ where: { id: eventId } }); +} + // async function createNewEvent(createForm: CreateEvent) { // return prisma.event.create({ data: createForm }); // } @@ -68,4 +72,5 @@ export { // updateEvent, // deleteEvent, // createNewEvent, + getEventItemById, }; diff --git a/03_source/cms_backend/src/app/services/party-user.service.ts b/03_source/cms_backend/src/app/services/party-user.service.ts index e6d1af1..db34e33 100644 --- a/03_source/cms_backend/src/app/services/party-user.service.ts +++ b/03_source/cms_backend/src/app/services/party-user.service.ts @@ -41,6 +41,12 @@ async function getPartyUser(partyUserId: string): Promise { }); } +async function getPartyUserByEmail(email: string): Promise { + return prisma.partyUser.findUnique({ + where: { email }, + }); +} + async function getUserById(id: string): Promise { return prisma.user.findFirst({ where: { id } }); } @@ -70,6 +76,8 @@ export { updatePartyUser, deletePartyUser, // + getPartyUserByEmail, + // type CreateUser, type UpdateUser, // diff --git a/03_source/mobile/src/pages/EventDetail/index.tsx b/03_source/mobile/src/pages/EventDetail/index.tsx index efc740a..a56ef27 100644 --- a/03_source/mobile/src/pages/EventDetail/index.tsx +++ b/03_source/mobile/src/pages/EventDetail/index.tsx @@ -73,7 +73,7 @@ interface StateProps {} interface DispatchProps {} -interface EventDetailProps extends OwnProps, StateProps, DispatchProps {} +interface PageProps extends OwnProps, StateProps, DispatchProps {} const showJoinedMembers = (joinMembers: Record[]) => { const avatars = joinMembers.map((jm) => jm.avatar); @@ -90,7 +90,7 @@ const showJoinedMembers = (joinMembers: Record[]) => { ); }; -const EventDetail: React.FC = ({ event_detail }) => { +const EventDetail: React.FC = ({ event_detail }) => { const router = useIonRouter(); const [showPopover, setShowPopover] = useState(false);