add inbound activity logger for debugging

This commit is contained in:
Hazelnoot 2024-11-14 12:11:37 -05:00
parent 2d7918a9b7
commit b65b4ecadc
16 changed files with 414 additions and 10 deletions

View file

@ -80,7 +80,9 @@ import {
MiUserPublickey,
MiUserSecurityKey,
MiWebhook,
NoteEdit
NoteEdit,
SkActivityContext,
SkActivityLog,
} from './_.js';
import type { DataSource } from 'typeorm';
@ -126,6 +128,18 @@ const $latestNotesRepository: Provider = {
inject: [DI.db],
};
const $activityContextRepository: Provider = {
provide: DI.activityContextRepository,
useFactory: (db: DataSource) => db.getRepository(SkActivityContext).extend(miRepository as MiRepository<SkActivityContext>),
inject: [DI.db],
};
const $activityLogsRepository: Provider = {
provide: DI.activityLogsRepository,
useFactory: (db: DataSource) => db.getRepository(SkActivityLog).extend(miRepository as MiRepository<SkActivityLog>),
inject: [DI.db],
};
const $noteFavoritesRepository: Provider = {
provide: DI.noteFavoritesRepository,
useFactory: (db: DataSource) => db.getRepository(MiNoteFavorite).extend(miRepository as MiRepository<MiNoteFavorite>),
@ -526,6 +540,8 @@ const $noteScheduleRepository: Provider = {
$appsRepository,
$avatarDecorationsRepository,
$latestNotesRepository,
$activityContextRepository,
$activityLogsRepository,
$noteFavoritesRepository,
$noteThreadMutingsRepository,
$noteReactionsRepository,
@ -600,6 +616,8 @@ const $noteScheduleRepository: Provider = {
$appsRepository,
$avatarDecorationsRepository,
$latestNotesRepository,
$activityContextRepository,
$activityLogsRepository,
$noteFavoritesRepository,
$noteThreadMutingsRepository,
$noteReactionsRepository,

View file

@ -0,0 +1,24 @@
/*
* SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Column, PrimaryColumn, Entity, Index } from 'typeorm';
@Entity('activity_context')
export class SkActivityContext {
@PrimaryColumn('text')
@Index()
public md5: string;
@Column('jsonb')
// https://github.com/typeorm/typeorm/issues/8559
// eslint-disable-next-line @typescript-eslint/no-explicit-any
public json: any;
constructor(data?: Partial<SkActivityContext>) {
if (data) {
Object.assign(this, data);
}
}
}

View file

@ -0,0 +1,82 @@
/*
* SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Column, Entity, Index, JoinColumn, ManyToOne, PrimaryColumn } from 'typeorm';
import { SkActivityContext } from '@/models/SkActivityContext.js';
import { MiUser } from '@/models/_.js';
import { id } from './util/id.js';
@Entity('activity_log')
export class SkActivityLog {
@PrimaryColumn(id())
public id: string;
@Index()
@Column('timestamptz')
public at: Date;
@Column({
type: 'text',
name: 'key_id',
})
public keyId: string;
@Index()
@Column('text')
public host: string;
@Column('boolean')
public verified: boolean;
@Column('boolean')
public accepted: boolean;
@Column('text')
public result: string;
@Column('jsonb')
// https://github.com/typeorm/typeorm/issues/8559
// eslint-disable-next-line @typescript-eslint/no-explicit-any
public activity: any;
@Column({
type: 'text',
name: 'context_hash',
nullable: true,
})
public contextHash: string | null;
@ManyToOne(() => SkActivityContext, {
onDelete: 'CASCADE',
nullable: true,
})
@JoinColumn({
name: 'context_hash',
})
public context: SkActivityContext | null;
@Column({
type: 'varchar' as const,
length: 32,
name: 'auth_user_id',
nullable: true,
})
public authUserId: string | null;
@ManyToOne(() => MiUser, {
onDelete: 'CASCADE',
nullable: true,
})
@JoinColumn({
name: 'auth_user_id',
})
public authUser: MiUser | null;
constructor(data?: Partial<SkActivityLog>) {
if (data) {
Object.assign(this, data);
}
}
}

View file

@ -82,6 +82,8 @@ import { NoteEdit } from '@/models/NoteEdit.js';
import { MiBubbleGameRecord } from '@/models/BubbleGameRecord.js';
import { MiReversiGame } from '@/models/ReversiGame.js';
import { MiNoteSchedule } from '@/models/NoteSchedule.js';
import { SkActivityLog } from '@/models/SkActivityLog.js';
import { SkActivityContext } from './SkActivityContext.js';
import type { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity.js';
export interface MiRepository<T extends ObjectLiteral> {
@ -129,6 +131,8 @@ export const miRepository = {
export {
SkLatestNote,
SkActivityContext,
SkActivityLog,
MiAbuseUserReport,
MiAbuseReportNotificationRecipient,
MiAccessToken,
@ -229,6 +233,8 @@ export type HashtagsRepository = Repository<MiHashtag> & MiRepository<MiHashtag>
export type InstancesRepository = Repository<MiInstance> & MiRepository<MiInstance>;
export type MetasRepository = Repository<MiMeta> & MiRepository<MiMeta>;
export type LatestNotesRepository = Repository<SkLatestNote> & MiRepository<SkLatestNote>;
export type ActivityContextRepository = Repository<SkActivityContext> & MiRepository<SkActivityContext>;
export type ActivityLogsRepository = Repository<SkActivityLog> & MiRepository<SkActivityLog>;
export type ModerationLogsRepository = Repository<MiModerationLog> & MiRepository<MiModerationLog>;
export type MutingsRepository = Repository<MiMuting> & MiRepository<MiMuting>;
export type RenoteMutingsRepository = Repository<MiRenoteMuting> & MiRepository<MiRenoteMuting>;