private async Task PublishPayloadAsync(DeployPayload payload) { IOctopusAsyncClient client = await this._octopusClientFactory.CreateAsyncClient(this._octopusServerEndpoint); string serverUri = payload.ServerUri; string spaceId = payload.Event?.SpaceId ?? "Spaces-1"; string?projectId = FindDocumentId(payload: payload, documentPrefix: "Projects-"); string?releaseId = FindDocumentId(payload: payload, documentPrefix: "Releases-"); string?environmentId = FindDocumentId(payload: payload, documentPrefix: "Environments-"); string?deploymentId = FindDocumentId(payload: payload, documentPrefix: "Deployments-"); string?tenantId = FindDocumentId(payload: payload, documentPrefix: "Tenants-"); ProjectResource?project = await client.Repository.Projects.Get(projectId); ReleaseResource?release = await client.Repository.Releases.Get(releaseId); EnvironmentResource?environment = await client.Repository.Environments.Get(environmentId); TenantResource?tenant = null; if (!string.IsNullOrWhiteSpace(tenantId)) { tenant = await client.Repository.Tenants.Get(tenantId); } string?projectName = NormalizeProjectName(project: project, projectId: projectId); string?environmentName = NormaliseEnvironmentName(environment: environment, environmentId: environmentId, out bool releaseNoteWorthy, out string?tenantName); string?releaseVersion = release != null ? release.Version : releaseId; if (tenant != null) { tenantName = NormaliseTenantName(tenant); } if (projectName == null || releaseVersion == null || environmentName == null) { // no idea what we're releasing if it has none of the above. return; } bool succeeded = HasSucceeded(payload); EmbedBuilder builder = BuildMessage(projectName: projectName, releaseVersion: releaseVersion, environmentName: environmentName, tenantName: tenantName, release: release, succeeded: succeeded); AddDeploymentId(serverUri: serverUri, deploymentId: deploymentId, builder: builder, spaceId: spaceId); AddDeploymentDetails(builder: builder, projectName: projectName, releaseVersion: releaseVersion, environmentName: environmentName, tenantName: tenantName); await this._bot.PublishAsync(builder); if (succeeded && releaseNoteWorthy) { await this._bot.PublishToReleaseChannelAsync(builder); } }
private static string?FindDocumentId(DeployPayload payload, string documentPrefix) { IReadOnlyList <string>?relatedDocumentIds = payload.Event?.RelatedDocumentIds; return(relatedDocumentIds?.FirstOrDefault(x => x.StartsWith(value: documentPrefix, comparisonType: StringComparison.OrdinalIgnoreCase))); }