Resolve #5939
This commit is contained in:
		
							parent
							
								
									84958af4ce
								
							
						
					
					
						commit
						65c0b6c7da
					
				
					 10 changed files with 123 additions and 9 deletions
				
			
		|  | @ -4,6 +4,7 @@ ChangeLog | ||||||
| unreleased | unreleased | ||||||
| ------------------- | ------------------- | ||||||
| ### ✨Improvements | ### ✨Improvements | ||||||
|  | * アンテナの受信ソースにグループを指定できるように | ||||||
| * 時計ウィジェットを追加 | * 時計ウィジェットを追加 | ||||||
| 
 | 
 | ||||||
| ### 🐛Fixes | ### 🐛Fixes | ||||||
|  |  | ||||||
|  | @ -487,6 +487,7 @@ _antennaSources: | ||||||
|   homeTimeline: "フォローしているユーザーのノート" |   homeTimeline: "フォローしているユーザーのノート" | ||||||
|   users: "指定した一人または複数のユーザーのノート" |   users: "指定した一人または複数のユーザーのノート" | ||||||
|   userList: "指定したリストのユーザーのノート" |   userList: "指定したリストのユーザーのノート" | ||||||
|  |   userGroup: "指定したグループのユーザーのノート" | ||||||
| 
 | 
 | ||||||
| _weekday: | _weekday: | ||||||
|   sunday: "日曜日" |   sunday: "日曜日" | ||||||
|  |  | ||||||
							
								
								
									
										28
									
								
								migration/1581695816408-user-group-antenna.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								migration/1581695816408-user-group-antenna.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | import {MigrationInterface, QueryRunner} from "typeorm"; | ||||||
|  | 
 | ||||||
|  | export class userGroupAntenna1581695816408 implements MigrationInterface { | ||||||
|  |     name = 'userGroupAntenna1581695816408' | ||||||
|  | 
 | ||||||
|  |     public async up(queryRunner: QueryRunner): Promise<any> { | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" ADD "userGroupJoiningId" character varying(32)`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TYPE "public"."antenna_src_enum" RENAME TO "antenna_src_enum_old"`, undefined); | ||||||
|  |         await queryRunner.query(`CREATE TYPE "antenna_src_enum" AS ENUM('home', 'all', 'users', 'list', 'group')`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" ALTER COLUMN "src" TYPE "antenna_src_enum" USING "src"::"text"::"antenna_src_enum"`, undefined); | ||||||
|  |         await queryRunner.query(`DROP TYPE "antenna_src_enum_old"`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "users"`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" ADD "users" character varying(1024) array NOT NULL DEFAULT '{}'::varchar[]`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" ADD CONSTRAINT "FK_ccbf5a8c0be4511133dcc50ddeb" FOREIGN KEY ("userGroupJoiningId") REFERENCES "user_group_joining"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, undefined); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public async down(queryRunner: QueryRunner): Promise<any> { | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" DROP CONSTRAINT "FK_ccbf5a8c0be4511133dcc50ddeb"`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "users"`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" ADD "users" character varying array NOT NULL DEFAULT '{}'`, undefined); | ||||||
|  |         await queryRunner.query(`CREATE TYPE "antenna_src_enum_old" AS ENUM('home', 'all', 'users', 'list')`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" ALTER COLUMN "src" TYPE "antenna_src_enum_old" USING "src"::"text"::"antenna_src_enum_old"`, undefined); | ||||||
|  |         await queryRunner.query(`DROP TYPE "antenna_src_enum"`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TYPE "antenna_src_enum_old" RENAME TO  "antenna_src_enum"`, undefined); | ||||||
|  |         await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "userGroupJoiningId"`, undefined); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -11,12 +11,17 @@ | ||||||
| 			<option value="home">{{ $t('_antennaSources.homeTimeline') }}</option> | 			<option value="home">{{ $t('_antennaSources.homeTimeline') }}</option> | ||||||
| 			<option value="users">{{ $t('_antennaSources.users') }}</option> | 			<option value="users">{{ $t('_antennaSources.users') }}</option> | ||||||
| 			<option value="list">{{ $t('_antennaSources.userList') }}</option> | 			<option value="list">{{ $t('_antennaSources.userList') }}</option> | ||||||
|  | 			<option value="group">{{ $t('_antennaSources.userGroup') }}</option> | ||||||
| 		</mk-select> | 		</mk-select> | ||||||
| 		<mk-select v-model="userListId" v-if="src === 'list'"> | 		<mk-select v-model="userListId" v-if="src === 'list'"> | ||||||
| 			<template #label>{{ $t('userList') }}</template> | 			<template #label>{{ $t('userList') }}</template> | ||||||
| 			<option v-for="list in userLists" :value="list.id" :key="list.id">{{ list.name }}</option> | 			<option v-for="list in userLists" :value="list.id" :key="list.id">{{ list.name }}</option> | ||||||
| 		</mk-select> | 		</mk-select> | ||||||
| 		<mk-textarea v-model="users" v-if="src === 'users'"> | 		<mk-select v-model="userGroupId" v-else-if="src === 'group'"> | ||||||
|  | 			<template #label>{{ $t('userGroup') }}</template> | ||||||
|  | 			<option v-for="group in userGroups" :value="group.id" :key="group.id">{{ group.name }}</option> | ||||||
|  | 		</mk-select> | ||||||
|  | 		<mk-textarea v-model="users" v-else-if="src === 'users'"> | ||||||
| 			<span>{{ $t('users') }}</span> | 			<span>{{ $t('users') }}</span> | ||||||
| 			<template #desc>{{ $t('antennaUsersDescription') }} <button class="_textButton" @click="addUser">{{ $t('addUser') }}</button></template> | 			<template #desc>{{ $t('antennaUsersDescription') }} <button class="_textButton" @click="addUser">{{ $t('addUser') }}</button></template> | ||||||
| 		</mk-textarea> | 		</mk-textarea> | ||||||
|  | @ -67,6 +72,7 @@ export default Vue.extend({ | ||||||
| 			name: '', | 			name: '', | ||||||
| 			src: '', | 			src: '', | ||||||
| 			userListId: null, | 			userListId: null, | ||||||
|  | 			userGroupId: null, | ||||||
| 			users: '', | 			users: '', | ||||||
| 			keywords: '', | 			keywords: '', | ||||||
| 			caseSensitive: false, | 			caseSensitive: false, | ||||||
|  | @ -74,6 +80,7 @@ export default Vue.extend({ | ||||||
| 			withFile: false, | 			withFile: false, | ||||||
| 			notify: false, | 			notify: false, | ||||||
| 			userLists: null, | 			userLists: null, | ||||||
|  | 			userGroups: null, | ||||||
| 			faSave, faTrash | 			faSave, faTrash | ||||||
| 		}; | 		}; | ||||||
| 	}, | 	}, | ||||||
|  | @ -83,6 +90,13 @@ export default Vue.extend({ | ||||||
| 			if (this.src === 'list' && this.userLists === null) { | 			if (this.src === 'list' && this.userLists === null) { | ||||||
| 				this.userLists = await this.$root.api('users/lists/list'); | 				this.userLists = await this.$root.api('users/lists/list'); | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
|  | 			if (this.src === 'group' && this.userGroups === null) { | ||||||
|  | 				const groups1 = await this.$root.api('users/groups/owned'); | ||||||
|  | 				const groups2 = await this.$root.api('users/groups/joined'); | ||||||
|  | 
 | ||||||
|  | 				this.userGroups = [...groups1, ...groups2]; | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
|  | @ -90,6 +104,7 @@ export default Vue.extend({ | ||||||
| 		this.name = this.antenna.name; | 		this.name = this.antenna.name; | ||||||
| 		this.src = this.antenna.src; | 		this.src = this.antenna.src; | ||||||
| 		this.userListId = this.antenna.userListId; | 		this.userListId = this.antenna.userListId; | ||||||
|  | 		this.userGroupId = this.antenna.userGroupId; | ||||||
| 		this.users = this.antenna.users.join('\n'); | 		this.users = this.antenna.users.join('\n'); | ||||||
| 		this.keywords = this.antenna.keywords.map(x => x.join(' ')).join('\n'); | 		this.keywords = this.antenna.keywords.map(x => x.join(' ')).join('\n'); | ||||||
| 		this.caseSensitive = this.antenna.caseSensitive; | 		this.caseSensitive = this.antenna.caseSensitive; | ||||||
|  | @ -105,6 +120,7 @@ export default Vue.extend({ | ||||||
| 					name: this.name, | 					name: this.name, | ||||||
| 					src: this.src, | 					src: this.src, | ||||||
| 					userListId: this.userListId, | 					userListId: this.userListId, | ||||||
|  | 					userGroupId: this.userGroupId, | ||||||
| 					withReplies: this.withReplies, | 					withReplies: this.withReplies, | ||||||
| 					withFile: this.withFile, | 					withFile: this.withFile, | ||||||
| 					notify: this.notify, | 					notify: this.notify, | ||||||
|  | @ -119,6 +135,7 @@ export default Vue.extend({ | ||||||
| 					name: this.name, | 					name: this.name, | ||||||
| 					src: this.src, | 					src: this.src, | ||||||
| 					userListId: this.userListId, | 					userListId: this.userListId, | ||||||
|  | 					userGroupId: this.userGroupId, | ||||||
| 					withReplies: this.withReplies, | 					withReplies: this.withReplies, | ||||||
| 					withFile: this.withFile, | 					withFile: this.withFile, | ||||||
| 					notify: this.notify, | 					notify: this.notify, | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ export default Vue.extend({ | ||||||
| 				name: '', | 				name: '', | ||||||
| 				src: 'all', | 				src: 'all', | ||||||
| 				userListId: null, | 				userListId: null, | ||||||
|  | 				userGroupId: null, | ||||||
| 				users: [], | 				users: [], | ||||||
| 				keywords: [], | 				keywords: [], | ||||||
| 				withReplies: false, | 				withReplies: false, | ||||||
|  |  | ||||||
|  | @ -1,9 +1,10 @@ | ||||||
| import { Antenna } from '../models/entities/antenna'; | import { Antenna } from '../models/entities/antenna'; | ||||||
| import { Note } from '../models/entities/note'; | import { Note } from '../models/entities/note'; | ||||||
| import { User } from '../models/entities/user'; | import { User } from '../models/entities/user'; | ||||||
| import { UserListJoinings } from '../models'; | import { UserListJoinings, UserGroupJoinings } from '../models'; | ||||||
| import parseAcct from './acct/parse'; | import parseAcct from './acct/parse'; | ||||||
| import { getFullApAccount } from './convert-host'; | import { getFullApAccount } from './convert-host'; | ||||||
|  | import { ensure } from '../prelude/ensure'; | ||||||
| 
 | 
 | ||||||
| export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: User, followers: User['id'][]): Promise<boolean> { | export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: User, followers: User['id'][]): Promise<boolean> { | ||||||
| 	if (note.visibility === 'specified') return false; | 	if (note.visibility === 'specified') return false; | ||||||
|  | @ -22,6 +23,14 @@ export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: Us | ||||||
| 		})).map(x => x.userId); | 		})).map(x => x.userId); | ||||||
| 
 | 
 | ||||||
| 		if (!listUsers.includes(note.userId)) return false; | 		if (!listUsers.includes(note.userId)) return false; | ||||||
|  | 	} else if (antenna.src === 'group') { | ||||||
|  | 		const joining = await UserGroupJoinings.findOne(antenna.userGroupJoiningId!).then(ensure); | ||||||
|  | 
 | ||||||
|  | 		const groupUsers = (await UserGroupJoinings.find({ | ||||||
|  | 			userGroupId: joining.userGroupId | ||||||
|  | 		})).map(x => x.userId); | ||||||
|  | 
 | ||||||
|  | 		if (!groupUsers.includes(note.userId)) return false; | ||||||
| 	} else if (antenna.src === 'users') { | 	} else if (antenna.src === 'users') { | ||||||
| 		const accts = antenna.users.map(x => { | 		const accts = antenna.users.map(x => { | ||||||
| 			const { username, host } = parseAcct(x); | 			const { username, host } = parseAcct(x); | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typ | ||||||
| import { User } from './user'; | import { User } from './user'; | ||||||
| import { id } from '../id'; | import { id } from '../id'; | ||||||
| import { UserList } from './user-list'; | import { UserList } from './user-list'; | ||||||
|  | import { UserGroupJoining } from './user-group-joining'; | ||||||
| 
 | 
 | ||||||
| @Entity() | @Entity() | ||||||
| export class Antenna { | export class Antenna { | ||||||
|  | @ -32,8 +33,8 @@ export class Antenna { | ||||||
| 	}) | 	}) | ||||||
| 	public name: string; | 	public name: string; | ||||||
| 
 | 
 | ||||||
| 	@Column('enum', { enum: ['home', 'all', 'users', 'list'] }) | 	@Column('enum', { enum: ['home', 'all', 'users', 'list', 'group'] }) | ||||||
| 	public src: 'home' | 'all' | 'users' | 'list'; | 	public src: 'home' | 'all' | 'users' | 'list' | 'group'; | ||||||
| 
 | 
 | ||||||
| 	@Column({ | 	@Column({ | ||||||
| 		...id(), | 		...id(), | ||||||
|  | @ -47,6 +48,18 @@ export class Antenna { | ||||||
| 	@JoinColumn() | 	@JoinColumn() | ||||||
| 	public userList: UserList | null; | 	public userList: UserList | null; | ||||||
| 
 | 
 | ||||||
|  | 	@Column({ | ||||||
|  | 		...id(), | ||||||
|  | 		nullable: true | ||||||
|  | 	}) | ||||||
|  | 	public userGroupJoiningId: UserGroupJoining['id'] | null; | ||||||
|  | 
 | ||||||
|  | 	@ManyToOne(type => UserGroupJoining, { | ||||||
|  | 		onDelete: 'CASCADE' | ||||||
|  | 	}) | ||||||
|  | 	@JoinColumn() | ||||||
|  | 	public userGroupJoining: UserGroupJoining | null; | ||||||
|  | 
 | ||||||
| 	@Column('varchar', { | 	@Column('varchar', { | ||||||
| 		length: 1024, array: true, | 		length: 1024, array: true, | ||||||
| 		default: '{}' | 		default: '{}' | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ import { EntityRepository, Repository } from 'typeorm'; | ||||||
| import { Antenna } from '../entities/antenna'; | import { Antenna } from '../entities/antenna'; | ||||||
| import { ensure } from '../../prelude/ensure'; | import { ensure } from '../../prelude/ensure'; | ||||||
| import { SchemaType } from '../../misc/schema'; | import { SchemaType } from '../../misc/schema'; | ||||||
| import { AntennaNotes } from '..'; | import { AntennaNotes, UserGroupJoinings } from '..'; | ||||||
| 
 | 
 | ||||||
| export type PackedAntenna = SchemaType<typeof packedAntennaSchema>; | export type PackedAntenna = SchemaType<typeof packedAntennaSchema>; | ||||||
| 
 | 
 | ||||||
|  | @ -14,6 +14,7 @@ export class AntennaRepository extends Repository<Antenna> { | ||||||
| 		const antenna = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | 		const antenna = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||||
| 
 | 
 | ||||||
| 		const hasUnreadNote = (await AntennaNotes.findOne({ antennaId: antenna.id, read: false })) != null; | 		const hasUnreadNote = (await AntennaNotes.findOne({ antennaId: antenna.id, read: false })) != null; | ||||||
|  | 		const userGroupJoining = antenna.userGroupJoiningId ? await UserGroupJoinings.findOne(antenna.userGroupJoiningId) : null; | ||||||
| 
 | 
 | ||||||
| 		return { | 		return { | ||||||
| 			id: antenna.id, | 			id: antenna.id, | ||||||
|  | @ -22,6 +23,7 @@ export class AntennaRepository extends Repository<Antenna> { | ||||||
| 			keywords: antenna.keywords, | 			keywords: antenna.keywords, | ||||||
| 			src: antenna.src, | 			src: antenna.src, | ||||||
| 			userListId: antenna.userListId, | 			userListId: antenna.userListId, | ||||||
|  | 			userGroupId: userGroupJoining ? userGroupJoining.userGroupId : null, | ||||||
| 			users: antenna.users, | 			users: antenna.users, | ||||||
| 			caseSensitive: antenna.caseSensitive, | 			caseSensitive: antenna.caseSensitive, | ||||||
| 			notify: antenna.notify, | 			notify: antenna.notify, | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| import $ from 'cafy'; | import $ from 'cafy'; | ||||||
| import define from '../../define'; | import define from '../../define'; | ||||||
| import { genId } from '../../../../misc/gen-id'; | import { genId } from '../../../../misc/gen-id'; | ||||||
| import { Antennas, UserLists } from '../../../../models'; | import { Antennas, UserLists, UserGroupJoinings } from '../../../../models'; | ||||||
| import { ID } from '../../../../misc/cafy-id'; | import { ID } from '../../../../misc/cafy-id'; | ||||||
| import { ApiError } from '../../error'; | import { ApiError } from '../../error'; | ||||||
| 
 | 
 | ||||||
|  | @ -18,13 +18,17 @@ export const meta = { | ||||||
| 		}, | 		}, | ||||||
| 
 | 
 | ||||||
| 		src: { | 		src: { | ||||||
| 			validator: $.str.or(['home', 'all', 'users', 'list']) | 			validator: $.str.or(['home', 'all', 'users', 'list', 'group']) | ||||||
| 		}, | 		}, | ||||||
| 
 | 
 | ||||||
| 		userListId: { | 		userListId: { | ||||||
| 			validator: $.nullable.optional.type(ID), | 			validator: $.nullable.optional.type(ID), | ||||||
| 		}, | 		}, | ||||||
| 
 | 
 | ||||||
|  | 		userGroupId: { | ||||||
|  | 			validator: $.nullable.optional.type(ID), | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
| 		keywords: { | 		keywords: { | ||||||
| 			validator: $.arr($.arr($.str)) | 			validator: $.arr($.arr($.str)) | ||||||
| 		}, | 		}, | ||||||
|  | @ -55,12 +59,19 @@ export const meta = { | ||||||
| 			message: 'No such user list.', | 			message: 'No such user list.', | ||||||
| 			code: 'NO_SUCH_USER_LIST', | 			code: 'NO_SUCH_USER_LIST', | ||||||
| 			id: '95063e93-a283-4b8b-9aa5-bcdb8df69a7f' | 			id: '95063e93-a283-4b8b-9aa5-bcdb8df69a7f' | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 		noSuchUserGroup: { | ||||||
|  | 			message: 'No such user group.', | ||||||
|  | 			code: 'NO_SUCH_USER_GROUP', | ||||||
|  | 			id: 'aa3c0b9a-8cae-47c0-92ac-202ce5906682' | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export default define(meta, async (ps, user) => { | export default define(meta, async (ps, user) => { | ||||||
| 	let userList; | 	let userList; | ||||||
|  | 	let userGroupJoining; | ||||||
| 
 | 
 | ||||||
| 	if (ps.src === 'list') { | 	if (ps.src === 'list') { | ||||||
| 		userList = await UserLists.findOne({ | 		userList = await UserLists.findOne({ | ||||||
|  | @ -71,6 +82,15 @@ export default define(meta, async (ps, user) => { | ||||||
| 		if (userList == null) { | 		if (userList == null) { | ||||||
| 			throw new ApiError(meta.errors.noSuchUserList); | 			throw new ApiError(meta.errors.noSuchUserList); | ||||||
| 		} | 		} | ||||||
|  | 	} else if (ps.src === 'group') { | ||||||
|  | 		userGroupJoining = await UserGroupJoinings.findOne({ | ||||||
|  | 			userGroupId: ps.userGroupId, | ||||||
|  | 			userId: user.id, | ||||||
|  | 		}); | ||||||
|  | 	 | ||||||
|  | 		if (userGroupJoining == null) { | ||||||
|  | 			throw new ApiError(meta.errors.noSuchUserGroup); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	const antenna = await Antennas.save({ | 	const antenna = await Antennas.save({ | ||||||
|  | @ -80,6 +100,7 @@ export default define(meta, async (ps, user) => { | ||||||
| 		name: ps.name, | 		name: ps.name, | ||||||
| 		src: ps.src, | 		src: ps.src, | ||||||
| 		userListId: userList ? userList.id : null, | 		userListId: userList ? userList.id : null, | ||||||
|  | 		userGroupJoiningId: userGroupJoining ? userGroupJoining.id : null, | ||||||
| 		keywords: ps.keywords, | 		keywords: ps.keywords, | ||||||
| 		users: ps.users, | 		users: ps.users, | ||||||
| 		caseSensitive: ps.caseSensitive, | 		caseSensitive: ps.caseSensitive, | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ import $ from 'cafy'; | ||||||
| import { ID } from '../../../../misc/cafy-id'; | import { ID } from '../../../../misc/cafy-id'; | ||||||
| import define from '../../define'; | import define from '../../define'; | ||||||
| import { ApiError } from '../../error'; | import { ApiError } from '../../error'; | ||||||
| import { Antennas, UserLists } from '../../../../models'; | import { Antennas, UserLists, UserGroupJoinings } from '../../../../models'; | ||||||
| 
 | 
 | ||||||
| export const meta = { | export const meta = { | ||||||
| 	tags: ['antennas'], | 	tags: ['antennas'], | ||||||
|  | @ -21,13 +21,17 @@ export const meta = { | ||||||
| 		}, | 		}, | ||||||
| 
 | 
 | ||||||
| 		src: { | 		src: { | ||||||
| 			validator: $.str.or(['home', 'all', 'users', 'list']) | 			validator: $.str.or(['home', 'all', 'users', 'list', 'group']) | ||||||
| 		}, | 		}, | ||||||
| 
 | 
 | ||||||
| 		userListId: { | 		userListId: { | ||||||
| 			validator: $.nullable.optional.type(ID), | 			validator: $.nullable.optional.type(ID), | ||||||
| 		}, | 		}, | ||||||
| 
 | 
 | ||||||
|  | 		userGroupId: { | ||||||
|  | 			validator: $.nullable.optional.type(ID), | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
| 		keywords: { | 		keywords: { | ||||||
| 			validator: $.arr($.arr($.str)) | 			validator: $.arr($.arr($.str)) | ||||||
| 		}, | 		}, | ||||||
|  | @ -64,6 +68,12 @@ export const meta = { | ||||||
| 			message: 'No such user list.', | 			message: 'No such user list.', | ||||||
| 			code: 'NO_SUCH_USER_LIST', | 			code: 'NO_SUCH_USER_LIST', | ||||||
| 			id: '1c6b35c9-943e-48c2-81e4-2844989407f7' | 			id: '1c6b35c9-943e-48c2-81e4-2844989407f7' | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 		noSuchUserGroup: { | ||||||
|  | 			message: 'No such user group.', | ||||||
|  | 			code: 'NO_SUCH_USER_GROUP', | ||||||
|  | 			id: '109ed789-b6eb-456e-b8a9-6059d567d385' | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|  | @ -80,6 +90,7 @@ export default define(meta, async (ps, user) => { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	let userList; | 	let userList; | ||||||
|  | 	let userGroupJoining; | ||||||
| 
 | 
 | ||||||
| 	if (ps.src === 'list') { | 	if (ps.src === 'list') { | ||||||
| 		userList = await UserLists.findOne({ | 		userList = await UserLists.findOne({ | ||||||
|  | @ -90,12 +101,22 @@ export default define(meta, async (ps, user) => { | ||||||
| 		if (userList == null) { | 		if (userList == null) { | ||||||
| 			throw new ApiError(meta.errors.noSuchUserList); | 			throw new ApiError(meta.errors.noSuchUserList); | ||||||
| 		} | 		} | ||||||
|  | 	} else if (ps.src === 'group') { | ||||||
|  | 		userGroupJoining = await UserGroupJoinings.findOne({ | ||||||
|  | 			userGroupId: ps.userGroupId, | ||||||
|  | 			userId: user.id, | ||||||
|  | 		}); | ||||||
|  | 	 | ||||||
|  | 		if (userGroupJoining == null) { | ||||||
|  | 			throw new ApiError(meta.errors.noSuchUserGroup); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	await Antennas.update(antenna.id, { | 	await Antennas.update(antenna.id, { | ||||||
| 		name: ps.name, | 		name: ps.name, | ||||||
| 		src: ps.src, | 		src: ps.src, | ||||||
| 		userListId: userList ? userList.id : null, | 		userListId: userList ? userList.id : null, | ||||||
|  | 		userGroupJoiningId: userGroupJoining ? userGroupJoining.id : null, | ||||||
| 		keywords: ps.keywords, | 		keywords: ps.keywords, | ||||||
| 		users: ps.users, | 		users: ps.users, | ||||||
| 		caseSensitive: ps.caseSensitive, | 		caseSensitive: ps.caseSensitive, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue