38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
import { FastifyInstance } from "fastify"
|
|
import { db } from "../db"
|
|
import { users } from "../db/schema"
|
|
import { emailService } from "../services/email"
|
|
|
|
export default async function notificationRoutes(fastify: FastifyInstance) {
|
|
fastify.addHook("preHandler", async (request, reply) => {
|
|
try {
|
|
await request.jwtVerify()
|
|
} catch (err) {
|
|
return reply.code(401).send({ message: "Unauthorized" })
|
|
}
|
|
})
|
|
|
|
const isAdmin = (request: any) => {
|
|
return (request.user as { sub: string, role: string })?.role === "admin"
|
|
}
|
|
|
|
fastify.post("/send-weekly-summary", async (request, reply) => {
|
|
if (!isAdmin(request)) {
|
|
return reply.code(403).send({ message: "Forbidden: Admin role required" })
|
|
}
|
|
|
|
const allUsers = await db.select().from(users)
|
|
let sentCount = 0
|
|
|
|
for (const user of allUsers) {
|
|
try {
|
|
await emailService.sendWeeklySummary(user)
|
|
sentCount++
|
|
} catch (error) {
|
|
fastify.log.error(`Failed to send weekly summary to ${user.email}: ${error}`)
|
|
}
|
|
}
|
|
|
|
return { sent: sentCount }
|
|
})
|
|
} |