1
0
mirror of https://github.com/MisskeyIO/misskey synced 2024-12-26 04:28:17 +09:00

Merge branch 'io' into merge-upstream

This commit is contained in:
riku6460 2023-10-21 03:32:56 +09:00
commit 8d27363ccb
No known key found for this signature in database
GPG Key ID: 27414FA27DB94CF6
4 changed files with 40 additions and 29 deletions

View File

@ -554,7 +554,7 @@ export class NoteCreateService implements OnApplicationShutdown {
} }
// Pack the note // Pack the note
const noteObj = await this.noteEntityService.pack(note, user); const noteObj = await this.noteEntityService.pack(note, null);
this.globalEventService.publishNotesStream(noteObj); this.globalEventService.publishNotesStream(noteObj);

View File

@ -8,6 +8,7 @@ import * as Redis from 'ioredis';
import { In } from 'typeorm'; import { In } from 'typeorm';
import type { MiRole, MiRoleAssignment, RoleAssignmentsRepository, RolesRepository, UsersRepository } from '@/models/_.js'; import type { MiRole, MiRoleAssignment, RoleAssignmentsRepository, RolesRepository, UsersRepository } from '@/models/_.js';
import { MemoryKVCache, MemorySingleCache } from '@/misc/cache.js'; import { MemoryKVCache, MemorySingleCache } from '@/misc/cache.js';
import { IdentifiableError } from '@/misc/identifiable-error.js';
import type { MiUser } from '@/models/User.js'; import type { MiUser } from '@/models/User.js';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
@ -84,9 +85,6 @@ export class RoleService implements OnApplicationShutdown {
private rolesCache: MemorySingleCache<MiRole[]>; private rolesCache: MemorySingleCache<MiRole[]>;
private roleAssignmentByUserIdCache: MemoryKVCache<MiRoleAssignment[]>; private roleAssignmentByUserIdCache: MemoryKVCache<MiRoleAssignment[]>;
public static AlreadyAssignedError = class extends Error {};
public static NotAssignedError = class extends Error {};
constructor( constructor(
@Inject(DI.redis) @Inject(DI.redis)
private redisClient: Redis.Redis, private redisClient: Redis.Redis,
@ -395,36 +393,41 @@ export class RoleService implements OnApplicationShutdown {
const role = await this.rolesRepository.findOneByOrFail({ id: roleId }); const role = await this.rolesRepository.findOneByOrFail({ id: roleId });
const existing = await this.roleAssignmentsRepository.findOneBy({ let existing = await this.roleAssignmentsRepository.findOneBy({
roleId: roleId, roleId: roleId,
userId: userId, userId: userId,
}); });
if (existing) { if (existing?.expiresAt && (existing.expiresAt.getTime() < now.getTime())) {
if (existing.expiresAt && (existing.expiresAt.getTime() < now.getTime())) { await this.roleAssignmentsRepository.delete({
await this.roleAssignmentsRepository.delete({ roleId: roleId,
roleId: roleId, userId: userId,
userId: userId, });
}); existing = null;
} else {
throw new RoleService.AlreadyAssignedError();
}
} }
const created = await this.roleAssignmentsRepository.insert({ if (!existing) {
id: this.idService.genId(), const created = await this.roleAssignmentsRepository.insert({
createdAt: now, id: this.idService.genId(),
expiresAt: expiresAt, createdAt: now,
roleId: roleId, expiresAt: expiresAt,
userId: userId, roleId: roleId,
}).then(x => this.roleAssignmentsRepository.findOneByOrFail(x.identifiers[0])); userId: userId,
}).then(x => this.roleAssignmentsRepository.findOneByOrFail(x.identifiers[0]));
this.globalEventService.publishInternalEvent('userRoleAssigned', created);
} else if (existing.expiresAt !== expiresAt) {
await this.roleAssignmentsRepository.update(existing.id, {
expiresAt: expiresAt,
});
} else {
throw new IdentifiableError('67d8689c-25c6-435f-8ced-631e4b81fce1', 'User is already assigned to this role.');
}
this.rolesRepository.update(roleId, { this.rolesRepository.update(roleId, {
lastUsedAt: new Date(), lastUsedAt: new Date(),
}); });
this.globalEventService.publishInternalEvent('userRoleAssigned', created);
if (moderator) { if (moderator) {
const user = await this.usersRepository.findOneByOrFail({ id: userId }); const user = await this.usersRepository.findOneByOrFail({ id: userId });
this.moderationLogService.log(moderator, 'assignRole', { this.moderationLogService.log(moderator, 'assignRole', {
@ -442,15 +445,17 @@ export class RoleService implements OnApplicationShutdown {
public async unassign(userId: MiUser['id'], roleId: MiRole['id'], moderator?: MiUser): Promise<void> { public async unassign(userId: MiUser['id'], roleId: MiRole['id'], moderator?: MiUser): Promise<void> {
const now = new Date(); const now = new Date();
const existing = await this.roleAssignmentsRepository.findOneBy({ roleId, userId }); let existing = await this.roleAssignmentsRepository.findOneBy({ roleId, userId });
if (existing == null) { if (existing?.expiresAt && (existing.expiresAt.getTime() < now.getTime())) {
throw new RoleService.NotAssignedError();
} else if (existing.expiresAt && (existing.expiresAt.getTime() < now.getTime())) {
await this.roleAssignmentsRepository.delete({ await this.roleAssignmentsRepository.delete({
roleId: roleId, roleId: roleId,
userId: userId, userId: userId,
}); });
throw new RoleService.NotAssignedError(); existing = null;
}
if (!existing) {
throw new IdentifiableError('b9060ac7-5c94-4da4-9f55-2047c953df44', 'User was not assigned to this role.');
} }
await this.roleAssignmentsRepository.delete(existing.id); await this.roleAssignmentsRepository.delete(existing.id);

View File

@ -29,6 +29,12 @@ export const meta = {
id: '558ea170-f653-4700-94d0-5a818371d0df', id: '558ea170-f653-4700-94d0-5a818371d0df',
}, },
alreadyAssigned: {
message: 'User is already assigned to this role.',
code: 'ALREADY_ASSIGNED',
id: '67d8689c-25c6-435f-8ced-631e4b81fce1',
},
accessDenied: { accessDenied: {
message: 'Only administrators can edit members of the role.', message: 'Only administrators can edit members of the role.',
code: 'ACCESS_DENIED', code: 'ACCESS_DENIED',

View File

@ -30,7 +30,7 @@ export const meta = {
}, },
notAssigned: { notAssigned: {
message: 'Not assigned.', message: 'User was not assigned to this role.',
code: 'NOT_ASSIGNED', code: 'NOT_ASSIGNED',
id: 'b9060ac7-5c94-4da4-9f55-2047c953df44', id: 'b9060ac7-5c94-4da4-9f55-2047c953df44',
}, },