Merge tag '2023.12.0' into merge-upstream
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export class bannedEmailDomains1703209889304 {
|
||||
constructor() {
|
||||
this.name = 'bannedEmailDomains1703209889304';
|
||||
}
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "bannedEmailDomains" character varying(1024) array NOT NULL DEFAULT '{}'`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "bannedEmailDomains"`);
|
||||
}
|
||||
}
|
@@ -9,6 +9,7 @@ import { Inject, Injectable } from '@nestjs/common';
|
||||
import { validate as validateEmail } from 'deep-email-validator';
|
||||
import { SubOutputFormat } from 'deep-email-validator/dist/output/output.js';
|
||||
import { MetaService } from '@/core/MetaService.js';
|
||||
import { UtilityService } from '@/core/UtilityService.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import type { Config } from '@/config.js';
|
||||
import type Logger from '@/logger.js';
|
||||
@@ -30,6 +31,7 @@ export class EmailService {
|
||||
|
||||
private metaService: MetaService,
|
||||
private loggerService: LoggerService,
|
||||
private utilityService: UtilityService,
|
||||
private httpRequestService: HttpRequestService,
|
||||
) {
|
||||
this.logger = this.loggerService.getLogger('email');
|
||||
@@ -155,7 +157,7 @@ export class EmailService {
|
||||
@bindThis
|
||||
public async validateEmailForAccount(emailAddress: string): Promise<{
|
||||
available: boolean;
|
||||
reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp';
|
||||
reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp' | 'banned';
|
||||
}> {
|
||||
const meta = await this.metaService.fetch();
|
||||
|
||||
@@ -164,32 +166,35 @@ export class EmailService {
|
||||
email: emailAddress,
|
||||
});
|
||||
|
||||
const verifymailApi = meta.enableVerifymailApi && meta.verifymailAuthKey != null;
|
||||
let validated;
|
||||
|
||||
if (meta.enableActiveEmailValidation && meta.verifymailAuthKey) {
|
||||
if (verifymailApi) {
|
||||
if (meta.enableActiveEmailValidation) {
|
||||
if (meta.enableVerifymailApi && meta.verifymailAuthKey != null) {
|
||||
validated = await this.verifyMail(emailAddress, meta.verifymailAuthKey);
|
||||
} else {
|
||||
validated = meta.enableActiveEmailValidation ? await validateEmail({
|
||||
validated = await validateEmail({
|
||||
email: emailAddress,
|
||||
validateRegex: true,
|
||||
validateMx: true,
|
||||
validateTypo: false, // TLDを見ているみたいだけどclubとか弾かれるので
|
||||
validateDisposable: true, // 捨てアドかどうかチェック
|
||||
validateSMTP: false, // 日本だと25ポートが殆どのプロバイダーで塞がれていてタイムアウトになるので
|
||||
}) : { valid: true, reason: null };
|
||||
});
|
||||
}
|
||||
} else {
|
||||
validated = { valid: true, reason: null };
|
||||
}
|
||||
|
||||
const available = exist === 0 && validated.valid;
|
||||
const emailDomain: string = emailAddress.split('@')[1];
|
||||
const isBanned = this.utilityService.isBlockedHost(meta.bannedEmailDomains, emailDomain);
|
||||
|
||||
const available = exist === 0 && validated.valid && !isBanned;
|
||||
|
||||
return {
|
||||
available,
|
||||
reason: available ? null :
|
||||
exist !== 0 ? 'used' :
|
||||
isBanned ? 'banned' :
|
||||
validated.reason === 'regex' ? 'format' :
|
||||
validated.reason === 'disposable' ? 'disposable' :
|
||||
validated.reason === 'mx' ? 'mx' :
|
||||
|
@@ -293,7 +293,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
}
|
||||
|
||||
// Check blocking
|
||||
if (data.renote && this.isQuote(data)) {
|
||||
if (data.renote && !this.isQuote(data)) {
|
||||
if (data.renote.userHost === null) {
|
||||
if (data.renote.userId !== user.id) {
|
||||
const blocked = await this.userBlockingService.checkBlocked(data.renote.userId, user.id);
|
||||
@@ -731,8 +731,9 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
}
|
||||
|
||||
@bindThis
|
||||
private isQuote(note: Option): boolean {
|
||||
return !!note.text || !!note.cw || !!note.files || !!note.poll;
|
||||
private isQuote(note: Option): note is Option & { renote: MiNote } {
|
||||
// sync with misc/is-quote.ts
|
||||
return !!note.renote && (!!note.text || !!note.cw || (!!note.files && !!note.files.length) || !!note.poll);
|
||||
}
|
||||
|
||||
@bindThis
|
||||
@@ -801,7 +802,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
private async renderNoteOrRenoteActivity(data: Option, note: MiNote) {
|
||||
if (data.localOnly) return null;
|
||||
|
||||
const content = data.renote && this.isQuote(data)
|
||||
const content = data.renote && !this.isQuote(data)
|
||||
? this.apRendererService.renderAnnounce(data.renote.uri ? data.renote.uri : `${this.config.url}/notes/${data.renote.id}`, note)
|
||||
: this.apRendererService.renderCreate(await this.apRendererService.renderNote(note, false), note);
|
||||
|
||||
|
@@ -3,8 +3,9 @@
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';
|
||||
import { Inject, Injectable, OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
||||
import * as Redis from 'ioredis';
|
||||
import { ModuleRef } from '@nestjs/core';
|
||||
import type { UserListMembershipsRepository } from '@/models/_.js';
|
||||
import type { MiUser } from '@/models/User.js';
|
||||
import type { MiUserList } from '@/models/UserList.js';
|
||||
@@ -21,12 +22,15 @@ import { RedisKVCache } from '@/misc/cache.js';
|
||||
import { RoleService } from '@/core/RoleService.js';
|
||||
|
||||
@Injectable()
|
||||
export class UserListService implements OnApplicationShutdown {
|
||||
export class UserListService implements OnApplicationShutdown, OnModuleInit {
|
||||
public static TooManyUsersError = class extends Error {};
|
||||
|
||||
public membersCache: RedisKVCache<Set<string>>;
|
||||
private roleService: RoleService;
|
||||
|
||||
constructor(
|
||||
private moduleRef: ModuleRef,
|
||||
|
||||
@Inject(DI.redis)
|
||||
private redisClient: Redis.Redis,
|
||||
|
||||
@@ -38,7 +42,6 @@ export class UserListService implements OnApplicationShutdown {
|
||||
|
||||
private userEntityService: UserEntityService,
|
||||
private idService: IdService,
|
||||
private roleService: RoleService,
|
||||
private globalEventService: GlobalEventService,
|
||||
private proxyAccountService: ProxyAccountService,
|
||||
private queueService: QueueService,
|
||||
@@ -54,6 +57,10 @@ export class UserListService implements OnApplicationShutdown {
|
||||
this.redisForSub.on('message', this.onMessage);
|
||||
}
|
||||
|
||||
async onModuleInit() {
|
||||
this.roleService = this.moduleRef.get(RoleService.name);
|
||||
}
|
||||
|
||||
@bindThis
|
||||
private async onMessage(_: string, data: string): Promise<void> {
|
||||
const obj = JSON.parse(data);
|
||||
|
@@ -7,5 +7,6 @@ import type { MiNote } from '@/models/Note.js';
|
||||
|
||||
// eslint-disable-next-line import/no-default-export
|
||||
export default function(note: MiNote): boolean {
|
||||
// sync with NoteCreateService.isQuote
|
||||
return note.renoteId != null && (note.text != null || note.hasPoll || (note.fileIds != null && note.fileIds.length > 0));
|
||||
}
|
||||
|
@@ -40,6 +40,7 @@ import { packedUserListMembershipSchema, packedUserListSchema } from '@/models/j
|
||||
import { packedAnnouncementSchema } from '@/models/json-schema/announcement.js';
|
||||
import { packedSigninSchema } from '@/models/json-schema/signin.js';
|
||||
import { packedRoleLiteSchema, packedRoleSchema } from '@/models/json-schema/role.js';
|
||||
import { packedAdSchema } from '@/models/json-schema/ad.js';
|
||||
|
||||
export const refs = {
|
||||
UserLite: packedUserLiteSchema,
|
||||
@@ -52,6 +53,7 @@ export const refs = {
|
||||
|
||||
UserList: packedUserListSchema,
|
||||
UserListMembership: packedUserListMembershipSchema,
|
||||
Ad: packedAdSchema,
|
||||
Announcement: packedAnnouncementSchema,
|
||||
App: packedAppSchema,
|
||||
Note: packedNoteSchema,
|
||||
|
@@ -495,6 +495,13 @@ export class MiMeta {
|
||||
})
|
||||
public manifestJsonOverride: string;
|
||||
|
||||
@Column('varchar', {
|
||||
length: 1024,
|
||||
array: true,
|
||||
default: '{}',
|
||||
})
|
||||
public bannedEmailDomains: string[];
|
||||
|
||||
@Column('varchar', {
|
||||
length: 1024, array: true, default: '{ "admin", "administrator", "root", "system", "maintainer", "host", "mod", "moderator", "owner", "superuser", "staff", "auth", "i", "me", "everyone", "all", "mention", "mentions", "example", "user", "users", "account", "accounts", "official", "help", "helps", "support", "supports", "info", "information", "informations", "announce", "announces", "announcement", "announcements", "notice", "notification", "notifications", "dev", "developer", "developers", "tech", "misskey" }',
|
||||
})
|
||||
|
64
packages/backend/src/models/json-schema/ad.ts
Normal file
64
packages/backend/src/models/json-schema/ad.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
export const packedAdSchema = {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
format: 'id',
|
||||
example: 'xxxxxxxxxx',
|
||||
},
|
||||
expiresAt: {
|
||||
type: 'string',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
format: 'date-time',
|
||||
},
|
||||
startsAt: {
|
||||
type: 'string',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
format: 'date-time',
|
||||
},
|
||||
place: {
|
||||
type: 'string',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
},
|
||||
priority: {
|
||||
type: 'string',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
},
|
||||
ratio: {
|
||||
type: 'number',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
},
|
||||
url: {
|
||||
type: 'string',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
},
|
||||
imageUrl: {
|
||||
type: 'string',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
},
|
||||
memo: {
|
||||
type: 'string',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
},
|
||||
dayOfWeek: {
|
||||
type: 'integer',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
},
|
||||
},
|
||||
} as const;
|
@@ -25,6 +25,11 @@ export const meta = {
|
||||
id: 'cb865949-8af5-4062-a88c-ef55e8786d1d',
|
||||
},
|
||||
},
|
||||
res: {
|
||||
type: 'object',
|
||||
optional: false, nullable: false,
|
||||
ref: 'User',
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -17,6 +17,12 @@ export const meta = {
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
res: {
|
||||
type: 'object',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
ref: 'Ad',
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
@@ -63,7 +69,18 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||
ad: ad,
|
||||
});
|
||||
|
||||
return ad;
|
||||
return {
|
||||
id: ad.id,
|
||||
expiresAt: ad.expiresAt.toISOString(),
|
||||
startsAt: ad.startsAt.toISOString(),
|
||||
dayOfWeek: ad.dayOfWeek,
|
||||
url: ad.url,
|
||||
imageUrl: ad.imageUrl,
|
||||
priority: ad.priority,
|
||||
ratio: ad.ratio,
|
||||
place: ad.place,
|
||||
memo: ad.memo,
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -16,6 +16,17 @@ export const meta = {
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
res: {
|
||||
type: 'array',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
items: {
|
||||
type: 'object',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
ref: 'Ad',
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
@@ -46,7 +57,18 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||
}
|
||||
const ads = await query.limit(ps.limit).getMany();
|
||||
|
||||
return ads;
|
||||
return ads.map(ad => ({
|
||||
id: ad.id,
|
||||
expiresAt: ad.expiresAt.toISOString(),
|
||||
startsAt: ad.startsAt.toISOString(),
|
||||
dayOfWeek: ad.dayOfWeek,
|
||||
url: ad.url,
|
||||
imageUrl: ad.imageUrl,
|
||||
memo: ad.memo,
|
||||
place: ad.place,
|
||||
priority: ad.priority,
|
||||
ratio: ad.ratio,
|
||||
}));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -31,6 +31,8 @@ export const meta = {
|
||||
id: 'f7a3462c-4e6e-4069-8421-b9bd4f4c3975',
|
||||
},
|
||||
},
|
||||
|
||||
ref: 'EmojiDetailed',
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -15,6 +15,16 @@ export const meta = {
|
||||
kind: 'read:admin',
|
||||
|
||||
tags: ['admin'],
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
tablename: { type: 'string' },
|
||||
indexname: { type: 'string' },
|
||||
},
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -16,6 +16,25 @@ export const meta = {
|
||||
|
||||
requireCredential: true,
|
||||
requireModerator: true,
|
||||
res: {
|
||||
type: 'array',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
items: {
|
||||
type: 'object',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
properties: {
|
||||
ip: { type: 'string' },
|
||||
createdAt: {
|
||||
type: 'string',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
format: 'date-time',
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -145,6 +145,14 @@ export const meta = {
|
||||
type: 'string',
|
||||
},
|
||||
},
|
||||
bannedEmailDomains: {
|
||||
type: 'array',
|
||||
optional: true, nullable: false,
|
||||
items: {
|
||||
type: 'string',
|
||||
optional: false, nullable: false,
|
||||
},
|
||||
},
|
||||
preservedUsernames: {
|
||||
type: 'array',
|
||||
optional: false, nullable: false,
|
||||
@@ -521,6 +529,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||
enableChartsForFederatedInstances: instance.enableChartsForFederatedInstances,
|
||||
enableServerMachineStats: instance.enableServerMachineStats,
|
||||
enableIdenticonGeneration: instance.enableIdenticonGeneration,
|
||||
bannedEmailDomains: instance.bannedEmailDomains,
|
||||
policies: { ...DEFAULT_POLICIES, ...instance.policies },
|
||||
manifestJsonOverride: instance.manifestJsonOverride,
|
||||
enableFanoutTimeline: instance.enableFanoutTimeline,
|
||||
|
@@ -28,6 +28,20 @@ export const meta = {
|
||||
id: '224eff5e-2488-4b18-b3e7-f50d94421648',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: { type: 'string', format: 'misskey:id' },
|
||||
createdAt: { type: 'string', format: 'date-time' },
|
||||
user: { ref: 'UserDetailed' },
|
||||
expiresAt: { type: 'string', format: 'date-time', nullable: true },
|
||||
},
|
||||
required: ['id', 'createdAt', 'user'],
|
||||
},
|
||||
}
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
@@ -80,7 +94,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||
id: assign.id,
|
||||
createdAt: this.idService.parse(assign.id).date.toISOString(),
|
||||
user: await this.userEntityService.pack(assign.user!, me, { detail: true }),
|
||||
expiresAt: assign.expiresAt,
|
||||
expiresAt: assign.expiresAt?.toISOString() ?? null,
|
||||
})));
|
||||
});
|
||||
}
|
||||
|
@@ -122,6 +122,7 @@ export const paramDef = {
|
||||
enableServerMachineStats: { type: 'boolean' },
|
||||
enableIdenticonGeneration: { type: 'boolean' },
|
||||
serverRules: { type: 'array', items: { type: 'string' } },
|
||||
bannedEmailDomains: { type: 'array', items: { type: 'string' } },
|
||||
preservedUsernames: { type: 'array', items: { type: 'string' } },
|
||||
manifestJsonOverride: { type: 'string' },
|
||||
enableFanoutTimeline: { type: 'boolean' },
|
||||
@@ -534,6 +535,10 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||
set.notesPerOneAd = ps.notesPerOneAd;
|
||||
}
|
||||
|
||||
if (ps.bannedEmailDomains !== undefined) {
|
||||
set.bannedEmailDomains = ps.bannedEmailDomains;
|
||||
}
|
||||
|
||||
const before = await this.metaService.fetch(true);
|
||||
|
||||
await this.metaService.update(set);
|
||||
|
@@ -11,6 +11,23 @@ export const meta = {
|
||||
requireCredential: false,
|
||||
|
||||
tags: ['meta'],
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
nullable: true,
|
||||
properties: {
|
||||
params: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
name: { type: 'string' },
|
||||
type: { type: 'string' },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -18,6 +18,92 @@ export const meta = {
|
||||
|
||||
allowGet: true,
|
||||
cacheSec: 60 * 60,
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
properties: {
|
||||
topSubInstances: {
|
||||
type: 'array',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
items: {
|
||||
properties: {
|
||||
id: { type: 'string' },
|
||||
firstRetrievedAt: { type: 'string' },
|
||||
host: { type: 'string' },
|
||||
usersCount: { type: 'number' },
|
||||
notesCount: { type: 'number' },
|
||||
followingCount: { type: 'number' },
|
||||
followersCount: { type: 'number' },
|
||||
isNotResponding: { type: 'boolean' },
|
||||
isSuspended: { type: 'boolean' },
|
||||
isBlocked: { type: 'boolean' },
|
||||
softwareName: { type: 'string' },
|
||||
softwareVersion: { type: 'string' },
|
||||
openRegistrations: { type: 'boolean' },
|
||||
name: { type: 'string' },
|
||||
description: { type: 'string' },
|
||||
maintainerName: { type: 'string' },
|
||||
maintainerEmail: { type: 'string' },
|
||||
isSilenced: { type: 'boolean' },
|
||||
iconUrl: { type: 'string' },
|
||||
faviconUrl: { type: 'string' },
|
||||
themeColor: { type: 'string' },
|
||||
infoUpdatedAt: {
|
||||
type: 'string',
|
||||
nullable: true,
|
||||
},
|
||||
latestRequestReceivedAt: {
|
||||
type: 'string',
|
||||
nullable: true,
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
otherFollowersCount: { type: 'number' },
|
||||
topPubInstances: {
|
||||
type: 'array',
|
||||
optional: false,
|
||||
nullable: false,
|
||||
items: {
|
||||
properties: {
|
||||
id: { type: 'string' },
|
||||
firstRetrievedAt: { type: 'string' },
|
||||
host: { type: 'string' },
|
||||
usersCount: { type: 'number' },
|
||||
notesCount: { type: 'number' },
|
||||
followingCount: { type: 'number' },
|
||||
followersCount: { type: 'number' },
|
||||
isNotResponding: { type: 'boolean' },
|
||||
isSuspended: { type: 'boolean' },
|
||||
isBlocked: { type: 'boolean' },
|
||||
softwareName: { type: 'string' },
|
||||
softwareVersion: { type: 'string' },
|
||||
openRegistrations: { type: 'boolean' },
|
||||
name: { type: 'string' },
|
||||
description: { type: 'string' },
|
||||
maintainerName: { type: 'string' },
|
||||
maintainerEmail: { type: 'string' },
|
||||
isSilenced: { type: 'boolean' },
|
||||
iconUrl: { type: 'string' },
|
||||
faviconUrl: { type: 'string' },
|
||||
themeColor: { type: 'string' },
|
||||
infoUpdatedAt: {
|
||||
type: 'string',
|
||||
nullable: true,
|
||||
},
|
||||
latestRequestReceivedAt: {
|
||||
type: 'string',
|
||||
nullable: true,
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
otherFollowingCount: { type: 'number' },
|
||||
},
|
||||
}
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -32,6 +32,18 @@ export const meta = {
|
||||
id: '693ba8ba-b486-40df-a174-72f8279b56a4',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
type: {
|
||||
type: 'string',
|
||||
},
|
||||
data: {
|
||||
type: 'string',
|
||||
},
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -16,6 +16,18 @@ export const meta = {
|
||||
requireCredential: false,
|
||||
allowGet: true,
|
||||
cacheSec: 60 * 3,
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
items: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -28,6 +28,12 @@ export const meta = {
|
||||
|
||||
errors: {
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
optional: false, nullable: false,
|
||||
ref: 'Flash',
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -16,6 +16,16 @@ export const meta = {
|
||||
requireCredential: false,
|
||||
allowGet: true,
|
||||
cacheSec: 60 * 1,
|
||||
res: {
|
||||
type: 'object',
|
||||
optional: false, nullable: false,
|
||||
properties: {
|
||||
count: {
|
||||
type: 'number',
|
||||
nullable: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -38,6 +38,16 @@ export const meta = {
|
||||
id: '798d6847-b1ed-4f9c-b1f9-163c42655995',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
nullable: false,
|
||||
optional: false,
|
||||
properties: {
|
||||
id: { type: 'string' },
|
||||
name: { type: 'string' },
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -42,6 +42,140 @@ export const meta = {
|
||||
id: 'bf32b864-449b-47b8-974e-f9a5468546f1',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
nullable: false,
|
||||
optional: false,
|
||||
properties: {
|
||||
rp: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
user: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
},
|
||||
name: {
|
||||
type: 'string',
|
||||
},
|
||||
displayName: {
|
||||
type: 'string',
|
||||
},
|
||||
},
|
||||
},
|
||||
challenge: {
|
||||
type: 'string',
|
||||
},
|
||||
pubKeyCredParams: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
type: {
|
||||
type: 'string',
|
||||
},
|
||||
alg: {
|
||||
type: 'number',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
timeout: {
|
||||
type: 'number',
|
||||
nullable: true,
|
||||
},
|
||||
excludeCredentials: {
|
||||
type: 'array',
|
||||
nullable: true,
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
},
|
||||
type: {
|
||||
type: 'string',
|
||||
},
|
||||
transports: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'string',
|
||||
enum: [
|
||||
"ble",
|
||||
"cable",
|
||||
"hybrid",
|
||||
"internal",
|
||||
"nfc",
|
||||
"smart-card",
|
||||
"usb",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
authenticatorSelection: {
|
||||
type: 'object',
|
||||
nullable: true,
|
||||
properties: {
|
||||
authenticatorAttachment: {
|
||||
type: 'string',
|
||||
enum: [
|
||||
"cross-platform",
|
||||
"platform",
|
||||
],
|
||||
},
|
||||
requireResidentKey: {
|
||||
type: 'boolean',
|
||||
},
|
||||
userVerification: {
|
||||
type: 'string',
|
||||
enum: [
|
||||
"discouraged",
|
||||
"preferred",
|
||||
"required",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
attestation: {
|
||||
type: 'string',
|
||||
nullable: true,
|
||||
enum: [
|
||||
"direct",
|
||||
"enterprise",
|
||||
"indirect",
|
||||
"none",
|
||||
],
|
||||
},
|
||||
extensions: {
|
||||
type: 'object',
|
||||
nullable: true,
|
||||
properties: {
|
||||
appid: {
|
||||
type: 'string',
|
||||
nullable: true,
|
||||
},
|
||||
credProps: {
|
||||
type: 'boolean',
|
||||
nullable: true,
|
||||
},
|
||||
hmacCreateSecret: {
|
||||
type: 'boolean',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -32,6 +32,19 @@ export const meta = {
|
||||
id: 'e428f177-c6ae-4e91-9c7e-334b1836f9aa',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
nullable: false,
|
||||
optional: false,
|
||||
properties: {
|
||||
qr: { type: 'string' },
|
||||
url: { type: 'string' },
|
||||
secret: { type: 'string' },
|
||||
label: { type: 'string' },
|
||||
issuer: { type: 'string' },
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -13,6 +13,37 @@ export const meta = {
|
||||
requireCredential: true,
|
||||
|
||||
secure: true,
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
format: 'misskey:id',
|
||||
},
|
||||
name: {
|
||||
type: 'string',
|
||||
},
|
||||
createdAt: {
|
||||
type: 'string',
|
||||
format: 'date-time',
|
||||
},
|
||||
lastUsedAt: {
|
||||
type: 'string',
|
||||
format: 'date-time',
|
||||
},
|
||||
permission: {
|
||||
type: 'array',
|
||||
uniqueItems: true,
|
||||
items: {
|
||||
type: 'string'
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
@@ -50,7 +81,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||
id: token.id,
|
||||
name: token.name ?? token.app?.name,
|
||||
createdAt: this.idService.parse(token.id).date.toISOString(),
|
||||
lastUsedAt: token.lastUsedAt,
|
||||
lastUsedAt: token.lastUsedAt?.toISOString(),
|
||||
permission: token.permission,
|
||||
})));
|
||||
});
|
||||
|
@@ -14,6 +14,36 @@ export const meta = {
|
||||
requireCredential: true,
|
||||
|
||||
secure: true,
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
format: 'misskey:id',
|
||||
},
|
||||
name: {
|
||||
type: 'string',
|
||||
},
|
||||
callbackUrl: {
|
||||
type: 'string',
|
||||
nullable: true,
|
||||
},
|
||||
permission: {
|
||||
type: 'array',
|
||||
uniqueItems: true,
|
||||
items: {
|
||||
type: 'string'
|
||||
},
|
||||
},
|
||||
isAuthorized: {
|
||||
type: 'boolean',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -67,6 +67,10 @@ export const meta = {
|
||||
id: 'b234a14e-9ebe-4581-8000-074b3c215962',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -9,6 +9,10 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
|
||||
|
||||
export const meta = {
|
||||
requireCredential: true,
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -18,6 +18,10 @@ export const meta = {
|
||||
id: '97a1e8e7-c0f7-47d2-957a-92e61256e01a',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
}
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -18,6 +18,10 @@ export const meta = {
|
||||
id: 'ac3ed68a-62f0-422b-a7bc-d5e09e8f6a6a',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
}
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -9,6 +9,10 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
|
||||
|
||||
export const meta = {
|
||||
requireCredential: true,
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -10,6 +10,28 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
|
||||
export const meta = {
|
||||
requireCredential: true,
|
||||
secure: true,
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
scopes: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'string',
|
||||
}
|
||||
}
|
||||
},
|
||||
domain: {
|
||||
type: 'string',
|
||||
nullable: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -47,6 +47,11 @@ export const meta = {
|
||||
id: 'a2defefb-f220-8849-0af6-17f816099323',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
ref: 'UserDetailed',
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -28,6 +28,33 @@ export const meta = {
|
||||
id: '87a9bb19-111e-4e37-81d3-a3e7426453b0',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
format: 'misskey:id'
|
||||
},
|
||||
userId: {
|
||||
type: 'string',
|
||||
format: 'misskey:id',
|
||||
},
|
||||
name: { type: 'string' },
|
||||
on: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'string',
|
||||
enum: webhookEventTypes,
|
||||
}
|
||||
},
|
||||
url: { type: 'string' },
|
||||
secret: { type: 'string' },
|
||||
active: { type: 'boolean' },
|
||||
latestSentAt: { type: 'string', format: 'date-time', nullable: true },
|
||||
latestStatus: { type: 'integer', nullable: true },
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
@@ -74,7 +101,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||
|
||||
this.globalEventService.publishInternalEvent('webhookCreated', webhook);
|
||||
|
||||
return webhook;
|
||||
return {
|
||||
id: webhook.id,
|
||||
userId: webhook.userId,
|
||||
name: webhook.name,
|
||||
on: webhook.on,
|
||||
url: webhook.url,
|
||||
secret: webhook.secret,
|
||||
active: webhook.active,
|
||||
latestSentAt: webhook.latestSentAt?.toISOString(),
|
||||
latestStatus: webhook.latestStatus,
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@
|
||||
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import { webhookEventTypes } from '@/models/Webhook.js';
|
||||
import type { WebhooksRepository } from '@/models/_.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
|
||||
@@ -14,6 +15,36 @@ export const meta = {
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'read:account',
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
format: 'misskey:id'
|
||||
},
|
||||
userId: {
|
||||
type: 'string',
|
||||
format: 'misskey:id',
|
||||
},
|
||||
name: { type: 'string' },
|
||||
on: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'string',
|
||||
enum: webhookEventTypes,
|
||||
}
|
||||
},
|
||||
url: { type: 'string' },
|
||||
secret: { type: 'string' },
|
||||
active: { type: 'boolean' },
|
||||
latestSentAt: { type: 'string', format: 'date-time', nullable: true },
|
||||
latestStatus: { type: 'integer', nullable: true },
|
||||
},
|
||||
}
|
||||
}
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
@@ -33,7 +64,19 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||
userId: me.id,
|
||||
});
|
||||
|
||||
return webhooks;
|
||||
return webhooks.map(webhook => (
|
||||
{
|
||||
id: webhook.id,
|
||||
userId: webhook.userId,
|
||||
name: webhook.name,
|
||||
on: webhook.on,
|
||||
url: webhook.url,
|
||||
secret: webhook.secret,
|
||||
active: webhook.active,
|
||||
latestSentAt: webhook.latestSentAt?.toISOString(),
|
||||
latestStatus: webhook.latestStatus,
|
||||
}
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@
|
||||
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import { webhookEventTypes } from '@/models/Webhook.js';
|
||||
import type { WebhooksRepository } from '@/models/_.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { ApiError } from '../../../error.js';
|
||||
@@ -23,6 +24,33 @@ export const meta = {
|
||||
id: '50f614d9-3047-4f7e-90d8-ad6b2d5fb098',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
format: 'misskey:id'
|
||||
},
|
||||
userId: {
|
||||
type: 'string',
|
||||
format: 'misskey:id',
|
||||
},
|
||||
name: { type: 'string' },
|
||||
on: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'string',
|
||||
enum: webhookEventTypes,
|
||||
}
|
||||
},
|
||||
url: { type: 'string' },
|
||||
secret: { type: 'string' },
|
||||
active: { type: 'boolean' },
|
||||
latestSentAt: { type: 'string', format: 'date-time', nullable: true },
|
||||
latestStatus: { type: 'integer', nullable: true },
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
@@ -49,7 +77,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||
throw new ApiError(meta.errors.noSuchWebhook);
|
||||
}
|
||||
|
||||
return webhook;
|
||||
return {
|
||||
id: webhook.id,
|
||||
userId: webhook.userId,
|
||||
name: webhook.name,
|
||||
on: webhook.on,
|
||||
url: webhook.url,
|
||||
secret: webhook.secret,
|
||||
active: webhook.active,
|
||||
latestSentAt: webhook.latestSentAt?.toISOString(),
|
||||
latestStatus: webhook.latestStatus,
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -24,6 +24,25 @@ export const meta = {
|
||||
id: '30aaaee3-4792-48dc-ab0d-cf501a575ac5',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
nullable: false,
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
format: 'misskey:id'
|
||||
},
|
||||
user: {
|
||||
type: 'object',
|
||||
ref: 'User'
|
||||
},
|
||||
},
|
||||
required: ['id', 'user'],
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -15,6 +15,53 @@ export const meta = {
|
||||
cacheSec: 60 * 1,
|
||||
|
||||
tags: ['meta'],
|
||||
res: {
|
||||
type: 'object',
|
||||
optional: false, nullable: false,
|
||||
properties: {
|
||||
machine: {
|
||||
type: 'string',
|
||||
nullable: false,
|
||||
},
|
||||
cpu: {
|
||||
type: 'object',
|
||||
nullable: false,
|
||||
properties: {
|
||||
model: {
|
||||
type: 'string',
|
||||
nullable: false,
|
||||
},
|
||||
cores: {
|
||||
type: 'number',
|
||||
nullable: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
mem: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
total: {
|
||||
type: 'number',
|
||||
nullable: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
fs: {
|
||||
type: 'object',
|
||||
nullable: false,
|
||||
properties: {
|
||||
total: {
|
||||
type: 'number',
|
||||
nullable: false,
|
||||
},
|
||||
used: {
|
||||
type: 'number',
|
||||
nullable: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -12,6 +12,30 @@ export const meta = {
|
||||
description: 'Endpoint for testing input validation.',
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
format: 'misskey:id'
|
||||
},
|
||||
required: {
|
||||
type: 'boolean',
|
||||
},
|
||||
string: {
|
||||
type: 'string',
|
||||
},
|
||||
default: {
|
||||
type: 'string',
|
||||
},
|
||||
nullableDefault: {
|
||||
type: 'string',
|
||||
default: 'hello',
|
||||
nullable: true,
|
||||
},
|
||||
}
|
||||
}
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -10,6 +10,21 @@ import { DI } from '@/di-symbols.js';
|
||||
|
||||
export const meta = {
|
||||
requireCredential: true,
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
name: {
|
||||
type: 'string',
|
||||
},
|
||||
unlockedAt: {
|
||||
type: 'number',
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -25,6 +25,35 @@ export const meta = {
|
||||
id: '7bc05c21-1d7a-41ae-88f1-66820f4dc686',
|
||||
},
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
nullable: false,
|
||||
properties: {
|
||||
id: {
|
||||
type: 'string',
|
||||
format: 'misskey:id',
|
||||
},
|
||||
createdAt: {
|
||||
type: 'string',
|
||||
format: 'date-time',
|
||||
},
|
||||
userId: {
|
||||
type: 'string',
|
||||
format: 'misskey:id',
|
||||
},
|
||||
user: {
|
||||
type: 'object',
|
||||
ref: 'User',
|
||||
},
|
||||
withReplies: {
|
||||
type: 'boolean',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@@ -10,9 +10,8 @@ process.env.NODE_ENV = 'test';
|
||||
process.env.FORCE_FOLLOW_REMOTE_USER_FOR_TESTING = 'true';
|
||||
|
||||
import * as assert from 'assert';
|
||||
import { signup, api, post, react, startServer, waitFire, sleep, uploadUrl, randomString } from '../utils.js';
|
||||
import { api, post, randomString, signup, sleep, startServer, uploadUrl } from '../utils.js';
|
||||
import type { INestApplicationContext } from '@nestjs/common';
|
||||
import type * as misskey from 'misskey-js';
|
||||
|
||||
function genHost() {
|
||||
return randomString() + '.example.com';
|
||||
@@ -366,8 +365,8 @@ describe('Timelines', () => {
|
||||
await api('/following/create', { userId: bob.id }, alice);
|
||||
await sleep(1000);
|
||||
const [bobFile, carolFile] = await Promise.all([
|
||||
uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png'),
|
||||
uploadUrl(carol, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png'),
|
||||
uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png'),
|
||||
uploadUrl(carol, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png'),
|
||||
]);
|
||||
const bobNote1 = await post(bob, { text: 'hi' });
|
||||
const bobNote2 = await post(bob, { fileIds: [bobFile.id] });
|
||||
@@ -666,7 +665,7 @@ describe('Timelines', () => {
|
||||
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
|
||||
const [alice, bob] = await Promise.all([signup(), signup()]);
|
||||
|
||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
|
||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
|
||||
const bobNote1 = await post(bob, { text: 'hi' });
|
||||
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
||||
|
||||
@@ -804,7 +803,7 @@ describe('Timelines', () => {
|
||||
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
|
||||
const [alice, bob] = await Promise.all([signup(), signup()]);
|
||||
|
||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
|
||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
|
||||
const bobNote1 = await post(bob, { text: 'hi' });
|
||||
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
||||
|
||||
@@ -1000,7 +999,7 @@ describe('Timelines', () => {
|
||||
|
||||
const list = await api('/users/lists/create', { name: 'list' }, alice).then(res => res.body);
|
||||
await api('/users/lists/push', { listId: list.id, userId: bob.id }, alice);
|
||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
|
||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
|
||||
const bobNote1 = await post(bob, { text: 'hi' });
|
||||
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
||||
|
||||
@@ -1159,7 +1158,7 @@ describe('Timelines', () => {
|
||||
test.concurrent('[withFiles: true] ファイル付きノートのみ含まれる', async () => {
|
||||
const [alice, bob] = await Promise.all([signup(), signup()]);
|
||||
|
||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/icon.png');
|
||||
const file = await uploadUrl(bob, 'https://raw.githubusercontent.com/misskey-dev/assets/main/public/icon.png');
|
||||
const bobNote1 = await post(bob, { text: 'hi' });
|
||||
const bobNote2 = await post(bob, { fileIds: [file.id] });
|
||||
|
||||
|
@@ -73,13 +73,21 @@ describe('RoleService', () => {
|
||||
CacheService,
|
||||
IdService,
|
||||
GlobalEventService,
|
||||
{
|
||||
provide: NotificationService,
|
||||
useFactory: () => ({
|
||||
createNotification: jest.fn(),
|
||||
}),
|
||||
},
|
||||
{
|
||||
provide: NotificationService.name,
|
||||
useExisting: NotificationService,
|
||||
},
|
||||
],
|
||||
})
|
||||
.useMocker((token) => {
|
||||
if (token === MetaService) {
|
||||
return { fetch: jest.fn() };
|
||||
} else if (token === NotificationService) {
|
||||
return { createNotification: jest.fn() };
|
||||
}
|
||||
if (typeof token === 'function') {
|
||||
const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
|
||||
@@ -98,6 +106,8 @@ describe('RoleService', () => {
|
||||
|
||||
metaService = app.get<MetaService>(MetaService) as jest.Mocked<MetaService>;
|
||||
notificationService = app.get<NotificationService>(NotificationService) as jest.Mocked<NotificationService>;
|
||||
|
||||
await roleService.onModuleInit();
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
@@ -284,10 +294,12 @@ describe('RoleService', () => {
|
||||
const user = await createUser();
|
||||
const role = await createRole({
|
||||
isPublic: true,
|
||||
name: 'a',
|
||||
});
|
||||
|
||||
await roleService.assign(user.id, role.id);
|
||||
|
||||
clock.uninstall();
|
||||
await sleep(100);
|
||||
|
||||
const assignments = await roleAssignmentsRepository.find({
|
||||
@@ -301,7 +313,7 @@ describe('RoleService', () => {
|
||||
expect(notificationService.createNotification).toHaveBeenCalled();
|
||||
expect(notificationService.createNotification.mock.lastCall![0]).toBe(user.id);
|
||||
expect(notificationService.createNotification.mock.lastCall![1]).toBe('roleAssigned');
|
||||
expect(notificationService.createNotification.mock.lastCall![2]).toBe({
|
||||
expect(notificationService.createNotification.mock.lastCall![2]).toEqual({
|
||||
roleId: role.id,
|
||||
});
|
||||
});
|
||||
@@ -310,10 +322,12 @@ describe('RoleService', () => {
|
||||
const user = await createUser();
|
||||
const role = await createRole({
|
||||
isPublic: false,
|
||||
name: 'a',
|
||||
});
|
||||
|
||||
await roleService.assign(user.id, role.id);
|
||||
|
||||
clock.uninstall();
|
||||
await sleep(100);
|
||||
|
||||
const assignments = await roleAssignmentsRepository.find({
|
||||
|
@@ -4,49 +4,70 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
-->
|
||||
|
||||
<template>
|
||||
<MkA :to="`/channels/${channel.id}`" class="eftoefju _panel" tabindex="-1">
|
||||
<div class="banner" :style="bannerStyle">
|
||||
<div class="fade"></div>
|
||||
<div class="name"><i class="ti ti-device-tv"></i> {{ channel.name }}</div>
|
||||
<div v-if="channel.isSensitive" class="sensitiveIndicator">{{ i18n.ts.sensitive }}</div>
|
||||
<div class="status">
|
||||
<div>
|
||||
<i class="ti ti-users ti-fw"></i>
|
||||
<I18n :src="i18n.ts._channel.usersCount" tag="span" style="margin-left: 4px;">
|
||||
<template #n>
|
||||
<b>{{ channel.usersCount }}</b>
|
||||
</template>
|
||||
</I18n>
|
||||
</div>
|
||||
<div>
|
||||
<i class="ti ti-pencil ti-fw"></i>
|
||||
<I18n :src="i18n.ts._channel.notesCount" tag="span" style="margin-left: 4px;">
|
||||
<template #n>
|
||||
<b>{{ channel.notesCount }}</b>
|
||||
</template>
|
||||
</I18n>
|
||||
<div style="position: relative;">
|
||||
<MkA :to="`/channels/${channel.id}`" class="eftoefju _panel" tabindex="-1" @click="updateLastReadedAt">
|
||||
<div class="banner" :style="bannerStyle">
|
||||
<div class="fade"></div>
|
||||
<div class="name"><i class="ti ti-device-tv"></i> {{ channel.name }}</div>
|
||||
<div v-if="channel.isSensitive" class="sensitiveIndicator">{{ i18n.ts.sensitive }}</div>
|
||||
<div class="status">
|
||||
<div>
|
||||
<i class="ti ti-users ti-fw"></i>
|
||||
<I18n :src="i18n.ts._channel.usersCount" tag="span" style="margin-left: 4px;">
|
||||
<template #n>
|
||||
<b>{{ channel.usersCount }}</b>
|
||||
</template>
|
||||
</I18n>
|
||||
</div>
|
||||
<div>
|
||||
<i class="ti ti-pencil ti-fw"></i>
|
||||
<I18n :src="i18n.ts._channel.notesCount" tag="span" style="margin-left: 4px;">
|
||||
<template #n>
|
||||
<b>{{ channel.notesCount }}</b>
|
||||
</template>
|
||||
</I18n>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<article v-if="channel.description">
|
||||
<p :title="channel.description">{{ channel.description.length > 85 ? channel.description.slice(0, 85) + '…' : channel.description }}</p>
|
||||
</article>
|
||||
<footer>
|
||||
<span v-if="channel.lastNotedAt">
|
||||
{{ i18n.ts.updatedAt }}: <MkTime :time="channel.lastNotedAt"/>
|
||||
</span>
|
||||
</footer>
|
||||
</MkA>
|
||||
<article v-if="channel.description">
|
||||
<p :title="channel.description">{{ channel.description.length > 85 ? channel.description.slice(0, 85) + '…' : channel.description }}</p>
|
||||
</article>
|
||||
<footer>
|
||||
<span v-if="channel.lastNotedAt">
|
||||
{{ i18n.ts.updatedAt }}: <MkTime :time="channel.lastNotedAt"/>
|
||||
</span>
|
||||
</footer>
|
||||
</MkA>
|
||||
<div
|
||||
v-if="channel.lastNotedAt && (channel.isFavorited || channel.isFollowing) && (!lastReadedAt || Date.parse(channel.lastNotedAt) > lastReadedAt)"
|
||||
class="indicator"
|
||||
></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { computed } from 'vue';
|
||||
import { computed, ref, watch } from 'vue';
|
||||
import { i18n } from '@/i18n.js';
|
||||
import { miLocalStorage } from '@/local-storage.js';
|
||||
|
||||
const props = defineProps<{
|
||||
channel: Record<string, any>;
|
||||
}>();
|
||||
|
||||
const getLastReadedAt = (): number | null => {
|
||||
return miLocalStorage.getItemAsJson(`channelLastReadedAt:${props.channel.id}`) ?? null;
|
||||
};
|
||||
|
||||
const lastReadedAt = ref(getLastReadedAt());
|
||||
|
||||
watch(() => props.channel.id, () => {
|
||||
lastReadedAt.value = getLastReadedAt();
|
||||
});
|
||||
|
||||
const updateLastReadedAt = () => {
|
||||
lastReadedAt.value = props.channel.lastNotedAt ? Date.parse(props.channel.lastNotedAt) : Date.now();
|
||||
};
|
||||
|
||||
const bannerStyle = computed(() => {
|
||||
if (props.channel.bannerUrl) {
|
||||
return { backgroundImage: `url(${props.channel.bannerUrl})` };
|
||||
@@ -170,4 +191,17 @@ const bannerStyle = computed(() => {
|
||||
}
|
||||
}
|
||||
|
||||
.indicator {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
transform: translate(25%, -25%);
|
||||
background-color: var(--accent);
|
||||
border: solid var(--bg) 4px;
|
||||
border-radius: 100%;
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
aspect-ratio: 1 / 1;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
@@ -23,7 +23,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
</template>
|
||||
</I18n>
|
||||
<div style="margin-top: 0.2em;">
|
||||
<MkLink target="_blank" url="https://misskey-hub.net/docs/donate.html">{{ i18n.ts.learnMore }}</MkLink>
|
||||
<MkLink target="_blank" url="https://misskey-hub.net/docs/for-users/resources/donate/">{{ i18n.ts.learnMore }}</MkLink>
|
||||
</div>
|
||||
</div>
|
||||
<div class="_buttons">
|
||||
|
@@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<template v-for="(item, i) in items2">
|
||||
<div v-if="item.type === 'divider'" role="separator" :class="$style.divider"></div>
|
||||
<span v-else-if="item.type === 'label'" role="menuitem" :class="[$style.label, $style.item]">
|
||||
<span>{{ item.text }}</span>
|
||||
<span style="opacity: 0.7;">{{ item.text }}</span>
|
||||
</span>
|
||||
<span v-else-if="item.type === 'pending'" role="menuitem" :tabindex="i" :class="[$style.pending, $style.item]">
|
||||
<span><MkEllipsis/></span>
|
||||
@@ -23,32 +23,44 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<MkA v-else-if="item.type === 'link'" role="menuitem" :to="item.to" :tabindex="i" class="_button" :class="$style.item" @click.passive="close(true)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
|
||||
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]"></i>
|
||||
<MkAvatar v-if="item.avatar" :user="item.avatar" :class="$style.avatar"/>
|
||||
<span>{{ item.text }}</span>
|
||||
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
|
||||
<div :class="$style.item_content">
|
||||
<span :class="$style.item_content_text">{{ item.text }}</span>
|
||||
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
|
||||
</div>
|
||||
</MkA>
|
||||
<a v-else-if="item.type === 'a'" role="menuitem" :href="item.href" :target="item.target" :download="item.download" :tabindex="i" class="_button" :class="$style.item" @click="close(true)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
|
||||
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]"></i>
|
||||
<span>{{ item.text }}</span>
|
||||
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
|
||||
<div :class="$style.item_content">
|
||||
<span :class="$style.item_content_text">{{ item.text }}</span>
|
||||
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
|
||||
</div>
|
||||
</a>
|
||||
<button v-else-if="item.type === 'user'" role="menuitem" :tabindex="i" class="_button" :class="[$style.item, { [$style.active]: item.active }]" :disabled="item.active" @click="clicked(item.action, $event)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
|
||||
<MkAvatar :user="item.user" :class="$style.avatar"/><MkUserName :user="item.user"/>
|
||||
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
|
||||
<div v-if="item.indicate" :class="$style.item_content">
|
||||
<span :class="$style.indicator"><i class="_indicatorCircle"></i></span>
|
||||
</div>
|
||||
</button>
|
||||
<button v-else-if="item.type === 'switch'" role="menuitemcheckbox" :tabindex="i" class="_button" :class="[$style.item, $style.switch, { [$style.switchDisabled]: item.disabled } ]" @click="switchItem(item)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
|
||||
<MkSwitchButton :class="$style.switchButton" :checked="item.ref" :disabled="item.disabled" @toggle="switchItem(item)"/>
|
||||
<span :class="$style.switchText">{{ item.text }}</span>
|
||||
<div :class="$style.item_content">
|
||||
<span :class="[$style.item_content_text, $style.switchText]">{{ item.text }}</span>
|
||||
</div>
|
||||
</button>
|
||||
<button v-else-if="item.type === 'parent'" class="_button" role="menuitem" :tabindex="i" :class="[$style.item, $style.parent, { [$style.childShowing]: childShowingItem === item }]" @mouseenter="preferClick ? null : showChildren(item, $event)" @click="!preferClick ? null : showChildren(item, $event)">
|
||||
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]" style="pointer-events: none;"></i>
|
||||
<span style="pointer-events: none;">{{ item.text }}</span>
|
||||
<span :class="$style.caret" style="pointer-events: none;"><i class="ti ti-chevron-right ti-fw"></i></span>
|
||||
<div :class="$style.item_content">
|
||||
<span :class="$style.item_content_text" style="pointer-events: none;">{{ item.text }}</span>
|
||||
<span :class="$style.caret" style="pointer-events: none;"><i class="ti ti-chevron-right ti-fw"></i></span>
|
||||
</div>
|
||||
</button>
|
||||
<button v-else :tabindex="i" class="_button" role="menuitem" :class="[$style.item, { [$style.danger]: item.danger, [$style.active]: item.active }]" :disabled="item.active" @click="clicked(item.action, $event)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
|
||||
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]"></i>
|
||||
<MkAvatar v-if="item.avatar" :user="item.avatar" :class="$style.avatar"/>
|
||||
<span>{{ item.text }}</span>
|
||||
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
|
||||
<div :class="$style.item_content">
|
||||
<span :class="$style.item_content_text">{{ item.text }}</span>
|
||||
<span v-if="item.indicate" :class="$style.indicator"><i class="_indicatorCircle"></i></span>
|
||||
</div>
|
||||
</button>
|
||||
</template>
|
||||
<span v-if="items2.length === 0" :class="[$style.none, $style.item]">
|
||||
@@ -228,6 +240,7 @@ onBeforeUnmount(() => {
|
||||
.root {
|
||||
padding: 8px 0;
|
||||
box-sizing: border-box;
|
||||
max-width: 100vw;
|
||||
min-width: 200px;
|
||||
overflow: auto;
|
||||
overscroll-behavior: contain;
|
||||
@@ -267,7 +280,8 @@ onBeforeUnmount(() => {
|
||||
}
|
||||
|
||||
.item {
|
||||
display: block;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
padding: 5px 16px;
|
||||
width: 100%;
|
||||
@@ -340,10 +354,6 @@ onBeforeUnmount(() => {
|
||||
pointer-events: none;
|
||||
font-size: 0.7em;
|
||||
padding-bottom: 4px;
|
||||
|
||||
> span {
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
|
||||
&.pending {
|
||||
@@ -373,6 +383,22 @@ onBeforeUnmount(() => {
|
||||
}
|
||||
}
|
||||
|
||||
.item_content {
|
||||
width: 100%;
|
||||
max-width: 100vw;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 8px;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.item_content_text {
|
||||
max-width: calc(100vw - 4rem);
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.switch {
|
||||
position: relative;
|
||||
display: flex;
|
||||
@@ -406,6 +432,7 @@ onBeforeUnmount(() => {
|
||||
|
||||
.icon {
|
||||
margin-right: 8px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.caret {
|
||||
@@ -419,9 +446,8 @@ onBeforeUnmount(() => {
|
||||
}
|
||||
|
||||
.indicator {
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
left: 13px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: var(--indicator);
|
||||
font-size: 12px;
|
||||
animation: blink 1s infinite;
|
||||
|
@@ -38,6 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<span v-else-if="emailState === 'unavailable:used'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.used }}</span>
|
||||
<span v-else-if="emailState === 'unavailable:format'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.format }}</span>
|
||||
<span v-else-if="emailState === 'unavailable:disposable'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.disposable }}</span>
|
||||
<span v-else-if="emailState === 'unavailable:banned'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.banned }}</span>
|
||||
<span v-else-if="emailState === 'unavailable:mx'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.mx }}</span>
|
||||
<span v-else-if="emailState === 'unavailable:smtp'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts._emailUnavailable.smtp }}</span>
|
||||
<span v-else-if="emailState === 'unavailable'" style="color: var(--error)"><i class="ti ti-alert-triangle ti-fw"></i> {{ i18n.ts.unavailable }}</span>
|
||||
@@ -110,7 +111,7 @@ const retypedPassword = ref<string>('');
|
||||
const invitationCode = ref<string>('');
|
||||
const email = ref('');
|
||||
const usernameState = ref<null | 'wait' | 'ok' | 'unavailable' | 'error' | 'invalid-format' | 'min-range' | 'max-range'>(null);
|
||||
const emailState = ref<null | 'wait' | 'ok' | 'unavailable:used' | 'unavailable:format' | 'unavailable:disposable' | 'unavailable:mx' | 'unavailable:smtp' | 'unavailable' | 'error'>(null);
|
||||
const emailState = ref<null | 'wait' | 'ok' | 'unavailable:used' | 'unavailable:format' | 'unavailable:disposable' | 'unavailable:banned' | 'unavailable:mx' | 'unavailable:smtp' | 'unavailable' | 'error'>(null);
|
||||
const passwordStrength = ref<'' | 'low' | 'medium' | 'high'>('');
|
||||
const passwordRetypeState = ref<null | 'match' | 'not-match'>(null);
|
||||
const submitting = ref<boolean>(false);
|
||||
@@ -209,6 +210,7 @@ function onChangeEmail(): void {
|
||||
result.reason === 'used' ? 'unavailable:used' :
|
||||
result.reason === 'format' ? 'unavailable:format' :
|
||||
result.reason === 'disposable' ? 'unavailable:disposable' :
|
||||
result.reason === 'banned' ? 'unavailable:banned' :
|
||||
result.reason === 'mx' ? 'unavailable:mx' :
|
||||
result.reason === 'smtp' ? 'unavailable:smtp' :
|
||||
'unavailable';
|
||||
|
@@ -45,7 +45,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<template #label>{{ i18n.ts.basicNotesBeforeCreateAccount }}</template>
|
||||
<template #suffix><i v-if="agreeNote" class="ti ti-check" style="color: var(--success)"></i></template>
|
||||
|
||||
<a href="https://misskey-hub.net/docs/notes.html" class="_link" target="_blank">{{ i18n.ts.basicNotesBeforeCreateAccount }} <i class="ti ti-external-link"></i></a>
|
||||
<a href="https://misskey-hub.net/docs/for-users/onboarding/warning/" class="_link" target="_blank">{{ i18n.ts.basicNotesBeforeCreateAccount }} <i class="ti ti-external-link"></i></a>
|
||||
|
||||
<MkSwitch :modelValue="agreeNote" style="margin-top: 16px;" data-cy-signup-rules-notes-agree @update:modelValue="updateAgreeNote">{{ i18n.ts.agree }}</MkSwitch>
|
||||
</MkFolder>
|
||||
|
@@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<div :class="$style.divider"></div>
|
||||
<I18n :src="i18n.ts._initialTutorial._timeline.description3" tag="div" style="padding: 0 16px;">
|
||||
<template #link>
|
||||
<a href="https://misskey-hub.net/docs/features/timeline.html" target="_blank" class="_link">{{ i18n.ts.help }}</a>
|
||||
<a href="https://misskey-hub.net/docs/for-users/features/timeline/" target="_blank" class="_link">{{ i18n.ts.help }}</a>
|
||||
</template>
|
||||
</I18n>
|
||||
|
||||
|
@@ -130,7 +130,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<div style="font-size: 120%;">{{ i18n.ts._initialTutorial._done.title }}</div>
|
||||
<I18n :src="i18n.ts._initialTutorial._done.description" tag="div" style="padding: 0 16px;">
|
||||
<template #link>
|
||||
<a href="https://misskey-hub.net/help.html" target="_blank" class="_link">{{ i18n.ts.help }}</a>
|
||||
<a href="https://misskey-hub.net/docs/for-users/" target="_blank" class="_link">{{ i18n.ts.help }}</a>
|
||||
</template>
|
||||
</I18n>
|
||||
<div>{{ i18n.t('_initialAccountSetting.haveFun', { name: instance.name ?? host }) }}</div>
|
||||
|
@@ -123,13 +123,13 @@ function showMenu(ev) {
|
||||
text: i18n.ts.help,
|
||||
icon: 'ti ti-help-circle',
|
||||
action: () => {
|
||||
window.open('https://misskey-hub.net/help.md', '_blank', 'noopener');
|
||||
window.open('https://misskey-hub.net/docs/for-users/', '_blank', 'noopener');
|
||||
},
|
||||
}], ev.currentTarget ?? ev.target);
|
||||
}
|
||||
|
||||
function exploreOtherServers() {
|
||||
window.open('https://join.misskey.page/instances', '_blank', 'noopener');
|
||||
window.open('https://misskey-hub.net/servers/', '_blank', 'noopener');
|
||||
}
|
||||
</script>
|
||||
|
||||
|
@@ -53,7 +53,7 @@ import { PageHeaderItem } from '@/types/page-header.js';
|
||||
const props = withDefaults(defineProps<{
|
||||
tabs?: Tab[];
|
||||
tab?: string;
|
||||
actions?: PageHeaderItem[];
|
||||
actions?: PageHeaderItem[] | null;
|
||||
thin?: boolean;
|
||||
displayMyAvatar?: boolean;
|
||||
}>(), {
|
||||
|
@@ -35,7 +35,8 @@ type Keys =
|
||||
`themes:${string}` |
|
||||
`aiscript:${string}` |
|
||||
'lastEmojisFetchedAt' | // DEPRECATED, stored in indexeddb (13.9.0~)
|
||||
'emojis' // DEPRECATED, stored in indexeddb (13.9.0~);
|
||||
'emojis' | // DEPRECATED, stored in indexeddb (13.9.0~);
|
||||
`channelLastReadedAt:${string}`
|
||||
|
||||
export const miLocalStorage = {
|
||||
getItem: (key: Keys): string | null => window.localStorage.getItem(key),
|
||||
|
@@ -22,7 +22,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<button v-if="thereIsTreasure" class="_button treasure" @click="getTreasure"><img src="/fluent-emoji/1f3c6.png" class="treasureImg"></button>
|
||||
</div>
|
||||
<div style="text-align: center;">
|
||||
{{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a>
|
||||
{{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/about-misskey/" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a>
|
||||
</div>
|
||||
<div v-if="$i != null" style="text-align: center;">
|
||||
<MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Misskey</MkButton>
|
||||
@@ -139,73 +139,73 @@ import { $i } from '@/account.js';
|
||||
|
||||
const patronsWithIcon = [{
|
||||
name: 'カイヤン',
|
||||
icon: 'https://misskey-hub.net/patrons/a2820716883e408cb87773e377ce7c8d.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/a2820716883e408cb87773e377ce7c8d.jpg',
|
||||
}, {
|
||||
name: 'だれかさん',
|
||||
icon: 'https://misskey-hub.net/patrons/f7409b5e5a88477a9b9d740c408de125.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/f7409b5e5a88477a9b9d740c408de125.jpg',
|
||||
}, {
|
||||
name: 'narazaka',
|
||||
icon: 'https://misskey-hub.net/patrons/e3affff31ffb4877b1196c7360abc3e5.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/e3affff31ffb4877b1196c7360abc3e5.jpg',
|
||||
}, {
|
||||
name: 'ひとぅ',
|
||||
icon: 'https://misskey-hub.net/patrons/8cc0d0a0a6d84c88bca1aedabf6ed5ab.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/8cc0d0a0a6d84c88bca1aedabf6ed5ab.jpg',
|
||||
}, {
|
||||
name: 'ぱーこ',
|
||||
icon: 'https://misskey-hub.net/patrons/79c6602ffade489e8df2fcf2c2bc5d9d.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/79c6602ffade489e8df2fcf2c2bc5d9d.jpg',
|
||||
}, {
|
||||
name: 'わっほー☆',
|
||||
icon: 'https://misskey-hub.net/patrons/d31d5d13924443a082f3da7966318a0a.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/d31d5d13924443a082f3da7966318a0a.jpg',
|
||||
}, {
|
||||
name: 'mollinaca',
|
||||
icon: 'https://misskey-hub.net/patrons/ceb36b8f66e549bdadb3b90d5da62314.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/ceb36b8f66e549bdadb3b90d5da62314.jpg',
|
||||
}, {
|
||||
name: '坂本龍',
|
||||
icon: 'https://misskey-hub.net/patrons/a631cf8b490145cf8dbbe4e7508cfbc2.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/a631cf8b490145cf8dbbe4e7508cfbc2.jpg',
|
||||
}, {
|
||||
name: 'takke',
|
||||
icon: 'https://misskey-hub.net/patrons/6c3327e626c046f2914fbcd9f7557935.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/6c3327e626c046f2914fbcd9f7557935.jpg',
|
||||
}, {
|
||||
name: 'ぺんぎん',
|
||||
icon: 'https://misskey-hub.net/patrons/6a652e0534ff4cb1836e7ce4968d76a7.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/6a652e0534ff4cb1836e7ce4968d76a7.jpg',
|
||||
}, {
|
||||
name: 'かみらえっと',
|
||||
icon: 'https://misskey-hub.net/patrons/be1326bda7d940a482f3758ffd9ffaf6.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/be1326bda7d940a482f3758ffd9ffaf6.jpg',
|
||||
}, {
|
||||
name: 'へてて',
|
||||
icon: 'https://misskey-hub.net/patrons/0431eacd7c6843d09de8ea9984307e86.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/0431eacd7c6843d09de8ea9984307e86.jpg',
|
||||
}, {
|
||||
name: 'spinlock',
|
||||
icon: 'https://misskey-hub.net/patrons/6a1cebc819d540a78bf20e9e3115baa8.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/6a1cebc819d540a78bf20e9e3115baa8.jpg',
|
||||
}, {
|
||||
name: 'じゅくま',
|
||||
icon: 'https://misskey-hub.net/patrons/3e56bdac69dd42f7a06e0f12cf2fc895.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/3e56bdac69dd42f7a06e0f12cf2fc895.jpg',
|
||||
}, {
|
||||
name: '清遊あみ',
|
||||
icon: 'https://misskey-hub.net/patrons/de25195b88e940a388388bea2e7637d8.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/de25195b88e940a388388bea2e7637d8.jpg',
|
||||
}, {
|
||||
name: 'Nagi8410',
|
||||
icon: 'https://misskey-hub.net/patrons/31b102ab4fc540ed806b0461575d38be.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/31b102ab4fc540ed806b0461575d38be.jpg',
|
||||
}, {
|
||||
name: '山岡士郎',
|
||||
icon: 'https://misskey-hub.net/patrons/84b9056341684266bb1eda3e680d094d.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/84b9056341684266bb1eda3e680d094d.jpg',
|
||||
}, {
|
||||
name: 'よもやまたろう',
|
||||
icon: 'https://misskey-hub.net/patrons/4273c9cce50d445f8f7d0f16113d6d7f.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/4273c9cce50d445f8f7d0f16113d6d7f.jpg',
|
||||
}, {
|
||||
name: '花咲ももか',
|
||||
icon: 'https://misskey-hub.net/patrons/8c9b2b9128cb4fee99f04bb4f86f2efa.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/8c9b2b9128cb4fee99f04bb4f86f2efa.jpg',
|
||||
}, {
|
||||
name: 'カガミ',
|
||||
icon: 'https://misskey-hub.net/patrons/226ea3a4617749548580ec2d9a263e24.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/226ea3a4617749548580ec2d9a263e24.jpg',
|
||||
}, {
|
||||
name: 'フランギ・シュウ',
|
||||
icon: 'https://misskey-hub.net/patrons/3016d37e35f3430b90420176c912d304.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/3016d37e35f3430b90420176c912d304.jpg',
|
||||
}, {
|
||||
name: '百日紅',
|
||||
icon: 'https://misskey-hub.net/patrons/302dce2898dd457ba03c3f7dc037900b.jpg',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/302dce2898dd457ba03c3f7dc037900b.jpg',
|
||||
}, {
|
||||
name: 'taichan',
|
||||
icon: 'https://misskey-hub.net/patrons/f981ab0159fb4e2c998e05f7263e1cd9.png',
|
||||
icon: 'https://assets.misskey-hub.net/patrons/f981ab0159fb4e2c998e05f7263e1cd9.png',
|
||||
}];
|
||||
|
||||
const patrons = [
|
||||
|
@@ -74,15 +74,26 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<template #label>Enable</template>
|
||||
</MkSwitch>
|
||||
<MkSwitch v-model="enableVerifymailApi" @update:modelValue="save">
|
||||
<template #label>Use Verifymail API</template>
|
||||
<template #label>Use Verifymail.io API</template>
|
||||
</MkSwitch>
|
||||
<MkInput v-model="verifymailAuthKey" @update:modelValue="save">
|
||||
<template #prefix><i class="ti ti-key"></i></template>
|
||||
<template #label>Verifymail API Auth Key</template>
|
||||
<template #label>Verifymail.io API Auth Key</template>
|
||||
</MkInput>
|
||||
</div>
|
||||
</MkFolder>
|
||||
|
||||
<MkFolder>
|
||||
<template #label>Banned Email Domains</template>
|
||||
|
||||
<div class="_gaps_m">
|
||||
<MkTextarea v-model="bannedEmailDomains">
|
||||
<template #label>Banned Email Domains List</template>
|
||||
</MkTextarea>
|
||||
<MkButton primary @click="save"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton>
|
||||
</div>
|
||||
</MkFolder>
|
||||
|
||||
<MkFolder>
|
||||
<template #label>Log IP address</template>
|
||||
<template v-if="enableIpLogging" #suffix>Enabled</template>
|
||||
@@ -124,6 +135,7 @@ import FormSuspense from '@/components/form/suspense.vue';
|
||||
import MkRange from '@/components/MkRange.vue';
|
||||
import MkInput from '@/components/MkInput.vue';
|
||||
import MkButton from '@/components/MkButton.vue';
|
||||
import MkTextarea from '@/components/MkTextarea.vue';
|
||||
import * as os from '@/os.js';
|
||||
import { fetchInstance } from '@/instance.js';
|
||||
import { i18n } from '@/i18n.js';
|
||||
@@ -141,6 +153,7 @@ const enableIpLogging = ref<boolean>(false);
|
||||
const enableActiveEmailValidation = ref<boolean>(false);
|
||||
const enableVerifymailApi = ref<boolean>(false);
|
||||
const verifymailAuthKey = ref<string | null>(null);
|
||||
const bannedEmailDomains = ref<string>('');
|
||||
|
||||
async function init() {
|
||||
const meta = await os.api('admin/meta');
|
||||
@@ -161,6 +174,7 @@ async function init() {
|
||||
enableActiveEmailValidation.value = meta.enableActiveEmailValidation;
|
||||
enableVerifymailApi.value = meta.enableVerifymailApi;
|
||||
verifymailAuthKey.value = meta.verifymailAuthKey;
|
||||
bannedEmailDomains.value = meta.bannedEmailDomains.join('\n');
|
||||
}
|
||||
|
||||
function save() {
|
||||
@@ -180,6 +194,7 @@ function save() {
|
||||
enableActiveEmailValidation: enableActiveEmailValidation.value,
|
||||
enableVerifymailApi: enableVerifymailApi.value,
|
||||
verifymailAuthKey: verifymailAuthKey.value,
|
||||
bannedEmailDomains: bannedEmailDomains.value.split('\n'),
|
||||
}).then(() => {
|
||||
fetchInstance();
|
||||
});
|
||||
|
@@ -12,7 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<XChannelFollowButton :channel="channel" :full="true" :class="$style.subscribe"/>
|
||||
<MkButton v-if="favorited" v-tooltip="i18n.ts.unfavorite" asLike class="button" rounded primary :class="$style.favorite" @click="unfavorite()"><i class="ti ti-star"></i></MkButton>
|
||||
<MkButton v-else v-tooltip="i18n.ts.favorite" asLike class="button" rounded :class="$style.favorite" @click="favorite()"><i class="ti ti-star"></i></MkButton>
|
||||
<div :style="{ backgroundImage: channel.bannerUrl ? `url(${channel.bannerUrl})` : null }" :class="$style.banner">
|
||||
<div :style="{ backgroundImage: channel.bannerUrl ? `url(${channel.bannerUrl})` : undefined }" :class="$style.banner">
|
||||
<div :class="$style.bannerStatus">
|
||||
<div><i class="ti ti-users ti-fw"></i><I18n :src="i18n.ts._channel.usersCount" tag="span" style="margin-left: 4px;"><template #n><b>{{ channel.usersCount }}</b></template></I18n></div>
|
||||
<div><i class="ti ti-pencil ti-fw"></i><I18n :src="i18n.ts._channel.notesCount" tag="span" style="margin-left: 4px;"><template #n><b>{{ channel.notesCount }}</b></template></I18n></div>
|
||||
@@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
<MkFoldableSection>
|
||||
<template #header><i class="ti ti-pin ti-fw" style="margin-right: 0.5em;"></i>{{ i18n.ts.pinnedNotes }}</template>
|
||||
<div v-if="channel.pinnedNotes.length > 0" class="_gaps">
|
||||
<div v-if="channel.pinnedNotes && channel.pinnedNotes.length > 0" class="_gaps">
|
||||
<MkNote v-for="note in channel.pinnedNotes" :key="note.id" class="_panel" :note="note"/>
|
||||
</div>
|
||||
</MkFoldableSection>
|
||||
@@ -38,7 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<!-- スマホ・タブレットの場合、キーボードが表示されると投稿が見づらくなるので、デスクトップ場合のみ自動でフォーカスを当てる -->
|
||||
<MkPostForm v-if="$i && defaultStore.reactiveState.showFixedPostFormInChannel.value" :channel="channel" class="post-form _panel" fixed :autofocus="deviceKind === 'desktop'"/>
|
||||
|
||||
<MkTimeline :key="channelId" src="channel" :channel="channelId" @before="before" @after="after"/>
|
||||
<MkTimeline :key="channelId" src="channel" :channel="channelId" @before="before" @after="after" @note="miLocalStorage.setItemAsJson(`channelLastReadedAt:${channel.id}`, Date.now())"/>
|
||||
</div>
|
||||
<div v-else-if="tab === 'featured'">
|
||||
<MkNotes :pagination="featuredPagination"/>
|
||||
@@ -69,6 +69,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { computed, watch, ref } from 'vue';
|
||||
import * as Misskey from 'misskey-js';
|
||||
import MkPostForm from '@/components/MkPostForm.vue';
|
||||
import MkTimeline from '@/components/MkTimeline.vue';
|
||||
import XChannelFollowButton from '@/components/MkChannelFollowButton.vue';
|
||||
@@ -89,6 +90,7 @@ import MkFoldableSection from '@/components/MkFoldableSection.vue';
|
||||
import { PageHeaderItem } from '@/types/page-header.js';
|
||||
import { isSupportShare } from '@/scripts/navigator.js';
|
||||
import copyToClipboard from '@/scripts/copy-to-clipboard.js';
|
||||
import { miLocalStorage } from '@/local-storage.js';
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
@@ -97,7 +99,7 @@ const props = defineProps<{
|
||||
}>();
|
||||
|
||||
const tab = ref('overview');
|
||||
const channel = ref(null);
|
||||
const channel = ref<Misskey.entities.Channel | null>(null);
|
||||
const favorited = ref(false);
|
||||
const searchQuery = ref('');
|
||||
const searchPagination = ref();
|
||||
@@ -114,14 +116,23 @@ watch(() => props.channelId, async () => {
|
||||
channel.value = await os.api('channels/show', {
|
||||
channelId: props.channelId,
|
||||
});
|
||||
favorited.value = channel.value.isFavorited;
|
||||
favorited.value = channel.value.isFavorited ?? false;
|
||||
if (favorited.value || channel.value.isFollowing) {
|
||||
tab.value = 'timeline';
|
||||
}
|
||||
|
||||
if ((favorited.value || channel.value.isFollowing) && channel.value.lastNotedAt) {
|
||||
const lastReadedAt: number = miLocalStorage.getItemAsJson(`channelLastReadedAt:${channel.value.id}`) ?? 0;
|
||||
const lastNotedAt = Date.parse(channel.value.lastNotedAt);
|
||||
|
||||
if (lastNotedAt > lastReadedAt) {
|
||||
miLocalStorage.setItemAsJson(`channelLastReadedAt:${channel.value.id}`, lastNotedAt);
|
||||
}
|
||||
}
|
||||
}, { immediate: true });
|
||||
|
||||
function edit() {
|
||||
router.push(`/channels/${channel.value.id}/edit`);
|
||||
router.push(`/channels/${channel.value?.id}/edit`);
|
||||
}
|
||||
|
||||
function openPostForm() {
|
||||
@@ -131,6 +142,8 @@ function openPostForm() {
|
||||
}
|
||||
|
||||
function favorite() {
|
||||
if (!channel.value) return;
|
||||
|
||||
os.apiWithDialog('channels/favorite', {
|
||||
channelId: channel.value.id,
|
||||
}).then(() => {
|
||||
@@ -139,6 +152,8 @@ function favorite() {
|
||||
}
|
||||
|
||||
async function unfavorite() {
|
||||
if (!channel.value) return;
|
||||
|
||||
const confirm = await os.confirm({
|
||||
type: 'warning',
|
||||
text: i18n.ts.unfavoriteConfirm,
|
||||
@@ -152,6 +167,8 @@ async function unfavorite() {
|
||||
}
|
||||
|
||||
async function search() {
|
||||
if (!channel.value) return;
|
||||
|
||||
const query = searchQuery.value.toString().trim();
|
||||
|
||||
if (query == null) return;
|
||||
@@ -176,6 +193,10 @@ const headerActions = computed(() => {
|
||||
icon: 'ti ti-link',
|
||||
text: i18n.ts.copyUrl,
|
||||
handler: async (): Promise<void> => {
|
||||
if (!channel.value) {
|
||||
console.warn('failed to copy channel URL. channel.value is null.');
|
||||
return;
|
||||
}
|
||||
copyToClipboard(`${url}/channels/${channel.value.id}`);
|
||||
os.success();
|
||||
},
|
||||
@@ -186,9 +207,14 @@ const headerActions = computed(() => {
|
||||
icon: 'ti ti-share',
|
||||
text: i18n.ts.share,
|
||||
handler: async (): Promise<void> => {
|
||||
if (!channel.value) {
|
||||
console.warn('failed to share channel. channel.value is null.');
|
||||
return;
|
||||
}
|
||||
|
||||
navigator.share({
|
||||
title: channel.value.name,
|
||||
text: channel.value.description,
|
||||
text: channel.value.description ?? undefined,
|
||||
url: `${url}/channels/${channel.value.id}`,
|
||||
});
|
||||
},
|
||||
|
@@ -30,7 +30,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
// SPECIFICATION: https://misskey-hub.net/docs/features/share-form.html
|
||||
// SPECIFICATION: https://misskey-hub.net/docs/for-users/features/share-form/
|
||||
|
||||
import { ref, computed } from 'vue';
|
||||
import * as Misskey from 'misskey-js';
|
||||
|
@@ -48,6 +48,7 @@ import { definePageMetadata } from '@/scripts/page-metadata.js';
|
||||
import { antennasCache, userListsCache } from '@/cache.js';
|
||||
import { deviceKind } from '@/scripts/device-kind.js';
|
||||
import { MenuItem } from '@/types/menu.js';
|
||||
import { miLocalStorage } from '@/local-storage.js';
|
||||
|
||||
provide('shouldOmitHeaderTitle', true);
|
||||
|
||||
@@ -125,12 +126,17 @@ async function chooseChannel(ev: MouseEvent): Promise<void> {
|
||||
limit: 100,
|
||||
});
|
||||
const items: MenuItem[] = [
|
||||
...channels.map(channel => ({
|
||||
type: 'link' as const,
|
||||
text: channel.name,
|
||||
indicate: channel.hasUnreadNote,
|
||||
to: `/channels/${channel.id}`,
|
||||
})),
|
||||
...channels.map(channel => {
|
||||
const lastReadedAt = miLocalStorage.getItemAsJson(`channelLastReadedAt:${channel.id}`) ?? null;
|
||||
const hasUnreadNote = (lastReadedAt && channel.lastNotedAt) ? Date.parse(channel.lastNotedAt) > lastReadedAt : !!(!lastReadedAt && channel.lastNotedAt);
|
||||
|
||||
return {
|
||||
type: 'link' as const,
|
||||
text: channel.name,
|
||||
indicate: hasUnreadNote,
|
||||
to: `/channels/${channel.id}`,
|
||||
};
|
||||
}),
|
||||
(channels.length === 0 ? undefined : { type: 'divider' }),
|
||||
{
|
||||
type: 'link' as const,
|
||||
|
@@ -101,7 +101,7 @@ export function openInstanceMenu(ev: MouseEvent) {
|
||||
text: i18n.ts.help,
|
||||
icon: 'ti ti-help-circle',
|
||||
action: () => {
|
||||
window.open('https://misskey-hub.net/help.html', '_blank', 'noopener');
|
||||
window.open('https://misskey-hub.net/docs/for-users/', '_blank', 'noopener');
|
||||
},
|
||||
}, ($i) ? {
|
||||
text: i18n.ts._initialTutorial.launchTutorial,
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* version: 2023.12.0-beta.5-io
|
||||
* generatedAt: 2023-12-21T02:55:40.813Z
|
||||
* version: 2023.12.0-io
|
||||
* generatedAt: 2023-12-23T11:38:40.644Z
|
||||
*/
|
||||
|
||||
import type { SwitchCaseResponseType } from '../api.js';
|
||||
@@ -11,7 +11,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/meta', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -22,7 +22,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/abuse-user-reports', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -33,7 +33,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *No*
|
||||
* **Credential required**: *No* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/accounts/create', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -44,7 +44,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/accounts/delete', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -55,7 +55,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/accounts/find-by-email', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -66,7 +66,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/ad/create', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -77,7 +77,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/ad/delete', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -88,7 +88,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/ad/list', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -99,7 +99,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/ad/update', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -110,7 +110,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/announcements/create', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -121,7 +121,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/announcements/delete', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -132,7 +132,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/announcements/list', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -143,7 +143,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/announcements/update', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -198,7 +198,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/avatar-decorations/create', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -209,7 +209,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/avatar-decorations/delete', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -220,7 +220,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/avatar-decorations/list', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -231,7 +231,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/avatar-decorations/update', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -242,7 +242,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/delete-all-files-of-a-user', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -253,7 +253,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/unset-user-avatar', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -264,7 +264,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/unset-user-banner', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -275,7 +275,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/drive/clean-remote-files', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -286,7 +286,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/drive/cleanup', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -297,7 +297,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/drive/files', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -308,7 +308,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/drive/show-file', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -319,7 +319,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/add-aliases-bulk', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -330,7 +330,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/add', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -341,7 +341,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/copy', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -352,7 +352,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/delete-bulk', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -363,7 +363,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/delete', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -374,8 +374,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Internal Endpoint**: This endpoint is an API for the misskey mainframe and is not intended for use by third parties.
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/import-zip', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -386,7 +385,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/list-remote', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -397,7 +396,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/list', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -408,7 +407,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/remove-aliases-bulk', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -419,7 +418,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/set-aliases-bulk', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -430,7 +429,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/set-category-bulk', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -441,7 +440,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/set-license-bulk', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -452,7 +451,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/emoji/update', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -463,7 +462,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/federation/delete-all-files', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -474,7 +473,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/federation/refresh-remote-instance-metadata', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -485,7 +484,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/federation/remove-all-following', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -496,7 +495,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/federation/update-instance', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -507,7 +506,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/get-index-stats', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -518,7 +517,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/get-table-stats', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -529,7 +528,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/get-user-ips', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -540,7 +539,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/invite/create', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -551,7 +550,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/invite/list', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -562,7 +561,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/promo/create', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -573,7 +572,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/queue/clear', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -584,7 +583,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/queue/deliver-delayed', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -595,7 +594,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/queue/inbox-delayed', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -606,7 +605,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/queue/promote', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -617,7 +616,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/queue/stats', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -628,7 +627,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/relays/add', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -639,7 +638,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/relays/list', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -650,7 +649,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/relays/remove', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -661,7 +660,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/reset-password', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -672,7 +671,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/resolve-abuse-user-report', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -683,7 +682,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/send-email', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -694,7 +693,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/server-info', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -705,7 +704,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/show-moderation-logs', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -716,7 +715,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/show-user', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -727,7 +726,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/show-users', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -738,7 +737,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/suspend-user', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -749,7 +748,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/unsuspend-user', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -760,7 +759,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/update-meta', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -771,7 +770,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/delete-account', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -782,7 +781,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/update-user-note', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -793,7 +792,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/roles/create', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -804,7 +803,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/roles/delete', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -815,7 +814,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/roles/list', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -826,7 +825,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/roles/show', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -837,7 +836,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/roles/update', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -848,7 +847,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/roles/assign', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -859,7 +858,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/roles/unassign', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -870,7 +869,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *Yes*
|
||||
* **Credential required**: *Yes* / **Permission**: *write:admin*
|
||||
*/
|
||||
request<E extends 'admin/roles/update-default-policies', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
@@ -881,7 +880,7 @@ declare module '../api.js' {
|
||||
/**
|
||||
* No description provided.
|
||||
*
|
||||
* **Credential required**: *No*
|
||||
* **Credential required**: *No* / **Permission**: *read:admin*
|
||||
*/
|
||||
request<E extends 'admin/roles/users', P extends Endpoints[E]['req']>(
|
||||
endpoint: E,
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* version: 2023.12.0-beta.5-io
|
||||
* generatedAt: 2023-12-21T02:55:40.808Z
|
||||
* version: 2023.12.0-io
|
||||
* generatedAt: 2023-12-23T11:38:40.635Z
|
||||
*/
|
||||
|
||||
import type {
|
||||
@@ -13,9 +13,12 @@ import type {
|
||||
AdminAccountsCreateResponse,
|
||||
AdminAccountsDeleteRequest,
|
||||
AdminAccountsFindByEmailRequest,
|
||||
AdminAccountsFindByEmailResponse,
|
||||
AdminAdCreateRequest,
|
||||
AdminAdCreateResponse,
|
||||
AdminAdDeleteRequest,
|
||||
AdminAdListRequest,
|
||||
AdminAdListResponse,
|
||||
AdminAdUpdateRequest,
|
||||
AdminAnnouncementsCreateRequest,
|
||||
AdminAnnouncementsCreateResponse,
|
||||
@@ -61,8 +64,10 @@ import type {
|
||||
AdminFederationRefreshRemoteInstanceMetadataRequest,
|
||||
AdminFederationRemoveAllFollowingRequest,
|
||||
AdminFederationUpdateInstanceRequest,
|
||||
AdminGetIndexStatsResponse,
|
||||
AdminGetTableStatsResponse,
|
||||
AdminGetUserIpsRequest,
|
||||
AdminGetUserIpsResponse,
|
||||
AdminInviteCreateRequest,
|
||||
AdminInviteCreateResponse,
|
||||
AdminInviteListRequest,
|
||||
@@ -104,6 +109,7 @@ import type {
|
||||
AdminRolesUnassignRequest,
|
||||
AdminRolesUpdateDefaultPoliciesRequest,
|
||||
AdminRolesUsersRequest,
|
||||
AdminRolesUsersResponse,
|
||||
AnnouncementsRequest,
|
||||
AnnouncementsResponse,
|
||||
AntennasCreateRequest,
|
||||
@@ -231,6 +237,7 @@ import type {
|
||||
EmailAddressAvailableRequest,
|
||||
EmailAddressAvailableResponse,
|
||||
EndpointRequest,
|
||||
EndpointResponse,
|
||||
EndpointsResponse,
|
||||
FederationFollowersRequest,
|
||||
FederationFollowersResponse,
|
||||
@@ -244,6 +251,7 @@ import type {
|
||||
FederationUsersRequest,
|
||||
FederationUsersResponse,
|
||||
FederationStatsRequest,
|
||||
FederationStatsResponse,
|
||||
FollowingCreateRequest,
|
||||
FollowingCreateResponse,
|
||||
FollowingDeleteRequest,
|
||||
@@ -273,6 +281,7 @@ import type {
|
||||
GalleryPostsUnlikeRequest,
|
||||
GalleryPostsUpdateRequest,
|
||||
GalleryPostsUpdateResponse,
|
||||
GetOnlineUsersCountResponse,
|
||||
GetAvatarDecorationsResponse,
|
||||
HashtagsListRequest,
|
||||
HashtagsListResponse,
|
||||
@@ -286,14 +295,19 @@ import type {
|
||||
IResponse,
|
||||
I2faDoneRequest,
|
||||
I2faKeyDoneRequest,
|
||||
I2faKeyDoneResponse,
|
||||
I2faPasswordLessRequest,
|
||||
I2faRegisterKeyRequest,
|
||||
I2faRegisterKeyResponse,
|
||||
I2faRegisterRequest,
|
||||
I2faRegisterResponse,
|
||||
I2faUpdateKeyRequest,
|
||||
I2faRemoveKeyRequest,
|
||||
I2faUnregisterRequest,
|
||||
IAppsRequest,
|
||||
IAppsResponse,
|
||||
IAuthorizedAppsRequest,
|
||||
IAuthorizedAppsResponse,
|
||||
IClaimAchievementRequest,
|
||||
IChangePasswordRequest,
|
||||
IDeleteAccountRequest,
|
||||
@@ -322,11 +336,16 @@ import type {
|
||||
IReadAnnouncementRequest,
|
||||
IRegenerateTokenRequest,
|
||||
IRegistryGetAllRequest,
|
||||
IRegistryGetAllResponse,
|
||||
IRegistryGetDetailRequest,
|
||||
IRegistryGetDetailResponse,
|
||||
IRegistryGetRequest,
|
||||
IRegistryGetResponse,
|
||||
IRegistryKeysWithTypeRequest,
|
||||
IRegistryKeysWithTypeResponse,
|
||||
IRegistryKeysRequest,
|
||||
IRegistryRemoveRequest,
|
||||
IRegistryScopesWithDomainResponse,
|
||||
IRegistrySetRequest,
|
||||
IRevokeTokenRequest,
|
||||
ISigninHistoryRequest,
|
||||
@@ -334,11 +353,16 @@ import type {
|
||||
IUnpinRequest,
|
||||
IUnpinResponse,
|
||||
IUpdateEmailRequest,
|
||||
IUpdateEmailResponse,
|
||||
IUpdateRequest,
|
||||
IUpdateResponse,
|
||||
IMoveRequest,
|
||||
IMoveResponse,
|
||||
IWebhooksCreateRequest,
|
||||
IWebhooksCreateResponse,
|
||||
IWebhooksListResponse,
|
||||
IWebhooksShowRequest,
|
||||
IWebhooksShowResponse,
|
||||
IWebhooksUpdateRequest,
|
||||
IWebhooksDeleteRequest,
|
||||
InviteCreateResponse,
|
||||
@@ -426,6 +450,7 @@ import type {
|
||||
PagesUnlikeRequest,
|
||||
PagesUpdateRequest,
|
||||
FlashCreateRequest,
|
||||
FlashCreateResponse,
|
||||
FlashDeleteRequest,
|
||||
FlashFeaturedResponse,
|
||||
FlashLikeRequest,
|
||||
@@ -444,10 +469,12 @@ import type {
|
||||
RolesShowRequest,
|
||||
RolesShowResponse,
|
||||
RolesUsersRequest,
|
||||
RolesUsersResponse,
|
||||
RolesNotesRequest,
|
||||
RolesNotesResponse,
|
||||
RequestResetPasswordRequest,
|
||||
ResetPasswordRequest,
|
||||
ServerInfoResponse,
|
||||
StatsResponse,
|
||||
SwShowRegistrationRequest,
|
||||
SwShowRegistrationResponse,
|
||||
@@ -457,6 +484,7 @@ import type {
|
||||
SwRegisterResponse,
|
||||
SwUnregisterRequest,
|
||||
TestRequest,
|
||||
TestResponse,
|
||||
UsernameAvailableRequest,
|
||||
UsernameAvailableResponse,
|
||||
UsersRequest,
|
||||
@@ -490,6 +518,7 @@ import type {
|
||||
UsersListsCreateFromPublicResponse,
|
||||
UsersListsUpdateMembershipRequest,
|
||||
UsersListsGetMembershipsRequest,
|
||||
UsersListsGetMembershipsResponse,
|
||||
UsersNotesRequest,
|
||||
UsersNotesResponse,
|
||||
UsersPagesRequest,
|
||||
@@ -512,9 +541,12 @@ import type {
|
||||
UsersStatsRequest,
|
||||
UsersStatsResponse,
|
||||
UsersAchievementsRequest,
|
||||
UsersAchievementsResponse,
|
||||
UsersUpdateMemoRequest,
|
||||
FetchRssRequest,
|
||||
FetchRssResponse,
|
||||
FetchExternalResourcesRequest,
|
||||
FetchExternalResourcesResponse,
|
||||
RetentionResponse,
|
||||
} from './entities.js';
|
||||
|
||||
@@ -523,10 +555,10 @@ export type Endpoints = {
|
||||
'admin/abuse-user-reports': { req: AdminAbuseUserReportsRequest; res: AdminAbuseUserReportsResponse };
|
||||
'admin/accounts/create': { req: AdminAccountsCreateRequest; res: AdminAccountsCreateResponse };
|
||||
'admin/accounts/delete': { req: AdminAccountsDeleteRequest; res: EmptyResponse };
|
||||
'admin/accounts/find-by-email': { req: AdminAccountsFindByEmailRequest; res: EmptyResponse };
|
||||
'admin/ad/create': { req: AdminAdCreateRequest; res: EmptyResponse };
|
||||
'admin/accounts/find-by-email': { req: AdminAccountsFindByEmailRequest; res: AdminAccountsFindByEmailResponse };
|
||||
'admin/ad/create': { req: AdminAdCreateRequest; res: AdminAdCreateResponse };
|
||||
'admin/ad/delete': { req: AdminAdDeleteRequest; res: EmptyResponse };
|
||||
'admin/ad/list': { req: AdminAdListRequest; res: EmptyResponse };
|
||||
'admin/ad/list': { req: AdminAdListRequest; res: AdminAdListResponse };
|
||||
'admin/ad/update': { req: AdminAdUpdateRequest; res: EmptyResponse };
|
||||
'admin/announcements/create': { req: AdminAnnouncementsCreateRequest; res: AdminAnnouncementsCreateResponse };
|
||||
'admin/announcements/delete': { req: AdminAnnouncementsDeleteRequest; res: EmptyResponse };
|
||||
@@ -564,9 +596,9 @@ export type Endpoints = {
|
||||
'admin/federation/refresh-remote-instance-metadata': { req: AdminFederationRefreshRemoteInstanceMetadataRequest; res: EmptyResponse };
|
||||
'admin/federation/remove-all-following': { req: AdminFederationRemoveAllFollowingRequest; res: EmptyResponse };
|
||||
'admin/federation/update-instance': { req: AdminFederationUpdateInstanceRequest; res: EmptyResponse };
|
||||
'admin/get-index-stats': { req: EmptyRequest; res: EmptyResponse };
|
||||
'admin/get-index-stats': { req: EmptyRequest; res: AdminGetIndexStatsResponse };
|
||||
'admin/get-table-stats': { req: EmptyRequest; res: AdminGetTableStatsResponse };
|
||||
'admin/get-user-ips': { req: AdminGetUserIpsRequest; res: EmptyResponse };
|
||||
'admin/get-user-ips': { req: AdminGetUserIpsRequest; res: AdminGetUserIpsResponse };
|
||||
'admin/invite/create': { req: AdminInviteCreateRequest; res: AdminInviteCreateResponse };
|
||||
'admin/invite/list': { req: AdminInviteListRequest; res: AdminInviteListResponse };
|
||||
'admin/promo/create': { req: AdminPromoCreateRequest; res: EmptyResponse };
|
||||
@@ -598,7 +630,7 @@ export type Endpoints = {
|
||||
'admin/roles/assign': { req: AdminRolesAssignRequest; res: EmptyResponse };
|
||||
'admin/roles/unassign': { req: AdminRolesUnassignRequest; res: EmptyResponse };
|
||||
'admin/roles/update-default-policies': { req: AdminRolesUpdateDefaultPoliciesRequest; res: EmptyResponse };
|
||||
'admin/roles/users': { req: AdminRolesUsersRequest; res: EmptyResponse };
|
||||
'admin/roles/users': { req: AdminRolesUsersRequest; res: AdminRolesUsersResponse };
|
||||
'announcements': { req: AnnouncementsRequest; res: AnnouncementsResponse };
|
||||
'antennas/create': { req: AntennasCreateRequest; res: AntennasCreateResponse };
|
||||
'antennas/delete': { req: AntennasDeleteRequest; res: EmptyResponse };
|
||||
@@ -672,7 +704,7 @@ export type Endpoints = {
|
||||
'drive/folders/update': { req: DriveFoldersUpdateRequest; res: DriveFoldersUpdateResponse };
|
||||
'drive/stream': { req: DriveStreamRequest; res: DriveStreamResponse };
|
||||
'email-address/available': { req: EmailAddressAvailableRequest; res: EmailAddressAvailableResponse };
|
||||
'endpoint': { req: EndpointRequest; res: EmptyResponse };
|
||||
'endpoint': { req: EndpointRequest; res: EndpointResponse };
|
||||
'endpoints': { req: EmptyRequest; res: EndpointsResponse };
|
||||
'export-custom-emojis': { req: EmptyRequest; res: EmptyResponse };
|
||||
'federation/followers': { req: FederationFollowersRequest; res: FederationFollowersResponse };
|
||||
@@ -681,7 +713,7 @@ export type Endpoints = {
|
||||
'federation/show-instance': { req: FederationShowInstanceRequest; res: FederationShowInstanceResponse };
|
||||
'federation/update-remote-user': { req: FederationUpdateRemoteUserRequest; res: EmptyResponse };
|
||||
'federation/users': { req: FederationUsersRequest; res: FederationUsersResponse };
|
||||
'federation/stats': { req: FederationStatsRequest; res: EmptyResponse };
|
||||
'federation/stats': { req: FederationStatsRequest; res: FederationStatsResponse };
|
||||
'following/create': { req: FollowingCreateRequest; res: FollowingCreateResponse };
|
||||
'following/delete': { req: FollowingDeleteRequest; res: FollowingDeleteResponse };
|
||||
'following/update': { req: FollowingUpdateRequest; res: FollowingUpdateResponse };
|
||||
@@ -700,7 +732,7 @@ export type Endpoints = {
|
||||
'gallery/posts/show': { req: GalleryPostsShowRequest; res: GalleryPostsShowResponse };
|
||||
'gallery/posts/unlike': { req: GalleryPostsUnlikeRequest; res: EmptyResponse };
|
||||
'gallery/posts/update': { req: GalleryPostsUpdateRequest; res: GalleryPostsUpdateResponse };
|
||||
'get-online-users-count': { req: EmptyRequest; res: EmptyResponse };
|
||||
'get-online-users-count': { req: EmptyRequest; res: GetOnlineUsersCountResponse };
|
||||
'get-avatar-decorations': { req: EmptyRequest; res: GetAvatarDecorationsResponse };
|
||||
'hashtags/list': { req: HashtagsListRequest; res: HashtagsListResponse };
|
||||
'hashtags/search': { req: HashtagsSearchRequest; res: HashtagsSearchResponse };
|
||||
@@ -709,15 +741,15 @@ export type Endpoints = {
|
||||
'hashtags/users': { req: HashtagsUsersRequest; res: HashtagsUsersResponse };
|
||||
'i': { req: EmptyRequest; res: IResponse };
|
||||
'i/2fa/done': { req: I2faDoneRequest; res: EmptyResponse };
|
||||
'i/2fa/key-done': { req: I2faKeyDoneRequest; res: EmptyResponse };
|
||||
'i/2fa/key-done': { req: I2faKeyDoneRequest; res: I2faKeyDoneResponse };
|
||||
'i/2fa/password-less': { req: I2faPasswordLessRequest; res: EmptyResponse };
|
||||
'i/2fa/register-key': { req: I2faRegisterKeyRequest; res: EmptyResponse };
|
||||
'i/2fa/register': { req: I2faRegisterRequest; res: EmptyResponse };
|
||||
'i/2fa/register-key': { req: I2faRegisterKeyRequest; res: I2faRegisterKeyResponse };
|
||||
'i/2fa/register': { req: I2faRegisterRequest; res: I2faRegisterResponse };
|
||||
'i/2fa/update-key': { req: I2faUpdateKeyRequest; res: EmptyResponse };
|
||||
'i/2fa/remove-key': { req: I2faRemoveKeyRequest; res: EmptyResponse };
|
||||
'i/2fa/unregister': { req: I2faUnregisterRequest; res: EmptyResponse };
|
||||
'i/apps': { req: IAppsRequest; res: EmptyResponse };
|
||||
'i/authorized-apps': { req: IAuthorizedAppsRequest; res: EmptyResponse };
|
||||
'i/apps': { req: IAppsRequest; res: IAppsResponse };
|
||||
'i/authorized-apps': { req: IAuthorizedAppsRequest; res: IAuthorizedAppsResponse };
|
||||
'i/claim-achievement': { req: IClaimAchievementRequest; res: EmptyResponse };
|
||||
'i/change-password': { req: IChangePasswordRequest; res: EmptyResponse };
|
||||
'i/delete-account': { req: IDeleteAccountRequest; res: EmptyResponse };
|
||||
@@ -744,23 +776,23 @@ export type Endpoints = {
|
||||
'i/read-all-unread-notes': { req: EmptyRequest; res: EmptyResponse };
|
||||
'i/read-announcement': { req: IReadAnnouncementRequest; res: EmptyResponse };
|
||||
'i/regenerate-token': { req: IRegenerateTokenRequest; res: EmptyResponse };
|
||||
'i/registry/get-all': { req: IRegistryGetAllRequest; res: EmptyResponse };
|
||||
'i/registry/get-detail': { req: IRegistryGetDetailRequest; res: EmptyResponse };
|
||||
'i/registry/get': { req: IRegistryGetRequest; res: EmptyResponse };
|
||||
'i/registry/keys-with-type': { req: IRegistryKeysWithTypeRequest; res: EmptyResponse };
|
||||
'i/registry/get-all': { req: IRegistryGetAllRequest; res: IRegistryGetAllResponse };
|
||||
'i/registry/get-detail': { req: IRegistryGetDetailRequest; res: IRegistryGetDetailResponse };
|
||||
'i/registry/get': { req: IRegistryGetRequest; res: IRegistryGetResponse };
|
||||
'i/registry/keys-with-type': { req: IRegistryKeysWithTypeRequest; res: IRegistryKeysWithTypeResponse };
|
||||
'i/registry/keys': { req: IRegistryKeysRequest; res: EmptyResponse };
|
||||
'i/registry/remove': { req: IRegistryRemoveRequest; res: EmptyResponse };
|
||||
'i/registry/scopes-with-domain': { req: EmptyRequest; res: EmptyResponse };
|
||||
'i/registry/scopes-with-domain': { req: EmptyRequest; res: IRegistryScopesWithDomainResponse };
|
||||
'i/registry/set': { req: IRegistrySetRequest; res: EmptyResponse };
|
||||
'i/revoke-token': { req: IRevokeTokenRequest; res: EmptyResponse };
|
||||
'i/signin-history': { req: ISigninHistoryRequest; res: ISigninHistoryResponse };
|
||||
'i/unpin': { req: IUnpinRequest; res: IUnpinResponse };
|
||||
'i/update-email': { req: IUpdateEmailRequest; res: EmptyResponse };
|
||||
'i/update-email': { req: IUpdateEmailRequest; res: IUpdateEmailResponse };
|
||||
'i/update': { req: IUpdateRequest; res: IUpdateResponse };
|
||||
'i/move': { req: IMoveRequest; res: EmptyResponse };
|
||||
'i/webhooks/create': { req: IWebhooksCreateRequest; res: EmptyResponse };
|
||||
'i/webhooks/list': { req: EmptyRequest; res: EmptyResponse };
|
||||
'i/webhooks/show': { req: IWebhooksShowRequest; res: EmptyResponse };
|
||||
'i/move': { req: IMoveRequest; res: IMoveResponse };
|
||||
'i/webhooks/create': { req: IWebhooksCreateRequest; res: IWebhooksCreateResponse };
|
||||
'i/webhooks/list': { req: EmptyRequest; res: IWebhooksListResponse };
|
||||
'i/webhooks/show': { req: IWebhooksShowRequest; res: IWebhooksShowResponse };
|
||||
'i/webhooks/update': { req: IWebhooksUpdateRequest; res: EmptyResponse };
|
||||
'i/webhooks/delete': { req: IWebhooksDeleteRequest; res: EmptyResponse };
|
||||
'invite/create': { req: EmptyRequest; res: InviteCreateResponse };
|
||||
@@ -819,7 +851,7 @@ export type Endpoints = {
|
||||
'pages/show': { req: PagesShowRequest; res: PagesShowResponse };
|
||||
'pages/unlike': { req: PagesUnlikeRequest; res: EmptyResponse };
|
||||
'pages/update': { req: PagesUpdateRequest; res: EmptyResponse };
|
||||
'flash/create': { req: FlashCreateRequest; res: EmptyResponse };
|
||||
'flash/create': { req: FlashCreateRequest; res: FlashCreateResponse };
|
||||
'flash/delete': { req: FlashDeleteRequest; res: EmptyResponse };
|
||||
'flash/featured': { req: EmptyRequest; res: FlashFeaturedResponse };
|
||||
'flash/like': { req: FlashLikeRequest; res: EmptyResponse };
|
||||
@@ -833,18 +865,18 @@ export type Endpoints = {
|
||||
'promo/read': { req: PromoReadRequest; res: EmptyResponse };
|
||||
'roles/list': { req: EmptyRequest; res: RolesListResponse };
|
||||
'roles/show': { req: RolesShowRequest; res: RolesShowResponse };
|
||||
'roles/users': { req: RolesUsersRequest; res: EmptyResponse };
|
||||
'roles/users': { req: RolesUsersRequest; res: RolesUsersResponse };
|
||||
'roles/notes': { req: RolesNotesRequest; res: RolesNotesResponse };
|
||||
'request-reset-password': { req: RequestResetPasswordRequest; res: EmptyResponse };
|
||||
'reset-db': { req: EmptyRequest; res: EmptyResponse };
|
||||
'reset-password': { req: ResetPasswordRequest; res: EmptyResponse };
|
||||
'server-info': { req: EmptyRequest; res: EmptyResponse };
|
||||
'server-info': { req: EmptyRequest; res: ServerInfoResponse };
|
||||
'stats': { req: EmptyRequest; res: StatsResponse };
|
||||
'sw/show-registration': { req: SwShowRegistrationRequest; res: SwShowRegistrationResponse };
|
||||
'sw/update-registration': { req: SwUpdateRegistrationRequest; res: SwUpdateRegistrationResponse };
|
||||
'sw/register': { req: SwRegisterRequest; res: SwRegisterResponse };
|
||||
'sw/unregister': { req: SwUnregisterRequest; res: EmptyResponse };
|
||||
'test': { req: TestRequest; res: EmptyResponse };
|
||||
'test': { req: TestRequest; res: TestResponse };
|
||||
'username/available': { req: UsernameAvailableRequest; res: UsernameAvailableResponse };
|
||||
'users': { req: UsersRequest; res: UsersResponse };
|
||||
'users/clips': { req: UsersClipsRequest; res: UsersClipsResponse };
|
||||
@@ -864,7 +896,7 @@ export type Endpoints = {
|
||||
'users/lists/update': { req: UsersListsUpdateRequest; res: UsersListsUpdateResponse };
|
||||
'users/lists/create-from-public': { req: UsersListsCreateFromPublicRequest; res: UsersListsCreateFromPublicResponse };
|
||||
'users/lists/update-membership': { req: UsersListsUpdateMembershipRequest; res: EmptyResponse };
|
||||
'users/lists/get-memberships': { req: UsersListsGetMembershipsRequest; res: EmptyResponse };
|
||||
'users/lists/get-memberships': { req: UsersListsGetMembershipsRequest; res: UsersListsGetMembershipsResponse };
|
||||
'users/notes': { req: UsersNotesRequest; res: UsersNotesResponse };
|
||||
'users/pages': { req: UsersPagesRequest; res: UsersPagesResponse };
|
||||
'users/flashs': { req: UsersFlashsRequest; res: UsersFlashsResponse };
|
||||
@@ -876,9 +908,9 @@ export type Endpoints = {
|
||||
'users/search': { req: UsersSearchRequest; res: UsersSearchResponse };
|
||||
'users/show': { req: UsersShowRequest; res: UsersShowResponse };
|
||||
'users/stats': { req: UsersStatsRequest; res: UsersStatsResponse };
|
||||
'users/achievements': { req: UsersAchievementsRequest; res: EmptyResponse };
|
||||
'users/achievements': { req: UsersAchievementsRequest; res: UsersAchievementsResponse };
|
||||
'users/update-memo': { req: UsersUpdateMemoRequest; res: EmptyResponse };
|
||||
'fetch-rss': { req: FetchRssRequest; res: EmptyResponse };
|
||||
'fetch-external-resources': { req: FetchExternalResourcesRequest; res: EmptyResponse };
|
||||
'fetch-rss': { req: FetchRssRequest; res: FetchRssResponse };
|
||||
'fetch-external-resources': { req: FetchExternalResourcesRequest; res: FetchExternalResourcesResponse };
|
||||
'retention': { req: EmptyRequest; res: RetentionResponse };
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* version: 2023.12.0-beta.5-io
|
||||
* generatedAt: 2023-12-21T02:55:40.804Z
|
||||
* version: 2023.12.0-io
|
||||
* generatedAt: 2023-12-23T11:38:40.630Z
|
||||
*/
|
||||
|
||||
import { operations } from './types.js';
|
||||
@@ -15,9 +15,12 @@ export type AdminAccountsCreateRequest = operations['admin/accounts/create']['re
|
||||
export type AdminAccountsCreateResponse = operations['admin/accounts/create']['responses']['200']['content']['application/json'];
|
||||
export type AdminAccountsDeleteRequest = operations['admin/accounts/delete']['requestBody']['content']['application/json'];
|
||||
export type AdminAccountsFindByEmailRequest = operations['admin/accounts/find-by-email']['requestBody']['content']['application/json'];
|
||||
export type AdminAccountsFindByEmailResponse = operations['admin/accounts/find-by-email']['responses']['200']['content']['application/json'];
|
||||
export type AdminAdCreateRequest = operations['admin/ad/create']['requestBody']['content']['application/json'];
|
||||
export type AdminAdCreateResponse = operations['admin/ad/create']['responses']['200']['content']['application/json'];
|
||||
export type AdminAdDeleteRequest = operations['admin/ad/delete']['requestBody']['content']['application/json'];
|
||||
export type AdminAdListRequest = operations['admin/ad/list']['requestBody']['content']['application/json'];
|
||||
export type AdminAdListResponse = operations['admin/ad/list']['responses']['200']['content']['application/json'];
|
||||
export type AdminAdUpdateRequest = operations['admin/ad/update']['requestBody']['content']['application/json'];
|
||||
export type AdminAnnouncementsCreateRequest = operations['admin/announcements/create']['requestBody']['content']['application/json'];
|
||||
export type AdminAnnouncementsCreateResponse = operations['admin/announcements/create']['responses']['200']['content']['application/json'];
|
||||
@@ -63,8 +66,10 @@ export type AdminFederationDeleteAllFilesRequest = operations['admin/federation/
|
||||
export type AdminFederationRefreshRemoteInstanceMetadataRequest = operations['admin/federation/refresh-remote-instance-metadata']['requestBody']['content']['application/json'];
|
||||
export type AdminFederationRemoveAllFollowingRequest = operations['admin/federation/remove-all-following']['requestBody']['content']['application/json'];
|
||||
export type AdminFederationUpdateInstanceRequest = operations['admin/federation/update-instance']['requestBody']['content']['application/json'];
|
||||
export type AdminGetIndexStatsResponse = operations['admin/get-index-stats']['responses']['200']['content']['application/json'];
|
||||
export type AdminGetTableStatsResponse = operations['admin/get-table-stats']['responses']['200']['content']['application/json'];
|
||||
export type AdminGetUserIpsRequest = operations['admin/get-user-ips']['requestBody']['content']['application/json'];
|
||||
export type AdminGetUserIpsResponse = operations['admin/get-user-ips']['responses']['200']['content']['application/json'];
|
||||
export type AdminInviteCreateRequest = operations['admin/invite/create']['requestBody']['content']['application/json'];
|
||||
export type AdminInviteCreateResponse = operations['admin/invite/create']['responses']['200']['content']['application/json'];
|
||||
export type AdminInviteListRequest = operations['admin/invite/list']['requestBody']['content']['application/json'];
|
||||
@@ -106,6 +111,7 @@ export type AdminRolesAssignRequest = operations['admin/roles/assign']['requestB
|
||||
export type AdminRolesUnassignRequest = operations['admin/roles/unassign']['requestBody']['content']['application/json'];
|
||||
export type AdminRolesUpdateDefaultPoliciesRequest = operations['admin/roles/update-default-policies']['requestBody']['content']['application/json'];
|
||||
export type AdminRolesUsersRequest = operations['admin/roles/users']['requestBody']['content']['application/json'];
|
||||
export type AdminRolesUsersResponse = operations['admin/roles/users']['responses']['200']['content']['application/json'];
|
||||
export type AnnouncementsRequest = operations['announcements']['requestBody']['content']['application/json'];
|
||||
export type AnnouncementsResponse = operations['announcements']['responses']['200']['content']['application/json'];
|
||||
export type AntennasCreateRequest = operations['antennas/create']['requestBody']['content']['application/json'];
|
||||
@@ -233,6 +239,7 @@ export type DriveStreamResponse = operations['drive/stream']['responses']['200']
|
||||
export type EmailAddressAvailableRequest = operations['email-address/available']['requestBody']['content']['application/json'];
|
||||
export type EmailAddressAvailableResponse = operations['email-address/available']['responses']['200']['content']['application/json'];
|
||||
export type EndpointRequest = operations['endpoint']['requestBody']['content']['application/json'];
|
||||
export type EndpointResponse = operations['endpoint']['responses']['200']['content']['application/json'];
|
||||
export type EndpointsResponse = operations['endpoints']['responses']['200']['content']['application/json'];
|
||||
export type FederationFollowersRequest = operations['federation/followers']['requestBody']['content']['application/json'];
|
||||
export type FederationFollowersResponse = operations['federation/followers']['responses']['200']['content']['application/json'];
|
||||
@@ -246,6 +253,7 @@ export type FederationUpdateRemoteUserRequest = operations['federation/update-re
|
||||
export type FederationUsersRequest = operations['federation/users']['requestBody']['content']['application/json'];
|
||||
export type FederationUsersResponse = operations['federation/users']['responses']['200']['content']['application/json'];
|
||||
export type FederationStatsRequest = operations['federation/stats']['requestBody']['content']['application/json'];
|
||||
export type FederationStatsResponse = operations['federation/stats']['responses']['200']['content']['application/json'];
|
||||
export type FollowingCreateRequest = operations['following/create']['requestBody']['content']['application/json'];
|
||||
export type FollowingCreateResponse = operations['following/create']['responses']['200']['content']['application/json'];
|
||||
export type FollowingDeleteRequest = operations['following/delete']['requestBody']['content']['application/json'];
|
||||
@@ -275,6 +283,7 @@ export type GalleryPostsShowResponse = operations['gallery/posts/show']['respons
|
||||
export type GalleryPostsUnlikeRequest = operations['gallery/posts/unlike']['requestBody']['content']['application/json'];
|
||||
export type GalleryPostsUpdateRequest = operations['gallery/posts/update']['requestBody']['content']['application/json'];
|
||||
export type GalleryPostsUpdateResponse = operations['gallery/posts/update']['responses']['200']['content']['application/json'];
|
||||
export type GetOnlineUsersCountResponse = operations['get-online-users-count']['responses']['200']['content']['application/json'];
|
||||
export type GetAvatarDecorationsResponse = operations['get-avatar-decorations']['responses']['200']['content']['application/json'];
|
||||
export type HashtagsListRequest = operations['hashtags/list']['requestBody']['content']['application/json'];
|
||||
export type HashtagsListResponse = operations['hashtags/list']['responses']['200']['content']['application/json'];
|
||||
@@ -288,14 +297,19 @@ export type HashtagsUsersResponse = operations['hashtags/users']['responses']['2
|
||||
export type IResponse = operations['i']['responses']['200']['content']['application/json'];
|
||||
export type I2faDoneRequest = operations['i/2fa/done']['requestBody']['content']['application/json'];
|
||||
export type I2faKeyDoneRequest = operations['i/2fa/key-done']['requestBody']['content']['application/json'];
|
||||
export type I2faKeyDoneResponse = operations['i/2fa/key-done']['responses']['200']['content']['application/json'];
|
||||
export type I2faPasswordLessRequest = operations['i/2fa/password-less']['requestBody']['content']['application/json'];
|
||||
export type I2faRegisterKeyRequest = operations['i/2fa/register-key']['requestBody']['content']['application/json'];
|
||||
export type I2faRegisterKeyResponse = operations['i/2fa/register-key']['responses']['200']['content']['application/json'];
|
||||
export type I2faRegisterRequest = operations['i/2fa/register']['requestBody']['content']['application/json'];
|
||||
export type I2faRegisterResponse = operations['i/2fa/register']['responses']['200']['content']['application/json'];
|
||||
export type I2faUpdateKeyRequest = operations['i/2fa/update-key']['requestBody']['content']['application/json'];
|
||||
export type I2faRemoveKeyRequest = operations['i/2fa/remove-key']['requestBody']['content']['application/json'];
|
||||
export type I2faUnregisterRequest = operations['i/2fa/unregister']['requestBody']['content']['application/json'];
|
||||
export type IAppsRequest = operations['i/apps']['requestBody']['content']['application/json'];
|
||||
export type IAppsResponse = operations['i/apps']['responses']['200']['content']['application/json'];
|
||||
export type IAuthorizedAppsRequest = operations['i/authorized-apps']['requestBody']['content']['application/json'];
|
||||
export type IAuthorizedAppsResponse = operations['i/authorized-apps']['responses']['200']['content']['application/json'];
|
||||
export type IClaimAchievementRequest = operations['i/claim-achievement']['requestBody']['content']['application/json'];
|
||||
export type IChangePasswordRequest = operations['i/change-password']['requestBody']['content']['application/json'];
|
||||
export type IDeleteAccountRequest = operations['i/delete-account']['requestBody']['content']['application/json'];
|
||||
@@ -324,11 +338,16 @@ export type IPinResponse = operations['i/pin']['responses']['200']['content']['a
|
||||
export type IReadAnnouncementRequest = operations['i/read-announcement']['requestBody']['content']['application/json'];
|
||||
export type IRegenerateTokenRequest = operations['i/regenerate-token']['requestBody']['content']['application/json'];
|
||||
export type IRegistryGetAllRequest = operations['i/registry/get-all']['requestBody']['content']['application/json'];
|
||||
export type IRegistryGetAllResponse = operations['i/registry/get-all']['responses']['200']['content']['application/json'];
|
||||
export type IRegistryGetDetailRequest = operations['i/registry/get-detail']['requestBody']['content']['application/json'];
|
||||
export type IRegistryGetDetailResponse = operations['i/registry/get-detail']['responses']['200']['content']['application/json'];
|
||||
export type IRegistryGetRequest = operations['i/registry/get']['requestBody']['content']['application/json'];
|
||||
export type IRegistryGetResponse = operations['i/registry/get']['responses']['200']['content']['application/json'];
|
||||
export type IRegistryKeysWithTypeRequest = operations['i/registry/keys-with-type']['requestBody']['content']['application/json'];
|
||||
export type IRegistryKeysWithTypeResponse = operations['i/registry/keys-with-type']['responses']['200']['content']['application/json'];
|
||||
export type IRegistryKeysRequest = operations['i/registry/keys']['requestBody']['content']['application/json'];
|
||||
export type IRegistryRemoveRequest = operations['i/registry/remove']['requestBody']['content']['application/json'];
|
||||
export type IRegistryScopesWithDomainResponse = operations['i/registry/scopes-with-domain']['responses']['200']['content']['application/json'];
|
||||
export type IRegistrySetRequest = operations['i/registry/set']['requestBody']['content']['application/json'];
|
||||
export type IRevokeTokenRequest = operations['i/revoke-token']['requestBody']['content']['application/json'];
|
||||
export type ISigninHistoryRequest = operations['i/signin-history']['requestBody']['content']['application/json'];
|
||||
@@ -336,11 +355,16 @@ export type ISigninHistoryResponse = operations['i/signin-history']['responses']
|
||||
export type IUnpinRequest = operations['i/unpin']['requestBody']['content']['application/json'];
|
||||
export type IUnpinResponse = operations['i/unpin']['responses']['200']['content']['application/json'];
|
||||
export type IUpdateEmailRequest = operations['i/update-email']['requestBody']['content']['application/json'];
|
||||
export type IUpdateEmailResponse = operations['i/update-email']['responses']['200']['content']['application/json'];
|
||||
export type IUpdateRequest = operations['i/update']['requestBody']['content']['application/json'];
|
||||
export type IUpdateResponse = operations['i/update']['responses']['200']['content']['application/json'];
|
||||
export type IMoveRequest = operations['i/move']['requestBody']['content']['application/json'];
|
||||
export type IMoveResponse = operations['i/move']['responses']['200']['content']['application/json'];
|
||||
export type IWebhooksCreateRequest = operations['i/webhooks/create']['requestBody']['content']['application/json'];
|
||||
export type IWebhooksCreateResponse = operations['i/webhooks/create']['responses']['200']['content']['application/json'];
|
||||
export type IWebhooksListResponse = operations['i/webhooks/list']['responses']['200']['content']['application/json'];
|
||||
export type IWebhooksShowRequest = operations['i/webhooks/show']['requestBody']['content']['application/json'];
|
||||
export type IWebhooksShowResponse = operations['i/webhooks/show']['responses']['200']['content']['application/json'];
|
||||
export type IWebhooksUpdateRequest = operations['i/webhooks/update']['requestBody']['content']['application/json'];
|
||||
export type IWebhooksDeleteRequest = operations['i/webhooks/delete']['requestBody']['content']['application/json'];
|
||||
export type InviteCreateResponse = operations['invite/create']['responses']['200']['content']['application/json'];
|
||||
@@ -428,6 +452,7 @@ export type PagesShowResponse = operations['pages/show']['responses']['200']['co
|
||||
export type PagesUnlikeRequest = operations['pages/unlike']['requestBody']['content']['application/json'];
|
||||
export type PagesUpdateRequest = operations['pages/update']['requestBody']['content']['application/json'];
|
||||
export type FlashCreateRequest = operations['flash/create']['requestBody']['content']['application/json'];
|
||||
export type FlashCreateResponse = operations['flash/create']['responses']['200']['content']['application/json'];
|
||||
export type FlashDeleteRequest = operations['flash/delete']['requestBody']['content']['application/json'];
|
||||
export type FlashFeaturedResponse = operations['flash/featured']['responses']['200']['content']['application/json'];
|
||||
export type FlashLikeRequest = operations['flash/like']['requestBody']['content']['application/json'];
|
||||
@@ -446,10 +471,12 @@ export type RolesListResponse = operations['roles/list']['responses']['200']['co
|
||||
export type RolesShowRequest = operations['roles/show']['requestBody']['content']['application/json'];
|
||||
export type RolesShowResponse = operations['roles/show']['responses']['200']['content']['application/json'];
|
||||
export type RolesUsersRequest = operations['roles/users']['requestBody']['content']['application/json'];
|
||||
export type RolesUsersResponse = operations['roles/users']['responses']['200']['content']['application/json'];
|
||||
export type RolesNotesRequest = operations['roles/notes']['requestBody']['content']['application/json'];
|
||||
export type RolesNotesResponse = operations['roles/notes']['responses']['200']['content']['application/json'];
|
||||
export type RequestResetPasswordRequest = operations['request-reset-password']['requestBody']['content']['application/json'];
|
||||
export type ResetPasswordRequest = operations['reset-password']['requestBody']['content']['application/json'];
|
||||
export type ServerInfoResponse = operations['server-info']['responses']['200']['content']['application/json'];
|
||||
export type StatsResponse = operations['stats']['responses']['200']['content']['application/json'];
|
||||
export type SwShowRegistrationRequest = operations['sw/show-registration']['requestBody']['content']['application/json'];
|
||||
export type SwShowRegistrationResponse = operations['sw/show-registration']['responses']['200']['content']['application/json'];
|
||||
@@ -459,6 +486,7 @@ export type SwRegisterRequest = operations['sw/register']['requestBody']['conten
|
||||
export type SwRegisterResponse = operations['sw/register']['responses']['200']['content']['application/json'];
|
||||
export type SwUnregisterRequest = operations['sw/unregister']['requestBody']['content']['application/json'];
|
||||
export type TestRequest = operations['test']['requestBody']['content']['application/json'];
|
||||
export type TestResponse = operations['test']['responses']['200']['content']['application/json'];
|
||||
export type UsernameAvailableRequest = operations['username/available']['requestBody']['content']['application/json'];
|
||||
export type UsernameAvailableResponse = operations['username/available']['responses']['200']['content']['application/json'];
|
||||
export type UsersRequest = operations['users']['requestBody']['content']['application/json'];
|
||||
@@ -492,6 +520,7 @@ export type UsersListsCreateFromPublicRequest = operations['users/lists/create-f
|
||||
export type UsersListsCreateFromPublicResponse = operations['users/lists/create-from-public']['responses']['200']['content']['application/json'];
|
||||
export type UsersListsUpdateMembershipRequest = operations['users/lists/update-membership']['requestBody']['content']['application/json'];
|
||||
export type UsersListsGetMembershipsRequest = operations['users/lists/get-memberships']['requestBody']['content']['application/json'];
|
||||
export type UsersListsGetMembershipsResponse = operations['users/lists/get-memberships']['responses']['200']['content']['application/json'];
|
||||
export type UsersNotesRequest = operations['users/notes']['requestBody']['content']['application/json'];
|
||||
export type UsersNotesResponse = operations['users/notes']['responses']['200']['content']['application/json'];
|
||||
export type UsersPagesRequest = operations['users/pages']['requestBody']['content']['application/json'];
|
||||
@@ -514,7 +543,10 @@ export type UsersShowResponse = operations['users/show']['responses']['200']['co
|
||||
export type UsersStatsRequest = operations['users/stats']['requestBody']['content']['application/json'];
|
||||
export type UsersStatsResponse = operations['users/stats']['responses']['200']['content']['application/json'];
|
||||
export type UsersAchievementsRequest = operations['users/achievements']['requestBody']['content']['application/json'];
|
||||
export type UsersAchievementsResponse = operations['users/achievements']['responses']['200']['content']['application/json'];
|
||||
export type UsersUpdateMemoRequest = operations['users/update-memo']['requestBody']['content']['application/json'];
|
||||
export type FetchRssRequest = operations['fetch-rss']['requestBody']['content']['application/json'];
|
||||
export type FetchRssResponse = operations['fetch-rss']['responses']['200']['content']['application/json'];
|
||||
export type FetchExternalResourcesRequest = operations['fetch-external-resources']['requestBody']['content']['application/json'];
|
||||
export type FetchExternalResourcesResponse = operations['fetch-external-resources']['responses']['200']['content']['application/json'];
|
||||
export type RetentionResponse = operations['retention']['responses']['200']['content']['application/json'];
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* version: 2023.12.0-beta.5-io
|
||||
* generatedAt: 2023-12-21T02:55:40.802Z
|
||||
* version: 2023.12.0-io
|
||||
* generatedAt: 2023-12-23T11:38:40.627Z
|
||||
*/
|
||||
|
||||
import { components } from './types.js';
|
||||
@@ -14,6 +14,7 @@ export type UserDetailed = components['schemas']['UserDetailed'];
|
||||
export type User = components['schemas']['User'];
|
||||
export type UserList = components['schemas']['UserList'];
|
||||
export type UserListMembership = components['schemas']['UserListMembership'];
|
||||
export type Ad = components['schemas']['Ad'];
|
||||
export type Announcement = components['schemas']['Announcement'];
|
||||
export type App = components['schemas']['App'];
|
||||
export type Note = components['schemas']['Note'];
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user