38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
|
|
import { ReleaseNamesRepository } from '../ports/release-names.repository';
|
|
import { CommandResult, ack } from './command-result';
|
|
import { UpdateReleaseCommand } from './update-release.command';
|
|
import { WriteAccess } from './write-access';
|
|
|
|
@CommandHandler(UpdateReleaseCommand)
|
|
export class UpdateReleaseCommandHandler
|
|
implements ICommandHandler<UpdateReleaseCommand>
|
|
{
|
|
constructor(
|
|
private readonly access: WriteAccess,
|
|
private readonly releaseNames: ReleaseNamesRepository,
|
|
) {}
|
|
|
|
async execute(command: UpdateReleaseCommand): Promise<CommandResult> {
|
|
const release = await this.access.release(command.releaseId);
|
|
(await this.access.project(release.projectId)).assertCanManage(
|
|
command.actorId,
|
|
);
|
|
|
|
const previousName = release.name;
|
|
release.update(command.actorId, command.changes);
|
|
if (release.name !== previousName) {
|
|
await this.releaseNames.reserve(
|
|
release.projectId,
|
|
release.name,
|
|
release.id,
|
|
);
|
|
}
|
|
await release.commitAndWait();
|
|
if (release.name !== previousName) {
|
|
await this.releaseNames.free(release.projectId, previousName);
|
|
}
|
|
return ack(release);
|
|
}
|
|
}
|