mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-07 19:22:14 +09:00
feat(admin)!: move the admin api to rest and fix its defects (#2515)
This commit is contained in:
@@ -1,10 +1,16 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
|
||||
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
|
||||
import type {
|
||||
CreateVoiceRegionResponse,
|
||||
CreateVoiceServerResponse,
|
||||
DeleteVoiceResponse,
|
||||
GetVoiceRegionResponse,
|
||||
GetVoiceServerResponse,
|
||||
ListVoiceRegionsResponse,
|
||||
ListVoiceServersResponse,
|
||||
UpdateVoiceRegionResponse,
|
||||
UpdateVoiceServerResponse,
|
||||
} from '@fluxer/schema/src/domains/admin/AdminVoiceSchemas';
|
||||
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
|
||||
@@ -38,7 +44,7 @@ async function createVoiceFixture(
|
||||
},
|
||||
): Promise<VoiceFixture> {
|
||||
await createBuilder<CreateVoiceRegionResponse>(harness, `${admin.token}`)
|
||||
.post('/admin/voice/regions/create')
|
||||
.post('/admin/voice/regions')
|
||||
.body({
|
||||
id: params.regionId,
|
||||
name: `Region ${params.regionId}`,
|
||||
@@ -49,9 +55,8 @@ async function createVoiceFixture(
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
await createBuilder<CreateVoiceServerResponse>(harness, `${admin.token}`)
|
||||
.post('/admin/voice/servers/create')
|
||||
.post(`/admin/voice/regions/${params.regionId}/servers`)
|
||||
.body({
|
||||
region_id: params.regionId,
|
||||
server_id: params.serverId,
|
||||
endpoint: params.endpoint,
|
||||
api_key: params.apiKey,
|
||||
@@ -91,8 +96,7 @@ describe('VoiceAdminController', () => {
|
||||
apiSecret: 'list-api-secret',
|
||||
});
|
||||
const result = await createBuilder<ListVoiceRegionsResponse>(harness, `${admin.token}`)
|
||||
.post('/admin/voice/regions/list')
|
||||
.body({include_servers: true})
|
||||
.get('/admin/voice/regions?include_servers=true')
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(result.regions).toHaveLength(1);
|
||||
@@ -101,6 +105,77 @@ describe('VoiceAdminController', () => {
|
||||
expect(result.regions[0]?.servers).toHaveLength(1);
|
||||
expect(result.regions[0]?.servers?.[0]?.server_id).toBe(fixture.serverId);
|
||||
});
|
||||
test('resolves and removes regions and servers through the nested routes', async () => {
|
||||
const admin = await createAdminWithAcls(harness, [
|
||||
AdminACLs.VOICE_REGION_CREATE,
|
||||
AdminACLs.VOICE_REGION_DELETE,
|
||||
AdminACLs.VOICE_REGION_LIST,
|
||||
AdminACLs.VOICE_REGION_UPDATE,
|
||||
AdminACLs.VOICE_SERVER_CREATE,
|
||||
AdminACLs.VOICE_SERVER_DELETE,
|
||||
AdminACLs.VOICE_SERVER_LIST,
|
||||
]);
|
||||
const fixture = await createVoiceFixture(harness, admin, {
|
||||
regionId: 'voice-region-nested-routes',
|
||||
serverId: 'voice-server-nested-routes',
|
||||
endpoint: 'https://voice-nested.example.com/socket',
|
||||
apiKey: 'nested-api-key',
|
||||
apiSecret: 'nested-api-secret',
|
||||
});
|
||||
const region = await createBuilder<GetVoiceRegionResponse>(harness, `${admin.token}`)
|
||||
.get(`/admin/voice/regions/${fixture.regionId}`)
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(region.region?.id).toBe(fixture.regionId);
|
||||
expect(region.region?.servers).toHaveLength(1);
|
||||
const servers = await createBuilder<ListVoiceServersResponse>(harness, `${admin.token}`)
|
||||
.get(`/admin/voice/regions/${fixture.regionId}/servers`)
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(servers.servers).toHaveLength(1);
|
||||
expect(servers.servers[0]?.server_id).toBe(fixture.serverId);
|
||||
const server = await createBuilder<GetVoiceServerResponse>(harness, `${admin.token}`)
|
||||
.get(`/admin/voice/regions/${fixture.regionId}/servers/${fixture.serverId}`)
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(server.server?.endpoint).toBe('https://voice-nested.example.com/socket');
|
||||
const renamed = await createBuilder<UpdateVoiceRegionResponse>(harness, `${admin.token}`)
|
||||
.patch(`/admin/voice/regions/${fixture.regionId}`)
|
||||
.body({name: 'Renamed region'})
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(renamed.region.id).toBe(fixture.regionId);
|
||||
expect(renamed.region.name).toBe('Renamed region');
|
||||
const deletedServer = await createBuilder<DeleteVoiceResponse>(harness, `${admin.token}`)
|
||||
.delete(`/admin/voice/regions/${fixture.regionId}/servers/${fixture.serverId}`)
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(deletedServer.success).toBe(true);
|
||||
expect(await voiceRepository.getServer(fixture.regionId, fixture.serverId)).toBeNull();
|
||||
const deletedRegion = await createBuilder<DeleteVoiceResponse>(harness, `${admin.token}`)
|
||||
.delete(`/admin/voice/regions/${fixture.regionId}`)
|
||||
.expect(HTTP_STATUS.OK)
|
||||
.execute();
|
||||
expect(deletedRegion.success).toBe(true);
|
||||
expect(await voiceRepository.getRegion(fixture.regionId)).toBeNull();
|
||||
});
|
||||
test('rejects voice server creation when no region carries the identifier', async () => {
|
||||
const admin = await createAdminWithAcls(harness, [AdminACLs.VOICE_SERVER_CREATE]);
|
||||
const regionId = 'voice-region-missing-for-server-create';
|
||||
const serverId = 'voice-server-missing-region';
|
||||
await createBuilder(harness, `${admin.token}`)
|
||||
.post(`/admin/voice/regions/${regionId}/servers`)
|
||||
.body({
|
||||
server_id: serverId,
|
||||
endpoint: 'https://voice-orphan.example.com/socket',
|
||||
api_key: 'orphan-api-key',
|
||||
api_secret: 'orphan-api-secret',
|
||||
})
|
||||
.expect(HTTP_STATUS.NOT_FOUND, APIErrorCodes.UNKNOWN_VOICE_REGION)
|
||||
.execute();
|
||||
expect(await voiceRepository.getServer(regionId, serverId)).toBeNull();
|
||||
expect(await voiceRepository.listServers(regionId)).toHaveLength(0);
|
||||
});
|
||||
test('updates voice server credentials when api key and secret are provided', async () => {
|
||||
const admin = await createAdminWithAcls(harness, [
|
||||
AdminACLs.VOICE_REGION_CREATE,
|
||||
@@ -115,10 +190,8 @@ describe('VoiceAdminController', () => {
|
||||
apiSecret: 'original-api-secret',
|
||||
});
|
||||
await createBuilder<UpdateVoiceServerResponse>(harness, `${admin.token}`)
|
||||
.post('/admin/voice/servers/update')
|
||||
.patch(`/admin/voice/regions/${fixture.regionId}/servers/${fixture.serverId}`)
|
||||
.body({
|
||||
region_id: fixture.regionId,
|
||||
server_id: fixture.serverId,
|
||||
endpoint: 'https://voice-updated.example.com/socket',
|
||||
api_key: 'updated-api-key',
|
||||
api_secret: 'updated-api-secret',
|
||||
@@ -145,10 +218,8 @@ describe('VoiceAdminController', () => {
|
||||
apiSecret: 'partial-before-api-secret',
|
||||
});
|
||||
await createBuilder<UpdateVoiceServerResponse>(harness, `${admin.token}`)
|
||||
.post('/admin/voice/servers/update')
|
||||
.patch(`/admin/voice/regions/${fixture.regionId}/servers/${fixture.serverId}`)
|
||||
.body({
|
||||
region_id: fixture.regionId,
|
||||
server_id: fixture.serverId,
|
||||
api_key: 'partial-after-api-key',
|
||||
})
|
||||
.expect(HTTP_STATUS.OK)
|
||||
@@ -158,10 +229,8 @@ describe('VoiceAdminController', () => {
|
||||
expect(afterApiKeyUpdate?.apiKey).toBe('partial-after-api-key');
|
||||
expect(afterApiKeyUpdate?.apiSecret).toBe(fixture.initialApiSecret);
|
||||
await createBuilder<UpdateVoiceServerResponse>(harness, `${admin.token}`)
|
||||
.post('/admin/voice/servers/update')
|
||||
.patch(`/admin/voice/regions/${fixture.regionId}/servers/${fixture.serverId}`)
|
||||
.body({
|
||||
region_id: fixture.regionId,
|
||||
server_id: fixture.serverId,
|
||||
api_secret: 'partial-after-api-secret',
|
||||
})
|
||||
.expect(HTTP_STATUS.OK)
|
||||
@@ -185,10 +254,8 @@ describe('VoiceAdminController', () => {
|
||||
apiSecret: 'before-api-secret',
|
||||
});
|
||||
await createBuilder<UpdateVoiceServerResponse>(harness, `${admin.token}`)
|
||||
.post('/admin/voice/servers/update')
|
||||
.patch(`/admin/voice/regions/${fixture.regionId}/servers/${fixture.serverId}`)
|
||||
.body({
|
||||
region_id: fixture.regionId,
|
||||
server_id: fixture.serverId,
|
||||
endpoint: 'https://voice-after.example.com/socket',
|
||||
})
|
||||
.expect(HTTP_STATUS.OK)
|
||||
|
||||
Reference in New Issue
Block a user