api/app/controllers/notifications_controller.ts
2025-08-20 12:22:11 +02:00

90 lines
2.7 KiB
TypeScript

import Subscription from '#models/subscription'
import { EVENTS, NotificationService } from '#services/notification_service'
import { subscribeValidator, updateNotificationValidator } from '#validators/notification'
import { inject } from '@adonisjs/core'
import type { HttpContext } from '@adonisjs/core/http'
@inject()
export default class NotificationsController {
constructor(private service: NotificationService) {}
// GET /notifications
async index({ auth }: HttpContext) {
return Subscription.query().where('userId', auth.user!.id)
}
// POST /notifications/subscribe
async subscribe({ request, response, auth }: HttpContext) {
const ua = request.headers()['user-agent']
if (!ua) {
return response.badRequest({
message: 'User-Agent header is required',
})
}
const device = this.service.getUserSignature(ua)
const data = await request.validateUsing(subscribeValidator)
await Subscription.create({
userId: auth.user!.id,
device,
events: 0, // Default to no events
data,
failedAttempts: 0,
enabled: true,
})
}
// POST /notifications/:id/unsubscribe
async unsubscribe({ request, auth }: HttpContext) {
const subscriptionId = request.param('id')
const subscription = await Subscription.query()
.where('userId', auth.user!.id)
.where('id', subscriptionId)
.firstOrFail()
await subscription.delete()
return { success: true }
}
// POST /notifications/:id/
async update({ request, response, auth }: HttpContext) {
const subscriptionId = request.param('id')
const subscription = await Subscription.query()
.where('userId', auth.user!.id)
.where('id', subscriptionId)
.firstOrFail()
const { events } = await request.validateUsing(updateNotificationValidator)
// Validate events
if (!events.every((key) => key in EVENTS)) {
return response.badRequest({
message: 'Invalid events provided',
})
}
// Update subscription events
const validEvents = events.map((key) => EVENTS[key as keyof typeof EVENTS])
subscription.events = this.service.setEvents(validEvents)
await subscription.save()
return subscription
}
// POST /notifications/:id/test
async test({ request, response, auth }: HttpContext) {
const subscriptionId = request.param('id')
const subscription = await Subscription.query()
.where('userId', auth.user!.id)
.where('id', subscriptionId)
.firstOrFail()
const result = await this.service.sendTestNotification(subscription.data)
if (result) {
return { success: true }
}
return response.internalServerError({
message: 'Failed to send test notification',
})
}
}