Merge branch 'infer-pack-type' into stream-types
This commit is contained in:
commit
96c79545db
5 changed files with 232 additions and 17 deletions
|
@ -1,14 +1,14 @@
|
||||||
import { EntityRepository, Repository } from 'typeorm';
|
import { EntityRepository, Repository } from 'typeorm';
|
||||||
import { Emoji } from '@/models/entities/emoji';
|
import { Emoji } from '@/models/entities/emoji';
|
||||||
import { Resolved } from '@/prelude/types';
|
import { SchemaType } from '@/misc/schema';
|
||||||
|
|
||||||
export type PackedEmoji = Resolved<ReturnType<EmojiRepository['pack']>>;
|
export type PackedEmoji = SchemaType<typeof packedEmojiSchema>;
|
||||||
|
|
||||||
@EntityRepository(Emoji)
|
@EntityRepository(Emoji)
|
||||||
export class EmojiRepository extends Repository<Emoji> {
|
export class EmojiRepository extends Repository<Emoji> {
|
||||||
public async pack(
|
public async pack(
|
||||||
src: Emoji['id'] | Emoji,
|
src: Emoji['id'] | Emoji,
|
||||||
) {
|
): Promise<PackedEmoji> {
|
||||||
const emoji = typeof src === 'object' ? src : await this.findOneOrFail(src);
|
const emoji = typeof src === 'object' ? src : await this.findOneOrFail(src);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -27,3 +27,41 @@ export class EmojiRepository extends Repository<Emoji> {
|
||||||
return Promise.all(emojis.map(x => this.pack(x)));
|
return Promise.all(emojis.map(x => this.pack(x)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const packedEmojiSchema = {
|
||||||
|
type: 'object' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
aliases: {
|
||||||
|
type: 'array' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
items: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'id',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
category: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
},
|
||||||
|
host: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
},
|
||||||
|
url: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -2,9 +2,9 @@ import { User } from '@/models/entities/user';
|
||||||
import { EntityRepository, Repository } from 'typeorm';
|
import { EntityRepository, Repository } from 'typeorm';
|
||||||
import { Users } from '../../../index';
|
import { Users } from '../../../index';
|
||||||
import { ReversiGame } from '@/models/entities/games/reversi/game';
|
import { ReversiGame } from '@/models/entities/games/reversi/game';
|
||||||
import { Resolved } from '@/prelude/types';
|
import { SchemaType } from '@/misc/schema';
|
||||||
|
|
||||||
export type PackedReversiGame = Resolved<ReturnType<ReversiGameRepository['pack']>>;
|
export type PackedReversiGame = SchemaType<typeof packedReversiGameSchema>;
|
||||||
|
|
||||||
@EntityRepository(ReversiGame)
|
@EntityRepository(ReversiGame)
|
||||||
export class ReversiGameRepository extends Repository<ReversiGame> {
|
export class ReversiGameRepository extends Repository<ReversiGame> {
|
||||||
|
@ -14,7 +14,7 @@ export class ReversiGameRepository extends Repository<ReversiGame> {
|
||||||
options?: {
|
options?: {
|
||||||
detail?: boolean
|
detail?: boolean
|
||||||
}
|
}
|
||||||
) {
|
): Promise<PackedReversiGame> {
|
||||||
const opts = Object.assign({
|
const opts = Object.assign({
|
||||||
detail: true
|
detail: true
|
||||||
}, options);
|
}, options);
|
||||||
|
@ -23,8 +23,8 @@ export class ReversiGameRepository extends Repository<ReversiGame> {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: game.id,
|
id: game.id,
|
||||||
createdAt: game.createdAt,
|
createdAt: game.createdAt.toISOString(),
|
||||||
startedAt: game.startedAt,
|
startedAt: game.startedAt && game.startedAt.toISOString(),
|
||||||
isStarted: game.isStarted,
|
isStarted: game.isStarted,
|
||||||
isEnded: game.isEnded,
|
isEnded: game.isEnded,
|
||||||
form1: game.form1,
|
form1: game.form1,
|
||||||
|
@ -44,9 +44,150 @@ export class ReversiGameRepository extends Repository<ReversiGame> {
|
||||||
canPutEverywhere: game.canPutEverywhere,
|
canPutEverywhere: game.canPutEverywhere,
|
||||||
loopedBoard: game.loopedBoard,
|
loopedBoard: game.loopedBoard,
|
||||||
...(opts.detail ? {
|
...(opts.detail ? {
|
||||||
logs: game.logs,
|
logs: game.logs.map(log => ({
|
||||||
|
at: log.at.toISOString(),
|
||||||
|
color: log.color,
|
||||||
|
pos: log.pos
|
||||||
|
})),
|
||||||
map: game.map,
|
map: game.map,
|
||||||
} : {})
|
} : {})
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const packedReversiGameSchema = {
|
||||||
|
type: 'object' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
startedAt: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
isStarted: {
|
||||||
|
type: 'boolean' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
isEnded: {
|
||||||
|
type: 'boolean' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
form1: {
|
||||||
|
type: 'any' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
},
|
||||||
|
form2: {
|
||||||
|
type: 'any' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
},
|
||||||
|
user1Accepted: {
|
||||||
|
type: 'boolean' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
user2Accepted: {
|
||||||
|
type: 'boolean' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
user1Id: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
user2Id: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
user1: {
|
||||||
|
type: 'object' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
ref: 'User' as const,
|
||||||
|
},
|
||||||
|
user2: {
|
||||||
|
type: 'object' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
ref: 'User' as const,
|
||||||
|
},
|
||||||
|
winnerId: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
winner: {
|
||||||
|
type: 'object' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
ref: 'User' as const,
|
||||||
|
},
|
||||||
|
surrendered: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
black: {
|
||||||
|
type: 'number' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
},
|
||||||
|
bw: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
isLlotheo: {
|
||||||
|
type: 'boolean' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
canPutEverywhere: {
|
||||||
|
type: 'boolean' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
loopedBoard: {
|
||||||
|
type: 'boolean' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
logs: {
|
||||||
|
type: 'array' as const,
|
||||||
|
optional: true as const, nullable: false as const,
|
||||||
|
items: {
|
||||||
|
type: 'object' as const,
|
||||||
|
optional: true as const, nullable: false as const,
|
||||||
|
properties: {
|
||||||
|
at: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
type: 'boolean' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
pos: {
|
||||||
|
type: 'number' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
map: {
|
||||||
|
type: 'array' as const,
|
||||||
|
optional: true as const, nullable: false as const,
|
||||||
|
items: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -3,21 +3,21 @@ import { ReversiMatching } from '@/models/entities/games/reversi/matching';
|
||||||
import { Users } from '../../../index';
|
import { Users } from '../../../index';
|
||||||
import { awaitAll } from '@/prelude/await-all';
|
import { awaitAll } from '@/prelude/await-all';
|
||||||
import { User } from '@/models/entities/user';
|
import { User } from '@/models/entities/user';
|
||||||
import { Resolved } from '@/prelude/types';
|
import { SchemaType } from '@/misc/schema';
|
||||||
|
|
||||||
export type PackedReversiMatching = Resolved<ReturnType<ReversiMatchingRepository['pack']>>;
|
export type PackedReversiMatching = SchemaType<typeof packedReversiMatchingSchema>;
|
||||||
|
|
||||||
@EntityRepository(ReversiMatching)
|
@EntityRepository(ReversiMatching)
|
||||||
export class ReversiMatchingRepository extends Repository<ReversiMatching> {
|
export class ReversiMatchingRepository extends Repository<ReversiMatching> {
|
||||||
public async pack(
|
public async pack(
|
||||||
src: ReversiMatching['id'] | ReversiMatching,
|
src: ReversiMatching['id'] | ReversiMatching,
|
||||||
me: { id: User['id'] }
|
me: { id: User['id'] }
|
||||||
) {
|
): Promise<PackedReversiMatching> {
|
||||||
const matching = typeof src === 'object' ? src : await this.findOneOrFail(src);
|
const matching = typeof src === 'object' ? src : await this.findOneOrFail(src);
|
||||||
|
|
||||||
return await awaitAll({
|
return await awaitAll({
|
||||||
id: matching.id,
|
id: matching.id,
|
||||||
createdAt: matching.createdAt,
|
createdAt: matching.createdAt.toISOString(),
|
||||||
parentId: matching.parentId,
|
parentId: matching.parentId,
|
||||||
parent: Users.pack(matching.parentId, me, {
|
parent: Users.pack(matching.parentId, me, {
|
||||||
detail: true
|
detail: true
|
||||||
|
@ -29,3 +29,43 @@ export class ReversiMatchingRepository extends Repository<ReversiMatching> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const packedReversiMatchingSchema = {
|
||||||
|
type: 'object' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
parentId: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
parent: {
|
||||||
|
type: 'object' as const,
|
||||||
|
optional: false as const, nullable: true as const,
|
||||||
|
ref: 'User' as const,
|
||||||
|
},
|
||||||
|
childId: {
|
||||||
|
type: 'string' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
child: {
|
||||||
|
type: 'object' as const,
|
||||||
|
optional: false as const, nullable: false as const,
|
||||||
|
ref: 'User' as const,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
import { EntityRepository, Repository } from 'typeorm';
|
import { EntityRepository, Repository } from 'typeorm';
|
||||||
import { Signin } from '@/models/entities/signin';
|
import { Signin } from '@/models/entities/signin';
|
||||||
import { Resolved } from '@/prelude/types';
|
|
||||||
|
|
||||||
export type PackedSignin = Resolved<ReturnType<SigninRepository['pack']>>;
|
|
||||||
|
|
||||||
@EntityRepository(Signin)
|
@EntityRepository(Signin)
|
||||||
export class SigninRepository extends Repository<Signin> {
|
export class SigninRepository extends Repository<Signin> {
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
export type Resolved<P> = P extends PromiseLike<infer R> ? R : never;
|
|
Loading…
Reference in a new issue