mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-12 05:28:28 +09:00
47 lines
1.9 KiB
TypeScript
47 lines
1.9 KiB
TypeScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
|
|
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
|
|
import {OpenAPI} from '@app/api/middleware/ResponseTypeMiddleware';
|
|
import {RateLimitConfigs} from '@app/api/RateLimitConfig';
|
|
import type {HonoApp} from '@app/api/types/HonoEnv';
|
|
import {Validator} from '@app/api/Validator';
|
|
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
|
|
import {SendSystemDmRequest, SendSystemDmResponse} from '@fluxer/schema/src/domains/admin/AdminSchemas';
|
|
|
|
export function SystemDmAdminController(app: HonoApp) {
|
|
app.post(
|
|
'/admin/system-dms',
|
|
RateLimitMiddleware(RateLimitConfigs.ADMIN_MESSAGE_OPERATION),
|
|
requireAdminACL(AdminACLs.SYSTEM_DM_SEND),
|
|
Validator('json', SendSystemDmRequest),
|
|
OpenAPI({
|
|
operationId: 'create_admin_system_dm',
|
|
summary: 'Send a system direct message',
|
|
responseSchema: SendSystemDmResponse,
|
|
statusCode: 200,
|
|
security: 'adminApiKey',
|
|
tags: 'Admin',
|
|
description:
|
|
'Queue a worker job that delivers the same content to every listed user, or to every user when all_users is set, as a direct message from the system account. Progress is observable through the Jobs admin resource (task_type=sendSystemDm), and an in-flight broadcast is stopped by cancelling that job. Requires SYSTEM_DM_SEND permission.',
|
|
}),
|
|
async (ctx) => {
|
|
const adminService = ctx.get('adminService');
|
|
const adminUserId = ctx.get('adminUserId');
|
|
const auditLogReason = ctx.get('auditLogReason');
|
|
const payload = ctx.req.valid('json');
|
|
const result = await adminService.sendSystemDm(
|
|
{
|
|
content: payload.content,
|
|
recipients: payload.all_users
|
|
? {kind: 'all'}
|
|
: {kind: 'list', userIds: (payload.user_ids ?? []).map((id) => id.toString())},
|
|
},
|
|
adminUserId,
|
|
auditLogReason,
|
|
);
|
|
return ctx.json(result);
|
|
},
|
|
);
|
|
}
|