Files
dashboard/backend/src/services/banner.service.ts
2026-03-12 16:05:01 +01:00

61 lines
1.7 KiB
TypeScript

import pool from '../config/database';
export interface Banner {
id: string;
message: string;
level: 'info' | 'important' | 'critical';
show_as: 'banner' | 'widget';
starts_at: string;
ends_at: string | null;
created_by: string | null;
created_at: string;
}
export interface CreateBannerInput {
message: string;
level: 'info' | 'important' | 'critical';
show_as?: 'banner' | 'widget';
starts_at?: string;
ends_at?: string | null;
}
class BannerService {
async getActive(): Promise<Banner[]> {
const result = await pool.query(
`SELECT * FROM announcement_banners
WHERE starts_at <= NOW()
AND (ends_at IS NULL OR ends_at > NOW())
ORDER BY
CASE level WHEN 'critical' THEN 0 WHEN 'important' THEN 1 ELSE 2 END,
created_at DESC`
);
return result.rows;
}
async getAll(): Promise<Banner[]> {
const result = await pool.query(
'SELECT * FROM announcement_banners ORDER BY created_at DESC'
);
return result.rows;
}
async create(data: CreateBannerInput, userId: string): Promise<Banner> {
const result = await pool.query(
`INSERT INTO announcement_banners (message, level, show_as, starts_at, ends_at, created_by)
VALUES ($1, $2, $3, $4, $5, $6) RETURNING *`,
[data.message, data.level, data.show_as ?? 'banner', data.starts_at ?? new Date().toISOString(), data.ends_at ?? null, userId]
);
return result.rows[0];
}
async delete(id: string): Promise<boolean> {
const result = await pool.query(
'DELETE FROM announcement_banners WHERE id = $1',
[id]
);
return (result.rowCount ?? 0) > 0;
}
}
export default new BannerService();