diff --git a/pages/api/member/[member_id].ts b/pages/api/member/[member_id].ts new file mode 100644 index 0000000..5600eba --- /dev/null +++ b/pages/api/member/[member_id].ts @@ -0,0 +1,66 @@ +import { withIronSessionApiRoute } from 'iron-session/next'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { IMember, Member, MemberDocument } from '../../../src/models/Member'; +import { ResponseData } from '../../../src/types/index'; +import { ironOptions } from '../../../src/util/ironConfig'; +import { isValidObjectId } from 'mongoose'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; +import { Authentication } from '../../../src/auth/auth'; +import { AuthorityLevel } from '../../../src/models/Admin'; + +export default withIronSessionApiRoute(async function createMember( + req: Omit & { body: IMember; } & { query: { member_id?: string; }; }, + res: NextApiResponse>, +): Promise { + switch (req.method) { + case 'GET': { + if (!isValidObjectId(req.query.member_id)) { + res.status(StatusCodes.BAD_REQUEST).json({ + error: true, + message: getReasonPhrase(StatusCodes.BAD_REQUEST), + data: null, + }); + + return; + } + + const member = await Member.findById(req.query.member_id); + + if (!member) { + res.status(StatusCodes.NOT_FOUND).json({ + error: true, + message: getReasonPhrase(StatusCodes.NOT_FOUND), + data: null, + }); + + return; + } + + res.status(StatusCodes.OK).json({ + error: false, + message: getReasonPhrase(StatusCodes.OK), + data: member, + }); + } break; + + case 'POST': { + if (!Authentication.authenticate(AuthorityLevel.ADMIN, req)) { + res.status(StatusCodes.FORBIDDEN).json({ + error: true, + message: getReasonPhrase(StatusCodes.FORBIDDEN), + data: null, + }); + + return; + } + + const member = await Member.create(req.body); + + res.status(StatusCodes.CREATED).json({ + error: false, + message: getReasonPhrase(StatusCodes.CREATED), + data: member, + }); + } break; + } +}, ironOptions); \ No newline at end of file diff --git a/pages/api/member/index.ts b/pages/api/member/index.ts new file mode 100644 index 0000000..8a7bd19 --- /dev/null +++ b/pages/api/member/index.ts @@ -0,0 +1,47 @@ +import { withIronSessionApiRoute } from 'iron-session/next'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { IMember, Member, MemberDocument } from '../../../src/models/Member'; +import { ResponseData } from '../../../src/types/index'; +import { ironOptions } from '../../../src/util/ironConfig'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; +import { Authentication } from '../../../src/auth/auth'; +import { AuthorityLevel } from '../../../src/models/Admin'; + +export default withIronSessionApiRoute(async function createMember( + req: Omit & { body: IMember; } & { query: { member_id?: string; }; }, + res: NextApiResponse>, +): Promise { + switch (req.method) { + case 'POST': { + if (!Authentication.authenticate(AuthorityLevel.ADMIN, req)) { + res.status(StatusCodes.FORBIDDEN).json({ + error: true, + message: getReasonPhrase(StatusCodes.FORBIDDEN), + data: null, + }); + + return; + } + + const member = new Member(req.body); + + try { + await member.save(); + + res.status(StatusCodes.CREATED).json({ + error: false, + message: getReasonPhrase(StatusCodes.CREATED), + data: member, + }); + } catch (e) { + console.error(e); + + res.status(StatusCodes.BAD_REQUEST).json({ + error: true, + message: getReasonPhrase(StatusCodes.BAD_REQUEST), + data: null, + }); + } + } break; + } +}, ironOptions); \ No newline at end of file diff --git a/pages/api/stripe/customer.ts b/pages/api/stripe/customer.ts index 0b5ad93..9d217ae 100644 --- a/pages/api/stripe/customer.ts +++ b/pages/api/stripe/customer.ts @@ -27,6 +27,7 @@ export default async function customerHandler( switch (req.method) { case 'POST': { const { customer } = req.body.customer; + console.log(customer); if (!customer.payment_intent || !customer.email || !customer.name || !customer.name.match(/^[a-zA-Z]+\s[a-zA-Z]+\s?$/)) { res.status(StatusCodes.BAD_REQUEST).json({ diff --git a/src/models/Member.ts b/src/models/Member.ts new file mode 100644 index 0000000..7039ecb --- /dev/null +++ b/src/models/Member.ts @@ -0,0 +1,27 @@ +import { default as mongoose, HydratedDocument, Model, Schema } from 'mongoose'; + +export interface IMember { + name: string; + email: string; + paymentMethod: string; + memberNumber: string; + idc: string; + indeks: string; +} + +export type MemberDocument = HydratedDocument; + +export type MemberModel = Model; + +export const memberSchema = new Schema({ + name: { type: Schema.Types.String, required: true }, + email: { type: Schema.Types.String, required: true }, + paymentMethod: { type: Schema.Types.String, required: true }, + memberNumber: { type: Schema.Types.String, required: true }, + idc: { type: Schema.Types.String, required: true }, + indeks: { type: Schema.Types.String, required: true }, +}, { + collection: 'members', +}); + +export const Member = mongoose.models.Member as MemberModel || mongoose.model('Member', memberSchema); \ No newline at end of file