Start work on API audit logs
This commit is contained in:
parent
947a49761e
commit
ff648e7071
4 changed files with 146 additions and 0 deletions
28
backend/src/data/ApiAuditLog.ts
Normal file
28
backend/src/data/ApiAuditLog.ts
Normal file
|
@ -0,0 +1,28 @@
|
|||
import { BaseRepository } from "./BaseRepository";
|
||||
import { getRepository, Repository } from "typeorm/index";
|
||||
import { ApiAuditLogEntry } from "./entities/ApiAuditLogEntry";
|
||||
import { ApiLogin } from "./entities/ApiLogin";
|
||||
import { AuditLogEventData, AuditLogEventType } from "./apiAuditLogTypes";
|
||||
|
||||
export class ApiAuditLog extends BaseRepository {
|
||||
private auditLog: Repository<ApiAuditLogEntry<any>>;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.auditLog = getRepository(ApiAuditLogEntry);
|
||||
}
|
||||
|
||||
addEntry<TEventType extends AuditLogEventType>(
|
||||
guildId: string,
|
||||
authorId: string,
|
||||
eventType: TEventType,
|
||||
eventData: AuditLogEventData[TEventType],
|
||||
) {
|
||||
this.auditLog.insert({
|
||||
guild_id: guildId,
|
||||
author_id: authorId,
|
||||
event_type: eventType as any,
|
||||
event_data: eventData as any,
|
||||
});
|
||||
}
|
||||
}
|
35
backend/src/data/apiAuditLogTypes.ts
Normal file
35
backend/src/data/apiAuditLogTypes.ts
Normal file
|
@ -0,0 +1,35 @@
|
|||
export const AuditLogEventTypes = {
|
||||
ADD_API_PERMISSION: "ADD_API_PERMISSION",
|
||||
REMOVE_API_PERMISSION: "REMOVE_API_PERMISSION",
|
||||
EDIT_CONFIG: "EDIT_CONFIG",
|
||||
};
|
||||
|
||||
export type AuditLogEventType = keyof typeof AuditLogEventTypes;
|
||||
|
||||
export type AddApiPermissionEventData = {
|
||||
target_id: string;
|
||||
permissions: string[];
|
||||
expires_at: string | null;
|
||||
};
|
||||
|
||||
export type RemoveApiPermissionEventData = {
|
||||
target_id: string;
|
||||
};
|
||||
|
||||
export type EditConfigEventData = {};
|
||||
|
||||
export interface AuditLogEventData extends Record<AuditLogEventType, unknown> {
|
||||
ADD_API_PERMISSION: {
|
||||
target_id: string;
|
||||
permissions: string[];
|
||||
expires_at: string | null;
|
||||
};
|
||||
|
||||
REMOVE_API_PERMISSION: {
|
||||
target_id: string;
|
||||
};
|
||||
|
||||
EDIT_CONFIG: {};
|
||||
}
|
||||
|
||||
export type AnyAuditLogEventData = AuditLogEventData[AuditLogEventType];
|
25
backend/src/data/entities/ApiAuditLogEntry.ts
Normal file
25
backend/src/data/entities/ApiAuditLogEntry.ts
Normal file
|
@ -0,0 +1,25 @@
|
|||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm";
|
||||
import { ApiUserInfo } from "./ApiUserInfo";
|
||||
import { AuditLogEventData, AuditLogEventType } from "../apiAuditLogTypes";
|
||||
|
||||
@Entity("api_audit_log")
|
||||
export class ApiAuditLogEntry<TEventType extends AuditLogEventType> {
|
||||
@Column()
|
||||
@PrimaryColumn()
|
||||
id: number;
|
||||
|
||||
@Column()
|
||||
guild_id: string;
|
||||
|
||||
@Column()
|
||||
author_id: string;
|
||||
|
||||
@Column()
|
||||
event_type: TEventType;
|
||||
|
||||
@Column("simple-json")
|
||||
event_data: AuditLogEventData[TEventType];
|
||||
|
||||
@Column()
|
||||
created_at: string;
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
import { MigrationInterface, QueryRunner, Table, TableIndex } from "typeorm";
|
||||
|
||||
export class CreateApiAuditLogTable1630837718830 implements MigrationInterface {
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.createTable(
|
||||
new Table({
|
||||
name: "api_audit_log",
|
||||
columns: [
|
||||
{
|
||||
name: "id",
|
||||
type: "int",
|
||||
unsigned: true,
|
||||
isPrimary: true,
|
||||
isGenerated: true,
|
||||
generationStrategy: "increment",
|
||||
},
|
||||
{
|
||||
name: "guild_id",
|
||||
type: "bigint",
|
||||
},
|
||||
{
|
||||
name: "author_id",
|
||||
type: "bigint",
|
||||
},
|
||||
{
|
||||
name: "event_type",
|
||||
type: "varchar",
|
||||
length: "255",
|
||||
},
|
||||
{
|
||||
name: "event_data",
|
||||
type: "longtext",
|
||||
},
|
||||
{
|
||||
name: "created_at",
|
||||
type: "datetime",
|
||||
default: "(NOW())",
|
||||
},
|
||||
],
|
||||
indices: [
|
||||
new TableIndex({
|
||||
columnNames: ["guild_id", "author_id"],
|
||||
}),
|
||||
new TableIndex({
|
||||
columnNames: ["guild_id", "event_type"],
|
||||
}),
|
||||
new TableIndex({
|
||||
columnNames: ["created_at"],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.dropTable("api_audit_log");
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue