berechtigungen

This commit is contained in:
Bastian Wagner
2026-08-03 10:16:42 +02:00
parent 6eeaa3a624
commit 27ab505aba
50 changed files with 1443 additions and 217 deletions

View File

@@ -25,6 +25,7 @@ export type LOGEVENT =
| 'penalty_catalog_create'
| 'penalty_catalog_update'
| 'penalty_catalog_delete'
| 'team_create';
| 'team_create'
| 'team_permissions_update';
export type LOGLEVEL = 'FATAL' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE';

View File

@@ -0,0 +1,48 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
const BACKFILLED_KEYS = [
'invite_min_role',
'member_manage_min_role',
'penalty_manage_min_role',
'public_access_manage_min_role',
] as const;
export class AddTeamPermissionSettings1785524400000
implements MigrationInterface
{
name = 'AddTeamPermissionSettings1785524400000';
public async up(queryRunner: QueryRunner): Promise<void> {
for (const key of BACKFILLED_KEYS) {
await queryRunner.query(
`INSERT INTO "team_setting" ("teamId", "key", "value")
SELECT "id", '${key}', '3' FROM "team"
WHERE NOT EXISTS (
SELECT 1 FROM "team_setting" ts
WHERE ts."teamId" = "team"."id" AND ts."key" = '${key}'
)`,
);
}
await queryRunner.query(
`INSERT INTO "team_setting" ("teamId", "key", "value")
SELECT "teamId", 'transaction_reverse_min_role', "value" FROM "team_setting"
WHERE "key" = 'transaction_create_min_role'
AND "teamId" NOT IN (
SELECT "teamId" FROM "team_setting" WHERE "key" = 'transaction_reverse_min_role'
)`,
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`DELETE FROM "team_setting" WHERE "key" IN (
'transaction_reverse_min_role',
'invite_min_role',
'member_manage_min_role',
'penalty_manage_min_role',
'public_access_manage_min_role'
)`,
);
}
}

View File

@@ -0,0 +1,50 @@
describe('AddTeamPermissionSettings1785524400000', () => {
it('backfills the new min-role settings for existing teams idempotently', async () => {
const migrationModule = require('./1785524400000-AddTeamPermissionSettings');
const migration =
new migrationModule.AddTeamPermissionSettings1785524400000();
const queryRunner = { query: jest.fn() } as any;
await migration.up(queryRunner);
const calls: string[] = queryRunner.query.mock.calls.map((c: any) => c[0]);
expect(calls).toHaveLength(5);
for (const key of [
'invite_min_role',
'member_manage_min_role',
'penalty_manage_min_role',
'public_access_manage_min_role',
]) {
expect(
calls.some(
(sql) => sql.includes(`'${key}'`) && sql.includes('NOT EXISTS'),
),
).toBe(true);
}
expect(
calls.some(
(sql) =>
sql.includes("'transaction_reverse_min_role'") &&
sql.includes("'transaction_create_min_role'"),
),
).toBe(true);
});
it('removes the new min-role settings again on down', async () => {
const migrationModule = require('./1785524400000-AddTeamPermissionSettings');
const migration =
new migrationModule.AddTeamPermissionSettings1785524400000();
const queryRunner = { query: jest.fn() } as any;
await migration.down(queryRunner);
expect(queryRunner.query).toHaveBeenCalledTimes(1);
const sql = queryRunner.query.mock.calls[0][0];
expect(sql).toContain('DELETE FROM "team_setting"');
expect(sql).toContain('transaction_reverse_min_role');
expect(sql).toContain('invite_min_role');
expect(sql).toContain('member_manage_min_role');
expect(sql).toContain('penalty_manage_min_role');
expect(sql).toContain('public_access_manage_min_role');
});
});