| @@ -5,7 +5,7 @@ | ||||
|  | ||||
| import { Module } from '@nestjs/common'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
| import { MiAbuseUserReport, MiAccessToken, MiAd, MiAnnouncement, MiAnnouncementRead, MiAntenna, MiApp, MiAuthSession, MiAvatarDecoration, MiBlocking, MiChannel, MiChannelFavorite, MiChannelFollowing, MiClip, MiClipFavorite, MiClipNote, MiDriveFile, MiDriveFolder, MiEmoji, MiFlash, MiFlashLike, MiFollowRequest, MiFollowing, MiGalleryLike, MiGalleryPost, MiHashtag, MiInstance, MiMeta, MiModerationLog, MiMuting, MiNote, MiNoteFavorite, MiNoteReaction, MiNoteThreadMuting, MiNoteUnread, MiPage, MiPageLike, MiPasswordResetRequest, MiPoll, MiPollVote, MiPromoNote, MiPromoRead, MiRegistrationTicket, MiRegistryItem, MiRelay, MiRenoteMuting, MiRetentionAggregation, MiRole, MiRoleAssignment, MiSignin, MiSwSubscription, MiUsedUsername, MiUser, MiUserIp, MiUserKeypair, MiUserList, MiUserListFavorite, MiUserListMembership, MiUserMemo, MiUserNotePining, MiUserPending, MiUserProfile, MiUserPublickey, MiUserSecurityKey, MiWebhook, MiBubbleGameRecord } from './_.js'; | ||||
| import { MiAbuseUserReport, MiAccessToken, MiAd, MiAnnouncement, MiAnnouncementRead, MiAntenna, MiApp, MiAuthSession, MiAvatarDecoration, MiBlocking, MiChannel, MiChannelFavorite, MiChannelFollowing, MiClip, MiClipFavorite, MiClipNote, MiDriveFile, MiDriveFolder, MiEmoji, MiFlash, MiFlashLike, MiFollowRequest, MiFollowing, MiGalleryLike, MiGalleryPost, MiHashtag, MiInstance, MiMeta, MiModerationLog, MiMuting, MiNote, MiNoteFavorite, MiNoteReaction, MiNoteThreadMuting, MiNoteUnread, MiPage, MiPageLike, MiPasswordResetRequest, MiPoll, MiPollVote, MiPromoNote, MiPromoRead, MiRegistrationTicket, MiRegistryItem, MiRelay, MiRenoteMuting, MiRetentionAggregation, MiRole, MiRoleAssignment, MiSignin, MiSwSubscription, MiUsedUsername, MiUser, MiUserIp, MiUserKeypair, MiUserList, MiUserListFavorite, MiUserListMembership, MiUserMemo, MiUserNotePining, MiUserPending, MiUserProfile, MiUserPublickey, MiUserSecurityKey, MiWebhook, MiBubbleGameRecord, MiReversiGame } from './_.js'; | ||||
| import type { DataSource } from 'typeorm'; | ||||
| import type { Provider } from '@nestjs/common'; | ||||
|  | ||||
| @@ -399,12 +399,18 @@ const $userMemosRepository: Provider = { | ||||
| 	inject: [DI.db], | ||||
| }; | ||||
|  | ||||
| export const $bubbleGameRecordsRepository: Provider = { | ||||
| const $bubbleGameRecordsRepository: Provider = { | ||||
| 	provide: DI.bubbleGameRecordsRepository, | ||||
| 	useFactory: (db: DataSource) => db.getRepository(MiBubbleGameRecord), | ||||
| 	inject: [DI.db], | ||||
| }; | ||||
|  | ||||
| const $reversiGamesRepository: Provider = { | ||||
| 	provide: DI.reversiGamesRepository, | ||||
| 	useFactory: (db: DataSource) => db.getRepository(MiReversiGame), | ||||
| 	inject: [DI.db], | ||||
| }; | ||||
|  | ||||
| @Module({ | ||||
| 	imports: [ | ||||
| 	], | ||||
| @@ -475,6 +481,7 @@ export const $bubbleGameRecordsRepository: Provider = { | ||||
| 		$flashLikesRepository, | ||||
| 		$userMemosRepository, | ||||
| 		$bubbleGameRecordsRepository, | ||||
| 		$reversiGamesRepository, | ||||
| 	], | ||||
| 	exports: [ | ||||
| 		$usersRepository, | ||||
| @@ -543,6 +550,7 @@ export const $bubbleGameRecordsRepository: Provider = { | ||||
| 		$flashLikesRepository, | ||||
| 		$userMemosRepository, | ||||
| 		$bubbleGameRecordsRepository, | ||||
| 		$reversiGamesRepository, | ||||
| 	], | ||||
| }) | ||||
| export class RepositoryModule {} | ||||
|   | ||||
							
								
								
									
										127
									
								
								packages/backend/src/models/ReversiGame.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								packages/backend/src/models/ReversiGame.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm'; | ||||
| import { id } from './util/id.js'; | ||||
| import { MiUser } from './User.js'; | ||||
|  | ||||
| @Entity('reversi_game') | ||||
| export class MiReversiGame { | ||||
| 	@PrimaryColumn(id()) | ||||
| 	public id: string; | ||||
|  | ||||
| 	@Column('timestamp with time zone', { | ||||
| 		nullable: true, | ||||
| 		comment: 'The started date of the ReversiGame.', | ||||
| 	}) | ||||
| 	public startedAt: Date | null; | ||||
|  | ||||
| 	@Column(id()) | ||||
| 	public user1Id: MiUser['id']; | ||||
|  | ||||
| 	@ManyToOne(type => MiUser, { | ||||
| 		onDelete: 'CASCADE', | ||||
| 	}) | ||||
| 	@JoinColumn() | ||||
| 	public user1: MiUser | null; | ||||
|  | ||||
| 	@Column(id()) | ||||
| 	public user2Id: MiUser['id']; | ||||
|  | ||||
| 	@ManyToOne(type => MiUser, { | ||||
| 		onDelete: 'CASCADE', | ||||
| 	}) | ||||
| 	@JoinColumn() | ||||
| 	public user2: MiUser | null; | ||||
|  | ||||
| 	@Column('boolean', { | ||||
| 		default: false, | ||||
| 	}) | ||||
| 	public user1Ready: boolean; | ||||
|  | ||||
| 	@Column('boolean', { | ||||
| 		default: false, | ||||
| 	}) | ||||
| 	public user2Ready: boolean; | ||||
|  | ||||
| 	/** | ||||
| 	 * どちらのプレイヤーが先行(黒)か | ||||
| 	 * 1 ... user1 | ||||
| 	 * 2 ... user2 | ||||
| 	 */ | ||||
| 	@Column('integer', { | ||||
| 		nullable: true, | ||||
| 	}) | ||||
| 	public black: number | null; | ||||
|  | ||||
| 	@Column('boolean', { | ||||
| 		default: false, | ||||
| 	}) | ||||
| 	public isStarted: boolean; | ||||
|  | ||||
| 	@Column('boolean', { | ||||
| 		default: false, | ||||
| 	}) | ||||
| 	public isEnded: boolean; | ||||
|  | ||||
| 	@Column({ | ||||
| 		...id(), | ||||
| 		nullable: true, | ||||
| 	}) | ||||
| 	public winnerId: MiUser['id'] | null; | ||||
|  | ||||
| 	@Column({ | ||||
| 		...id(), | ||||
| 		nullable: true, | ||||
| 	}) | ||||
| 	public surrendered: MiUser['id'] | null; | ||||
|  | ||||
| 	@Column('jsonb', { | ||||
| 		default: [], | ||||
| 	}) | ||||
| 	public logs: { | ||||
| 		at: number; | ||||
| 		color: boolean; | ||||
| 		pos: number; | ||||
| 	}[]; | ||||
|  | ||||
| 	@Column('varchar', { | ||||
| 		array: true, length: 64, | ||||
| 	}) | ||||
| 	public map: string[]; | ||||
|  | ||||
| 	@Column('varchar', { | ||||
| 		length: 32, | ||||
| 	}) | ||||
| 	public bw: string; | ||||
|  | ||||
| 	@Column('boolean', { | ||||
| 		default: false, | ||||
| 	}) | ||||
| 	public isLlotheo: boolean; | ||||
|  | ||||
| 	@Column('boolean', { | ||||
| 		default: false, | ||||
| 	}) | ||||
| 	public canPutEverywhere: boolean; | ||||
|  | ||||
| 	@Column('boolean', { | ||||
| 		default: false, | ||||
| 	}) | ||||
| 	public loopedBoard: boolean; | ||||
|  | ||||
| 	@Column('jsonb', { | ||||
| 		nullable: true, default: null, | ||||
| 	}) | ||||
| 	public form1: any | null; | ||||
|  | ||||
| 	@Column('jsonb', { | ||||
| 		nullable: true, default: null, | ||||
| 	}) | ||||
| 	public form2: any | null; | ||||
|  | ||||
| 	/** | ||||
| 	 * ログのposを文字列としてすべて連結したもののCRC32値 | ||||
| 	 */ | ||||
| 	@Column('varchar', { | ||||
| 		length: 32, nullable: true, | ||||
| 	}) | ||||
| 	public crc32: string | null; | ||||
| } | ||||
| @@ -69,6 +69,8 @@ import { MiFlash } from '@/models/Flash.js'; | ||||
| import { MiFlashLike } from '@/models/FlashLike.js'; | ||||
| import { MiUserListFavorite } from '@/models/UserListFavorite.js'; | ||||
| import { MiBubbleGameRecord } from '@/models/BubbleGameRecord.js'; | ||||
| import { MiReversiGame } from '@/models/ReversiGame.js'; | ||||
|  | ||||
| import type { Repository } from 'typeorm'; | ||||
|  | ||||
| export { | ||||
| @@ -138,6 +140,7 @@ export { | ||||
| 	MiFlashLike, | ||||
| 	MiUserMemo, | ||||
| 	MiBubbleGameRecord, | ||||
| 	MiReversiGame, | ||||
| }; | ||||
|  | ||||
| export type AbuseUserReportsRepository = Repository<MiAbuseUserReport>; | ||||
| @@ -206,3 +209,4 @@ export type FlashsRepository = Repository<MiFlash>; | ||||
| export type FlashLikesRepository = Repository<MiFlashLike>; | ||||
| export type UserMemoRepository = Repository<MiUserMemo>; | ||||
| export type BubbleGameRecordsRepository = Repository<MiBubbleGameRecord>; | ||||
| export type ReversiGamesRepository = Repository<MiReversiGame>; | ||||
|   | ||||
							
								
								
									
										234
									
								
								packages/backend/src/models/json-schema/reversi-game.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								packages/backend/src/models/json-schema/reversi-game.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,234 @@ | ||||
| /* | ||||
|  * SPDX-FileCopyrightText: syuilo and other misskey contributors | ||||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
|  | ||||
| export const packedReversiGameLiteSchema = { | ||||
| 	type: 'object', | ||||
| 	properties: { | ||||
| 		id: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		createdAt: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 			format: 'date-time', | ||||
| 		}, | ||||
| 		startedAt: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: true, | ||||
| 			format: 'date-time', | ||||
| 		}, | ||||
| 		isStarted: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		isEnded: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		form1: { | ||||
| 			type: 'any', | ||||
| 			optional: false, nullable: true, | ||||
| 		}, | ||||
| 		form2: { | ||||
| 			type: 'any', | ||||
| 			optional: false, nullable: true, | ||||
| 		}, | ||||
| 		user1Ready: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		user2Ready: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		user1Id: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		user2Id: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		user1: { | ||||
| 			type: 'object', | ||||
| 			optional: false, nullable: false, | ||||
| 			ref: 'User', | ||||
| 		}, | ||||
| 		user2: { | ||||
| 			type: 'object', | ||||
| 			optional: false, nullable: false, | ||||
| 			ref: 'User', | ||||
| 		}, | ||||
| 		winnerId: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: true, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		winner: { | ||||
| 			type: 'object', | ||||
| 			optional: false, nullable: true, | ||||
| 			ref: 'User', | ||||
| 		}, | ||||
| 		surrendered: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: true, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		black: { | ||||
| 			type: 'number', | ||||
| 			optional: false, nullable: true, | ||||
| 		}, | ||||
| 		bw: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		isLlotheo: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		canPutEverywhere: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		loopedBoard: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 	}, | ||||
| } as const; | ||||
|  | ||||
| export const packedReversiGameDetailedSchema = { | ||||
| 	type: 'object', | ||||
| 	properties: { | ||||
| 		id: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		createdAt: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 			format: 'date-time', | ||||
| 		}, | ||||
| 		startedAt: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: true, | ||||
| 			format: 'date-time', | ||||
| 		}, | ||||
| 		isStarted: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		isEnded: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		form1: { | ||||
| 			type: 'any', | ||||
| 			optional: false, nullable: true, | ||||
| 		}, | ||||
| 		form2: { | ||||
| 			type: 'any', | ||||
| 			optional: false, nullable: true, | ||||
| 		}, | ||||
| 		user1Ready: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		user2Ready: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		user1Id: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		user2Id: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		user1: { | ||||
| 			type: 'object', | ||||
| 			optional: false, nullable: false, | ||||
| 			ref: 'User', | ||||
| 		}, | ||||
| 		user2: { | ||||
| 			type: 'object', | ||||
| 			optional: false, nullable: false, | ||||
| 			ref: 'User', | ||||
| 		}, | ||||
| 		winnerId: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: true, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		winner: { | ||||
| 			type: 'object', | ||||
| 			optional: false, nullable: true, | ||||
| 			ref: 'User', | ||||
| 		}, | ||||
| 		surrendered: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: true, | ||||
| 			format: 'id', | ||||
| 		}, | ||||
| 		black: { | ||||
| 			type: 'number', | ||||
| 			optional: false, nullable: true, | ||||
| 		}, | ||||
| 		bw: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		isLlotheo: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		canPutEverywhere: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		loopedBoard: { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		logs: { | ||||
| 			type: 'array', | ||||
| 			optional: false, nullable: false, | ||||
| 			items: { | ||||
| 				type: 'object', | ||||
| 				optional: false, nullable: false, | ||||
| 				properties: { | ||||
| 					at: { | ||||
| 						type: 'number', | ||||
| 						optional: false, nullable: false, | ||||
| 					}, | ||||
| 					color: { | ||||
| 						type: 'boolean', | ||||
| 						optional: false, nullable: false, | ||||
| 					}, | ||||
| 					pos: { | ||||
| 						type: 'number', | ||||
| 						optional: false, nullable: false, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		map: { | ||||
| 			type: 'array', | ||||
| 			optional: false, nullable: false, | ||||
| 			items: { | ||||
| 				type: 'string', | ||||
| 				optional: false, nullable: false, | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| } as const; | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo