messages.controller.ts 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import { FastifyRequest, FastifyReply, FastifyInstance } from 'fastify'
  2. import { MessagesService } from '../services/messages.service'
  3. import { CreateMessageBody, CreateMessagesBody, ListMessagesQuery, UpdateMessageBody } from '../dto/messages.dto'
  4. export class MessagesController {
  5. private messagesService: MessagesService
  6. constructor(app: FastifyInstance) {
  7. this.messagesService = new MessagesService(app)
  8. }
  9. async create(request: FastifyRequest<{ Body: CreateMessageBody }>, reply: FastifyReply) {
  10. try {
  11. const { userId, fishId, targetId, message } = request.body
  12. if (!userId || !fishId || !targetId || !message) {
  13. return reply.code(400).send({ message: '用户ID、鱼类ID、目标ID和消息内容不能为空' })
  14. }
  15. if (message.trim().length === 0) {
  16. return reply.code(400).send({ message: '消息内容不能为空' })
  17. }
  18. await this.messagesService.create(userId, fishId, targetId, message)
  19. return reply.code(201).send({
  20. message: '消息创建成功'
  21. })
  22. } catch (error) {
  23. return reply.code(500).send({ message: '创建消息失败', error: (error as Error).message })
  24. }
  25. }
  26. async createBatch(request: FastifyRequest<{ Body: CreateMessagesBody }>, reply: FastifyReply) {
  27. try {
  28. const { messages } = request.body
  29. if (!messages || !Array.isArray(messages) || messages.length === 0) {
  30. return reply.code(400).send({ message: '消息列表不能为空' })
  31. }
  32. // 验证每个消息的必填字段
  33. for (const msg of messages) {
  34. if (!msg.userId || !msg.fishId || !msg.targetId || !msg.message) {
  35. return reply.code(400).send({ message: '每个消息必须包含用户ID、鱼类ID、目标ID和消息内容' })
  36. }
  37. if (msg.message.trim().length === 0) {
  38. return reply.code(400).send({ message: '消息内容不能为空' })
  39. }
  40. }
  41. const messageEntities = await this.messagesService.createBatch(messages)
  42. return reply.code(201).send({
  43. message: `成功创建 ${messageEntities.length} 条消息`
  44. })
  45. } catch (error) {
  46. return reply.code(500).send({ message: '批量创建消息失败', error: (error as Error).message })
  47. }
  48. }
  49. async list(request: FastifyRequest<{ Querystring: ListMessagesQuery }>, reply: FastifyReply) {
  50. try {
  51. const { page = 0, size = 20, userId, fishId, targetId } = request.query
  52. const result = await this.messagesService.list(page, size, userId, fishId, targetId)
  53. return reply.send({
  54. message: '获取消息列表成功',
  55. data: result
  56. })
  57. } catch (error) {
  58. return reply.code(500).send({ message: '获取消息列表失败', error: (error as Error).message })
  59. }
  60. }
  61. async getById(request: FastifyRequest<{ Params: { id: number } }>, reply: FastifyReply) {
  62. try {
  63. const { id } = request.params
  64. const message = await this.messagesService.findById(id)
  65. return reply.send({
  66. message: '获取消息详情成功',
  67. data: {
  68. id: message.id,
  69. userId: message.userId,
  70. fishId: message.fishId,
  71. targetId: message.targetId,
  72. message: message.message,
  73. createdAt: message.createdAt,
  74. updatedAt: message.updatedAt
  75. }
  76. })
  77. } catch (error) {
  78. if ((error as Error).name === 'EntityNotFoundError') {
  79. return reply.code(404).send({ message: '消息不存在' })
  80. }
  81. return reply.code(500).send({ message: '获取消息详情失败', error: (error as Error).message })
  82. }
  83. }
  84. async update(request: FastifyRequest<{ Body: UpdateMessageBody }>, reply: FastifyReply) {
  85. try {
  86. const { id, message } = request.body
  87. if (!id) {
  88. return reply.code(400).send({ message: '消息ID不能为空' })
  89. }
  90. if (!message || message.trim().length === 0) {
  91. return reply.code(400).send({ message: '消息内容不能为空' })
  92. }
  93. const updatedMessage = await this.messagesService.update(id, message)
  94. return reply.send({
  95. message: '消息更新成功',
  96. data: {
  97. id: updatedMessage.id,
  98. userId: updatedMessage.userId,
  99. fishId: updatedMessage.fishId,
  100. targetId: updatedMessage.targetId,
  101. message: updatedMessage.message,
  102. createdAt: updatedMessage.createdAt,
  103. updatedAt: updatedMessage.updatedAt
  104. }
  105. })
  106. } catch (error) {
  107. if ((error as Error).name === 'EntityNotFoundError') {
  108. return reply.code(404).send({ message: '消息不存在' })
  109. }
  110. return reply.code(500).send({ message: '更新消息失败', error: (error as Error).message })
  111. }
  112. }
  113. async delete(request: FastifyRequest<{ Params: { id: number } }>, reply: FastifyReply) {
  114. try {
  115. const { id } = request.params
  116. // 先检查消息是否存在
  117. await this.messagesService.findById(id)
  118. await this.messagesService.delete(id)
  119. return reply.send({
  120. message: '消息删除成功'
  121. })
  122. } catch (error) {
  123. if ((error as Error).name === 'EntityNotFoundError') {
  124. return reply.code(404).send({ message: '消息不存在' })
  125. }
  126. return reply.code(500).send({ message: '删除消息失败', error: (error as Error).message })
  127. }
  128. }
  129. async getByUserId(request: FastifyRequest<{ Params: { userId: number } }>, reply: FastifyReply) {
  130. try {
  131. const { userId } = request.params
  132. const messages = await this.messagesService.findByUserId(userId)
  133. return reply.send({
  134. message: '获取用户消息成功',
  135. data: messages
  136. })
  137. } catch (error) {
  138. return reply.code(500).send({ message: '获取用户消息失败', error: (error as Error).message })
  139. }
  140. }
  141. async getByFishId(request: FastifyRequest<{ Params: { fishId: number } }>, reply: FastifyReply) {
  142. try {
  143. const { fishId } = request.params
  144. } catch (error) {
  145. return reply.code(500).send({ message: '获取鱼类消息失败', error: (error as Error).message })
  146. }
  147. }
  148. async getByTargetId(request: FastifyRequest<{ Params: { targetId: number } }>, reply: FastifyReply) {
  149. try {
  150. const { targetId } = request.params
  151. const messages = await this.messagesService.findByTargetId(targetId)
  152. return reply.send({
  153. message: '获取目标消息成功',
  154. data: messages
  155. })
  156. } catch (error) {
  157. return reply.code(500).send({ message: '获取目标消息失败', error: (error as Error).message })
  158. }
  159. }
  160. }