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 { constructor( private readonly access: WriteAccess, private readonly releaseNames: ReleaseNamesRepository, ) {} async execute(command: UpdateReleaseCommand): Promise { 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); } }