diff --git a/src/controllers/message.ts b/src/controllers/message.ts new file mode 100644 index 00000000..a732f361 --- /dev/null +++ b/src/controllers/message.ts @@ -0,0 +1,43 @@ +import { Body, Controller, Delete, Get, Post, Put,Flow,CurrentUser,State } from 'amala' +import { DocumentType } from '@typegoose/typegoose' +import checkAuth from '@/middlewares/checkAuth' +import { Message, MessageModel } from '@/models/Message' +import { User } from '@/models/User' + + +@Controller('/messages') +@Flow([checkAuth]) +export default class MessageController { + @Post('/') + createMessage( + @CurrentUser() user: User, + @Body({ required: true }) { body }: { body: string } + ) { + return MessageModel.create({ body, user}) + } + + @Get('/') + getMessages( @CurrentUser() user: User,) { + return MessageModel.find({user}) + } + + @Get('/:id') + getMessage(@State('message') message: Message) { + return message + } + + @Put('/:id') + updateMessage( + @State('message') message: DocumentType, + @Body({ required: true }) { body }: { body: string } + ) { + return MessageModel.findByIdAndUpdate(message.id, + { body }, + { new: true }) + } + + @Delete('/:messageId') + deleteMessage(@State('message') message: DocumentType) { + return MessageModel.findByIdAndDelete(message.id) + } +} diff --git a/src/middlewares/checkAuth.ts b/src/middlewares/checkAuth.ts new file mode 100644 index 00000000..82223aa4 --- /dev/null +++ b/src/middlewares/checkAuth.ts @@ -0,0 +1,34 @@ +import { Context, Next } from 'koa' +import { UserModel } from '@/models/User' +import { badRequest, forbidden, notFound } from '@hapi/boom' +import { verify } from '@/helpers/jwt' + +export default async (ctx: Context, next: Next) => { + const token = ctx.header['token'] + + if (!token) { + return ctx.throw(forbidden('authentication failed')) + } + + if (typeof token !== 'string') { + return ctx.throw(badRequest()) + } + + try { + const { id } = verify(token) + if (!id) { + return ctx.throw(forbidden()) + } + } catch (error) { + return ctx.throw(badRequest()) + } + + const user = await UserModel.findOne({ token }) + if (!user) { + return ctx.throw(notFound()) + } + + ctx.state['user'] = user + + return next() +} diff --git a/src/models/Message.ts b/src/models/Message.ts new file mode 100644 index 00000000..27a688ce --- /dev/null +++ b/src/models/Message.ts @@ -0,0 +1,16 @@ +import { Ref, prop, getModelForClass, modelOptions } from '@typegoose/typegoose' +import {User} from '@/models/User'; + +@modelOptions({ + schemaOptions: { timestamps: true }, +}) +export class Message { + @prop({ required: true }) + body!: string + + @prop({ required: true, ref: () => User }) + user!:Ref + +} + +export const MessageModel = getModelForClass(Message)