mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-03-15 05:41:51 +00:00
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