eletrotupi / tcc/ commit / 2581519

api: add timestamps to triggers and route their show/delete

Pedro Lucas Porcellis porcellis@eletrotupi.com 1 month ago 258151993396b0b11c8543ebb8fad1053d759bc3
Parents: fd21c7f
5 file(s) changed
  • api/prisma/migrations/20260621170628_add_timestamps_to_triggers/migration.sql +16 -0
  • api/prisma/schema.prisma +3 -0
  • api/src/controllers/triggers.ts +12 -1
  • api/src/routes/triggers.ts +1 -0
  • api/src/services/trigger.service.ts +11 -1
api/prisma/migrations/20260621170628_add_timestamps_to_triggers/migration.sql
@@ -0,0 +1,16 @@
1 + /*
2 + Warnings:
3 +
4 + - Added the required column `updated_at` to the `triggers` table without a default value. This is not possible if the table is not empty.
5 +
6 + */
7 +
8 + -- AlterTable
9 + ALTER TABLE "triggers"
10 + ADD COLUMN "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
11 + ADD COLUMN "updated_at" TIMESTAMP(3);
12 +
13 + UPDATE "triggers" SET created_at = moment, updated_at = moment;
14 +
15 + ALTER TABLE "triggers" ALTER COLUMN created_at SET NOT NULL;
16 + ALTER TABLE "triggers" ALTER COLUMN updated_at SET NOT NULL;
api/prisma/schema.prisma
1 1
generator client {
2 2
  provider = "prisma-client-js"
3 3
  //output   = "../src/generated/prisma"
4 4
}
5 5

▸ 78 unchanged lines
84 84
  moment   DateTime    @default(now())
85 85

86 86
  userId Int  @map("user_id")
87 87
  user   User @relation(fields: [userId], references: [id])
88 88

89 +
  createdAt            DateTime  @default(now()) @map("created_at")
90 +
  updatedAt            DateTime  @updatedAt @map("updated_at")
91 +

89 92
  @@map("triggers")
90 93
}
91 94

92 95
model Reminder {
93 96
  id          Int     @id @default(autoincrement())
▸ 101 unchanged lines
195 198
  FOCUS
196 199
  RESTLESS
197 200
  RELAXED
198 201
  OVERWHELMED
199 202
}
api/src/controllers/triggers.ts
1 1
import { Request, Response, NextFunction } from 'express';
2 2
import { AuthenticatedRequest } from '@app/middleware/auth';
3 3
import {
4 4
  createTrigger,
5 5
  getTriggersByUserId,
6 -
  destroyTriggerById
6 +
  destroyTriggerById,
7 +
  getTriggerById
7 8
} from '@app/services/trigger.service';
8 9

9 10
import {
10 11
  CreateTriggerSchema
11 12
} from '@app/schemas'
▸ 37 unchanged lines
49 50
  destroy: async (req: AuthenticatedRequest, res: Response, next: NextFunction) => {
50 51
    try {
51 52
      const result = await destroyTriggerById(req.userId!, Number(req.params.id!));
52 53

53 54
      return res.status(200).json({})
55 +
    } catch (err) {
56 +
      next(err);
57 +
    }
58 +
  },
59 +

60 +
  show: async (req: AuthenticatedRequest, res: Response, next: NextFunction) => {
61 +
    try {
62 +
      const trigger = await getTriggerById(Number(req.userId!), Number(req.params.id!));
63 +

64 +
      return res.status(200).json(trigger)
54 65
    } catch (err) {
55 66
      next(err);
56 67
    }
57 68
  }
58 69
};
api/src/routes/triggers.ts
1 1
import { Router } from "express";
2 2
import { TriggersController } from '@app/controllers/triggers'
3 3
import { requireAuth } from '@app/middleware/auth';
4 4

5 5
const router = Router();
6 6

7 7
router.get('/', requireAuth, TriggersController.index);
8 +
router.get('/:id', requireAuth, TriggersController.show);
8 9
router.post('/', requireAuth, TriggersController.create);
9 10
router.delete('/:id', requireAuth, TriggersController.destroy);
10 11

11 12
export default router;
api/src/services/trigger.service.ts
1 1
import { prisma } from '@app/lib/prisma';
2 2
import { Trigger } from '@prisma/client';
3 3

4 4
import { CreateTriggerInput } from '@app/schemas';
5 5
import { rollingPeriod } from "@app/lib/queue/processors/insights/utils";
▸ 59 unchanged lines
65 65
};
66 66

67 67
export const destroyTriggerById = async (
68 68
  userId: number, id: number
69 69
): Promise<Trigger> => {
70 -
  return await prisma.trigger.delete({
70 +
  const trigger = await prisma.trigger.delete({
71 71
    where: {
72 72
      id,
73 73
      userId
74 74
    }
75 +
  })
76 +

77 +
  void enqueueTriggerPatternInsight(userId);
78 +

79 +
  return trigger
80 +
}
81 +

82 +
export const getTriggerById = async (userId: number, id: number): Promise<Trigger | null> => {
83 +
  return await prisma.trigger.findUnique({
84 +
    where: { userId, id }
75 85
  })
76 86
}
77 87

78 88
async function enqueueTriggerPatternInsight(userId: number): Promise<void> {
79 89
  await getQueue('insights').add(
▸ 3 unchanged lines
83 93
      jobId: `trigger-pattern-${userId}-${new Date().toDateString()}`,
84 94
      removeOnComplete: true,
85 95
    }
86 96
  );
87 97
}