Add project files.
This commit is contained in:
		
							
								
								
									
										30
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | **/.classpath | ||||||
|  | **/.dockerignore | ||||||
|  | **/.env | ||||||
|  | **/.git | ||||||
|  | **/.gitignore | ||||||
|  | **/.project | ||||||
|  | **/.settings | ||||||
|  | **/.toolstarget | ||||||
|  | **/.vs | ||||||
|  | **/.vscode | ||||||
|  | **/*.*proj.user | ||||||
|  | **/*.dbmdl | ||||||
|  | **/*.jfm | ||||||
|  | **/azds.yaml | ||||||
|  | **/bin | ||||||
|  | **/charts | ||||||
|  | **/docker-compose* | ||||||
|  | **/Dockerfile* | ||||||
|  | **/node_modules | ||||||
|  | **/npm-debug.log | ||||||
|  | **/obj | ||||||
|  | **/secrets.dev.yaml | ||||||
|  | **/values.dev.yaml | ||||||
|  | LICENSE | ||||||
|  | README.md | ||||||
|  | !**/.gitignore | ||||||
|  | !.git/HEAD | ||||||
|  | !.git/config | ||||||
|  | !.git/packed-refs | ||||||
|  | !.git/refs/heads/** | ||||||
							
								
								
									
										48
									
								
								Core.Blueprint.API/Controllers/BaseController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								Core.Blueprint.API/Controllers/BaseController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | using Lib.Architecture.BuildingBlocks.Presentation.Adapters; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  | using Newtonsoft.Json; | ||||||
|  | using Refit; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.API.Controllers | ||||||
|  | { | ||||||
|  |     [Route("api/[controller]")] | ||||||
|  |     [ApiController] | ||||||
|  |     public class BaseController(ILogger<BaseController> logger) : ControllerBase | ||||||
|  |     { | ||||||
|  |         private readonly ILogger<BaseController> _logger = logger; | ||||||
|  |  | ||||||
|  |         protected Guid TrackingId => (Guid)(HttpContext.Items["TrackingId"] ?? Guid.NewGuid()); | ||||||
|  |  | ||||||
|  |         protected async Task<IActionResult> Handle<T>(Func<Task<ApiResponse<T>>> apiCall) where T : class | ||||||
|  |         { | ||||||
|  |             var response = await apiCall().ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |             _logger.LogInformation($"{TrackingId} - {response.RequestMessage?.Method} {response.RequestMessage?.RequestUri} - Status: {response.StatusCode}"); | ||||||
|  |  | ||||||
|  |             return FromAPIResponse(response); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private IActionResult FromAPIResponse<T>(ApiResponse<T> response) where T : class | ||||||
|  |         { | ||||||
|  |             if (response.IsSuccessful) | ||||||
|  |                 return StatusCode((int)response.StatusCode, response.Content); | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 dynamic errorContent = string.Empty; | ||||||
|  |  | ||||||
|  |                 try | ||||||
|  |                 { | ||||||
|  |                     errorContent = JsonConvert.DeserializeObject<string>(response.Error?.Content ?? string.Empty) ?? string.Empty; | ||||||
|  |                 } | ||||||
|  |                 catch (Exception) | ||||||
|  |                 { | ||||||
|  |                     errorContent = JsonConvert.DeserializeObject<HttpError>(response.Error?.Content); | ||||||
|  |                     if (errorContent?.Error?.ErrorCode is null && errorContent?.Error?.Message is null && errorContent?.Error?.Target is null) | ||||||
|  |                         errorContent = JsonConvert.DeserializeObject<GenericErrorResponse>(response.Error?.Content); | ||||||
|  |  | ||||||
|  |                 } | ||||||
|  |                 return StatusCode((int)response.StatusCode, errorContent); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										130
									
								
								Core.Blueprint.API/Controllers/BlobStorageController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								Core.Blueprint.API/Controllers/BlobStorageController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | |||||||
|  | using Core.Blueprint.API.Controllers; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests.BlobStorage; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
|  | namespace Core.Blob.API.Controllers | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Handles all requests for blob. | ||||||
|  |     /// </summary> | ||||||
|  |     [ApiVersion("1.0")] | ||||||
|  |     //[Route("api/v{version:apiVersion}/[controller]")] | ||||||
|  |     [Consumes("application/json")] | ||||||
|  |     [Produces("application/json")] | ||||||
|  |     [ApiController] | ||||||
|  |     public class BlobStorageController(IBlueprintServiceClient blueprintServiceClient, ILogger<BlobStorageController> logger) : BaseController(logger) | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Uploads a new blob. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("UploadBlob")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> UploadBlobService(UploadBlobRequest newBlob, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(UploadBlobService)} - Request received - Payload: {JsonSerializer.Serialize(newBlob)}"); | ||||||
|  |  | ||||||
|  |                 if (newBlob == null) return BadRequest("Invalid blob object"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newBlob.BlobName)) return BadRequest("Invalid blob name"); | ||||||
|  |  | ||||||
|  |                 if (newBlob.BlobContent is null) return BadRequest("Invalid blob content"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.UploadBlobService(newBlob, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(UploadBlobService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(newBlob)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets all blobs into the container. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpGet("GetBlobList")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetBlobListService([FromQuery] string? prefix, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(GetBlobListService)} - Request received - Payload: "); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.GetBlobListAsync(prefix, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(GetBlobListService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Donwloads a blob by name. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("DownloadBlob")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> DownloadBlobService(DownloadBlobRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(DownloadBlobService)} - Request received - Payload: {JsonSerializer.Serialize(request)}"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(request.BlobName)) return BadRequest("Invalid blob name"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.DownloadBlobAsync(request, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(DownloadBlobService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(request)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Deletes the blob by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpDelete("Delete")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> DeleteBlobService([FromBody] DeleteBlobRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(DeleteBlobService)} - Request received - Payload: {JsonSerializer.Serialize(request)}"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(request.BlobName)) return BadRequest("Invalid blob name"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.DeleteBlobService(request, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(DeleteBlobService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(request)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										136
									
								
								Core.Blueprint.API/Controllers/KeyVaultController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								Core.Blueprint.API/Controllers/KeyVaultController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,136 @@ | |||||||
|  | using Core.Blueprint.API.Controllers; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests.KeyVault; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
|  | namespace Core.Secret.API.Controllers | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Handles all requests for secret. | ||||||
|  |     /// </summary> | ||||||
|  |     [ApiVersion("1.0")] | ||||||
|  |     //[Route("api/v{version:apiVersion}/[controller]")] | ||||||
|  |     [Consumes("application/json")] | ||||||
|  |     [Produces("application/json")] | ||||||
|  |     [ApiController] | ||||||
|  |     public class KeyVaultController(IBlueprintServiceClient blueprintServiceClient, ILogger<KeyVaultController> logger) : BaseController(logger) | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Creates a new secret. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("Create")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> CreateSecretService(CreateSecretRequest newSecret, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(CreateSecretService)} - Request received - Payload: {JsonSerializer.Serialize(newSecret)}"); | ||||||
|  |  | ||||||
|  |                 if (newSecret == null) return BadRequest("Invalid secret object"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newSecret.Name)) return BadRequest("Invalid secret name"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newSecret.Value)) return BadRequest("Invalid secret description"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.CreateSecretService(newSecret, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(CreateSecretService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(newSecret)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets the secret by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("GetSecretByName")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetSecretByNameService(GetSecretRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(GetSecretByNameService)} - Request received - Payload: {JsonSerializer.Serialize(request)}"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(request.Name)) return BadRequest("Invalid secret name"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.GetSecretByNameService(request, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(GetSecretByNameService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(request)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Updates a full secret by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPut("Update")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> UpdateSecretService(UpdateSecretRequest newSecret, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(UpdateSecretService)} - Request received - Payload: {JsonSerializer.Serialize(newSecret)}"); | ||||||
|  |  | ||||||
|  |                 if (newSecret == null) return BadRequest("Invalid secret object"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newSecret.Name)) return BadRequest("Invalid secret name"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newSecret.Value)) return BadRequest("Invalid secret value"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.UpdateSecretService(newSecret, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(UpdateSecretService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(newSecret)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Deletes the secret by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("Delete")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> DeleteSecretService(DeleteSecretRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(DeleteSecretService)} - Request received - Payload: {JsonSerializer.Serialize(request)}"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(request.Name)) return BadRequest("Invalid secret name"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.DeleteSecretService(request, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(DeleteSecretService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(request)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										160
									
								
								Core.Blueprint.API/Controllers/MongoBlueprintController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								Core.Blueprint.API/Controllers/MongoBlueprintController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | |||||||
|  | using Core.Blueprint.External.Clients.Blueprint; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests.Mongo; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.API.Controllers | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Handles all requests for blueprint. | ||||||
|  |     /// </summary> | ||||||
|  |     [ApiVersion("1.0")] | ||||||
|  |     //[Route("api/v{version:apiVersion}/[controller]")] | ||||||
|  |     [Consumes("application/json")] | ||||||
|  |     [Produces("application/json")] | ||||||
|  |     [ApiController] | ||||||
|  |     public class MongoBlueprintController(IBlueprintServiceClient blueprintServiceClient, ILogger<MongoBlueprintController> logger) : BaseController(logger) | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Creates a new blueprint. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("Create")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> CreateBlueprintService(CreateBlueprintRequest newBlueprint, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(CreateBlueprintService)} - Request received - Payload: {JsonSerializer.Serialize(newBlueprint)}"); | ||||||
|  |  | ||||||
|  |                 if (newBlueprint == null) return BadRequest("Invalid blueprint object"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newBlueprint.Name)) return BadRequest("Invalid blueprint name"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newBlueprint.Description)) return BadRequest("Invalid blueprint description"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.CreateBlueprintService(newBlueprint, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(CreateBlueprintService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(newBlueprint)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets all blueprints. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpGet("GetAll")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetAllBlueprintsService(CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(GetAllBlueprintsService)} - Request received - Payload: "); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.GetAllBlueprintsService(cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(GetAllBlueprintsService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets the blueprint by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("GetById")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetBlueprintByIdService(GetBlueprintRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(GetBlueprintByIdService)} - Request received - Payload: {JsonSerializer.Serialize(request)}"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(request._Id)) return BadRequest("Invalid blueprint identifier"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.GetBlueprintByIdService(request, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(GetBlueprintByIdService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(request)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Updates a full blueprint by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPut("Update")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> UpdateBlueprintService(UpdateBlueprintRequest newBlueprint, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(UpdateBlueprintService)} - Request received - Payload: {JsonSerializer.Serialize(newBlueprint)}"); | ||||||
|  |  | ||||||
|  |                 if (newBlueprint == null) return BadRequest("Invalid blueprint object"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newBlueprint.Name)) return BadRequest("Invalid blueprint name"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newBlueprint.Description)) return BadRequest("Invalid blueprint description"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.UpdateBlueprintService(newBlueprint, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(UpdateBlueprintService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(newBlueprint)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Deletes the blueprint by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("Delete")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> DeleteBlueprintService(DeleteBlueprintRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(DeleteBlueprintService)} - Request received - Payload: {JsonSerializer.Serialize(request)}"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(request._Id)) return BadRequest("Invalid blueprint identifier"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.DeleteBlueprintService(request, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(DeleteBlueprintService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(request)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										165
									
								
								Core.Blueprint.API/Controllers/SQLUserProjectController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								Core.Blueprint.API/Controllers/SQLUserProjectController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,165 @@ | |||||||
|  | using Core.Blueprint.API.Controllers; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests.SQL; | ||||||
|  | using Lib.Architecture.BuildingBlocks; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
|  | namespace Core.UserProject.API.Controllers | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Handles all requests for user project. | ||||||
|  |     /// </summary> | ||||||
|  |     [ApiVersion("1.0")] | ||||||
|  |     //[Route("api/v{version:apiVersion}/[controller]")] | ||||||
|  |     [Consumes("application/json")] | ||||||
|  |     [Produces("application/json")] | ||||||
|  |     [ApiController] | ||||||
|  |     public class SQLUserProjectController(IBlueprintServiceClient blueprintServiceClient, ILogger<SQLUserProjectController> logger) : BaseController(logger) | ||||||
|  |     { | ||||||
|  |         /// <summary> | ||||||
|  |         /// Creates a new user project. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("Create")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> CreateUserProjectService(CreateUserProjectRequest newUserProject, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(CreateUserProjectService)} - Request received - Payload: {JsonSerializer.Serialize(newUserProject)}"); | ||||||
|  |  | ||||||
|  |                 if (newUserProject == null) return BadRequest("Invalid user project object"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newUserProject.ProjectCode)) return BadRequest("Invalid project code"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newUserProject.ProjectDescription)) return BadRequest("Invalid project description"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(newUserProject.UserId)) return BadRequest("Invalid user identifier"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.CreateUserProjectService(newUserProject, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(CreateUserProjectService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(newUserProject)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets all user projects. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpGet("GetAll")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetAllUserProjectsService(CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(GetAllUserProjectsService)} - Request received - Payload: "); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.GetAllUserProjectsService(cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(GetAllUserProjectsService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Gets the user project by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("GetById")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> GetUserProjectByIdService(GetUserProjectRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(GetUserProjectByIdService)} - Request received - Payload: {JsonSerializer.Serialize(request)}"); | ||||||
|  |  | ||||||
|  |                 if (request.Id <= 0) return BadRequest("Invalid user project identifier"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.GetUserProjectByIdService(request, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(GetUserProjectByIdService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(request)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Updates a full user project by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPut("Update")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> UpdateUserProjectService(UpdateUserProjectRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(UpdateUserProjectService)} - Request received - Payload: {JsonSerializer.Serialize(request)}"); | ||||||
|  |  | ||||||
|  |                 if (request == null) return BadRequest("Invalid user project object"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(request.ProjectCode)) return BadRequest("Invalid user project code"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(request.ProjectDescription)) return BadRequest("Invalid user project description"); | ||||||
|  |  | ||||||
|  |                 if (string.IsNullOrEmpty(request.UserId)) return BadRequest("Invalid user identifier"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.UpdateUserProjectService(request, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(UpdateUserProjectService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(request)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Deletes the user project by identifier. | ||||||
|  |         /// </summary> | ||||||
|  |         [HttpPost("Delete")] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status200OK)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status400BadRequest)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status412PreconditionFailed)] | ||||||
|  |         [ProducesResponseType(typeof(Notification), StatusCodes.Status422UnprocessableEntity)] | ||||||
|  |         [ProducesResponseType(StatusCodes.Status500InternalServerError)] | ||||||
|  |         public async Task<IActionResult> DeleteUserProjectService(DeleteUserProjectRequest request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 logger.LogInformation($"{nameof(DeleteUserProjectService)} - Request received - Payload: {JsonSerializer.Serialize(request)}"); | ||||||
|  |  | ||||||
|  |                 if (request.Id <= 0) return BadRequest("Invalid user project identifier"); | ||||||
|  |  | ||||||
|  |                 return await Handle(() => blueprintServiceClient.DeleteUserProjectService(request, cancellationToken)).ConfigureAwait(false); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 logger.LogError($"{nameof(DeleteUserProjectService)} - An Error Occurred- {ex.Message} - {ex.InnerException} - {ex.StackTrace} - with payload {JsonSerializer.Serialize(request)}"); | ||||||
|  |                 throw; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								Core.Blueprint.API/Core.Blueprint.API.http
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Core.Blueprint.API/Core.Blueprint.API.http
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | @Core.Blueprint.API_HostAddress = http://localhost:5239 | ||||||
|  |  | ||||||
|  | GET {{Core.Blueprint.API_HostAddress}}/weatherforecast/ | ||||||
|  | Accept: application/json | ||||||
|  |  | ||||||
|  | ### | ||||||
							
								
								
									
										30
									
								
								Core.Blueprint.API/Core.Blueprint.BFF.API.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Core.Blueprint.API/Core.Blueprint.BFF.API.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk.Web"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net8.0</TargetFramework> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <UserSecretsId>a9738f26-cc0a-4362-9b27-8e8bacd0b42d</UserSecretsId> | ||||||
|  |     <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="Core.Blueprint.Logging" Version="0.3.0-alpha0034" /> | ||||||
|  |     <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.1.0" /> | ||||||
|  |     <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" /> | ||||||
|  |     <PackageReference Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="8.0.0" /> | ||||||
|  |     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" /> | ||||||
|  |     <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> | ||||||
|  |     <PackageReference Include="OpenTelemetry" Version="1.10.0" /> | ||||||
|  |     <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.10.0" /> | ||||||
|  |     <PackageReference Include="Refit" Version="8.0.0" /> | ||||||
|  |     <PackageReference Include="Refit.HttpClientFactory" Version="8.0.0" /> | ||||||
|  |     <PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" /> | ||||||
|  |     <PackageReference Include="System.Text.Json" Version="9.0.0" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\Core.Blueprint.External\Core.Blueprint.External.csproj" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
							
								
								
									
										25
									
								
								Core.Blueprint.API/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Core.Blueprint.API/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. | ||||||
|  |  | ||||||
|  | FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base | ||||||
|  | USER app | ||||||
|  | WORKDIR /app | ||||||
|  | EXPOSE 8080 | ||||||
|  | EXPOSE 8081 | ||||||
|  |  | ||||||
|  | FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build | ||||||
|  | ARG BUILD_CONFIGURATION=Release | ||||||
|  | WORKDIR /src | ||||||
|  | COPY ["Core.Blueprint.API/Core.Blueprint.API.csproj", "Core.Blueprint.API/"] | ||||||
|  | RUN dotnet restore "./Core.Blueprint.API/Core.Blueprint.API.csproj" | ||||||
|  | COPY . . | ||||||
|  | WORKDIR "/src/Core.Blueprint.API" | ||||||
|  | RUN dotnet build "./Core.Blueprint.API.csproj" -c $BUILD_CONFIGURATION -o /app/build | ||||||
|  |  | ||||||
|  | FROM build AS publish | ||||||
|  | ARG BUILD_CONFIGURATION=Release | ||||||
|  | RUN dotnet publish "./Core.Blueprint.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false | ||||||
|  |  | ||||||
|  | FROM base AS final | ||||||
|  | WORKDIR /app | ||||||
|  | COPY --from=publish /app/publish . | ||||||
|  | ENTRYPOINT ["dotnet", "Core.Blueprint.API.dll"] | ||||||
							
								
								
									
										135
									
								
								Core.Blueprint.API/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								Core.Blueprint.API/Program.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | |||||||
|  | using Azure.Identity; | ||||||
|  | using Core.Blueprint.External; | ||||||
|  | using Core.Blueprint.External.ClientConfiguration; | ||||||
|  | using Core.Blueprint.Logging.Configuration; | ||||||
|  | using Microsoft.AspNetCore.ResponseCompression; | ||||||
|  | using Microsoft.Extensions.Configuration.AzureAppConfiguration; | ||||||
|  | using OpenTelemetry.Logs; | ||||||
|  | using OpenTelemetry.Resources; | ||||||
|  | using System.IO.Compression; | ||||||
|  | using System.Reflection; | ||||||
|  |  | ||||||
|  | var builder = WebApplication.CreateBuilder(args); | ||||||
|  |  | ||||||
|  | builder.Configuration.AddAzureAppConfiguration(options => | ||||||
|  | { | ||||||
|  |     var endpoint = builder.Configuration.GetSection("Endpoints:AppConfigurationURI").Value; | ||||||
|  |  | ||||||
|  |     if (string.IsNullOrEmpty(endpoint)) | ||||||
|  |         throw new ArgumentException("The app configuration is missing"); | ||||||
|  |  | ||||||
|  |     options.Connect(new Uri(endpoint), new DefaultAzureCredential()) | ||||||
|  |     .Select(KeyFilter.Any, "blueprint_api"); | ||||||
|  |  | ||||||
|  |     options.ConfigureKeyVault(keyVaultOptions => | ||||||
|  |     { | ||||||
|  |         keyVaultOptions.SetCredential(new DefaultAzureCredential()); | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | builder.Services.AddEndpointsApiExplorer(); | ||||||
|  | builder.Configuration | ||||||
|  |     .AddUserSecrets(Assembly.GetExecutingAssembly()) | ||||||
|  |     .AddEnvironmentVariables(); | ||||||
|  |  | ||||||
|  | builder.Services.AddResponseCompression(); | ||||||
|  | builder.Services.AddProblemDetails(); | ||||||
|  | builder.Services.AddLogs(builder); | ||||||
|  | builder.Services.AddMemoryCache(); | ||||||
|  | builder.Services.AddResponseCaching(configureOptions => { configureOptions.UseCaseSensitivePaths = true; }); | ||||||
|  | builder.Logging.AddOpenTelemetry(options => | ||||||
|  | { | ||||||
|  |     options.IncludeScopes = true; | ||||||
|  |     options.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("core.blueprint.bff.api")).AddConsoleExporter(); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | builder.Host.ConfigureServices((context, services) => | ||||||
|  | { | ||||||
|  |     builder.Services.AddHsts(options => | ||||||
|  |     { | ||||||
|  |         options.Preload = true; | ||||||
|  |         options.IncludeSubDomains = true; | ||||||
|  |         options.MaxAge = TimeSpan.FromDays(60); | ||||||
|  |     }); | ||||||
|  |     builder.Services.AddResponseCaching(configureOptions => | ||||||
|  |     { | ||||||
|  |         configureOptions.UseCaseSensitivePaths = true; | ||||||
|  |         configureOptions.MaximumBodySize = 2048; | ||||||
|  |     }); | ||||||
|  |     builder.Services.AddHttpsRedirection(options => | ||||||
|  |     { | ||||||
|  |         options.RedirectStatusCode = 308; | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     services.AddHttpLogging(http => | ||||||
|  |     { | ||||||
|  |         http.CombineLogs = true; | ||||||
|  |     }); | ||||||
|  |     services.AddAntiforgery(); | ||||||
|  |  | ||||||
|  |     services.AddCors(options => | ||||||
|  |     { | ||||||
|  |         options.AddPolicy("AllowAll", policyBuilder => | ||||||
|  |             policyBuilder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); | ||||||
|  |     }); | ||||||
|  |     services.AddMvc().AddJsonOptions(options => | ||||||
|  |     { | ||||||
|  |         options.JsonSerializerOptions.WriteIndented = true; | ||||||
|  |         options.JsonSerializerOptions.MaxDepth = 20; | ||||||
|  |         options.JsonSerializerOptions.NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowNamedFloatingPointLiterals; | ||||||
|  |     }); | ||||||
|  |     services.Configure<BrotliCompressionProviderOptions>(options => | ||||||
|  |     { | ||||||
|  |         options.Level = CompressionLevel.SmallestSize; | ||||||
|  |     }); | ||||||
|  |     services.Configure<GzipCompressionProviderOptions>(options => | ||||||
|  |     { | ||||||
|  |         options.Level = CompressionLevel.SmallestSize; | ||||||
|  |     }); | ||||||
|  |     services.AddResponseCompression(options => | ||||||
|  |     { | ||||||
|  |         options.EnableForHttps = true; | ||||||
|  |         options.Providers.Add<BrotliCompressionProvider>(); | ||||||
|  |         options.Providers.Add<GzipCompressionProvider>(); | ||||||
|  |     }); | ||||||
|  |     services.AddResponseCaching(); | ||||||
|  |     services.AddControllers(); | ||||||
|  |     services.AddEndpointsApiExplorer(); | ||||||
|  |     services.AddSwaggerGen(); | ||||||
|  |     services.AddLogging(); | ||||||
|  |     services.AddProblemDetails(); | ||||||
|  |     services.AddHttpContextAccessor(); | ||||||
|  |     services.AddTransient<TrackingMechanismExtension>(); // Register the TrackingIdHandler | ||||||
|  |     services.RegisterExternalLayer(builder.Configuration); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | builder.Services.AddCors(options => | ||||||
|  | { | ||||||
|  |     options.AddDefaultPolicy( | ||||||
|  |         builder => | ||||||
|  |         { | ||||||
|  |             builder.AllowAnyOrigin() | ||||||
|  |                                 .AllowAnyHeader() | ||||||
|  |                                 .AllowAnyMethod(); | ||||||
|  |         }); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | //*************************************************************************// | ||||||
|  | var app = builder.Build(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | app.UseCors(options => options.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()); | ||||||
|  | app.UseSwagger(); | ||||||
|  | app.UseSwaggerUI(); | ||||||
|  | app.UseResponseCompression(); | ||||||
|  | app.UseResponseCaching(); | ||||||
|  | app.UseHttpsRedirection(); | ||||||
|  |  | ||||||
|  | app.UseAuthentication(); | ||||||
|  | app.UseAuthorization(); | ||||||
|  | app.MapControllers(); | ||||||
|  | app.UseHsts(); | ||||||
|  | app.UseAntiforgery(); | ||||||
|  | app.UseLogging(builder.Configuration); | ||||||
|  |  | ||||||
|  | app.Run(); | ||||||
							
								
								
									
										52
									
								
								Core.Blueprint.API/Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								Core.Blueprint.API/Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | { | ||||||
|  |   "profiles": { | ||||||
|  |     "http": { | ||||||
|  |       "commandName": "Project", | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "launchUrl": "swagger", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_ENVIRONMENT": "Local" | ||||||
|  |       }, | ||||||
|  |       "dotnetRunMessages": true, | ||||||
|  |       "applicationUrl": "http://localhost:5239" | ||||||
|  |     }, | ||||||
|  |     "https": { | ||||||
|  |       "commandName": "Project", | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "launchUrl": "swagger", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_ENVIRONMENT": "Local" | ||||||
|  |       }, | ||||||
|  |       "dotnetRunMessages": true, | ||||||
|  |       "applicationUrl": "https://localhost:7056;http://localhost:5239" | ||||||
|  |     }, | ||||||
|  |     "IIS Express": { | ||||||
|  |       "commandName": "IISExpress", | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "launchUrl": "swagger", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_ENVIRONMENT": "Local" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "Container (Dockerfile)": { | ||||||
|  |       "commandName": "Docker", | ||||||
|  |       "launchBrowser": true, | ||||||
|  |       "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger", | ||||||
|  |       "environmentVariables": { | ||||||
|  |         "ASPNETCORE_HTTPS_PORTS": "8081", | ||||||
|  |         "ASPNETCORE_HTTP_PORTS": "8080" | ||||||
|  |       }, | ||||||
|  |       "publishAllPorts": true, | ||||||
|  |       "useSSL": true | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "$schema": "http://json.schemastore.org/launchsettings.json", | ||||||
|  |   "iisSettings": { | ||||||
|  |     "windowsAuthentication": false, | ||||||
|  |     "anonymousAuthentication": true, | ||||||
|  |     "iisExpress": { | ||||||
|  |       "applicationUrl": "http://localhost:54447", | ||||||
|  |       "sslPort": 44347 | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								Core.Blueprint.API/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Core.Blueprint.API/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | { | ||||||
|  |   "Logging": { | ||||||
|  |     "LogLevel": { | ||||||
|  |       "Default": "Information", | ||||||
|  |       "Microsoft.AspNetCore": "Warning" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								Core.Blueprint.API/appsettings.Local.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Core.Blueprint.API/appsettings.Local.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | { | ||||||
|  |   "Logging": { | ||||||
|  |     "LogLevel": { | ||||||
|  |       "Default": "Information", | ||||||
|  |       "Microsoft.AspNetCore": "Warning" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "LocalGateways": { | ||||||
|  |     "BlueprintService": "https://localhost:7243/api" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								Core.Blueprint.API/appsettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Core.Blueprint.API/appsettings.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | { | ||||||
|  |   "Logging": { | ||||||
|  |     "LogLevel": { | ||||||
|  |       "Default": "Information", | ||||||
|  |       "Microsoft.AspNetCore": "Warning" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "AllowedHosts": "*", | ||||||
|  |   "Endpoints": { | ||||||
|  |     "AppConfigurationURI": "https://sandbox-hci-usc-appcg.azconfig.io" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										39
									
								
								Core.Blueprint.BFF.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Core.Blueprint.BFF.sln
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  |  | ||||||
|  | Microsoft Visual Studio Solution File, Format Version 12.00 | ||||||
|  | # Visual Studio Version 17 | ||||||
|  | VisualStudioVersion = 17.8.34309.116 | ||||||
|  | MinimumVisualStudioVersion = 10.0.40219.1 | ||||||
|  | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Presentation", "Presentation", "{F3994F88-26E0-4123-8304-1FB0346E6A1F}" | ||||||
|  | EndProject | ||||||
|  | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.BFF.API", "Core.Blueprint.API\Core.Blueprint.BFF.API.csproj", "{DD6855D6-B19A-4125-BC53-3BD856BF7D0B}" | ||||||
|  | EndProject | ||||||
|  | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Application", "Application", "{9DBA13A6-339F-4FD6-B53D-43F2D015C840}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Blueprint.External", "Core.Blueprint.External\Core.Blueprint.External.csproj", "{F18C641D-3064-4DCA-B843-CFE4D5F361F9}" | ||||||
|  | EndProject | ||||||
|  | Global | ||||||
|  | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
|  | 		Debug|Any CPU = Debug|Any CPU | ||||||
|  | 		Release|Any CPU = Release|Any CPU | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
|  | 		{DD6855D6-B19A-4125-BC53-3BD856BF7D0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{DD6855D6-B19A-4125-BC53-3BD856BF7D0B}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{DD6855D6-B19A-4125-BC53-3BD856BF7D0B}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{DD6855D6-B19A-4125-BC53-3BD856BF7D0B}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 		{F18C641D-3064-4DCA-B843-CFE4D5F361F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{F18C641D-3064-4DCA-B843-CFE4D5F361F9}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{F18C641D-3064-4DCA-B843-CFE4D5F361F9}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{F18C641D-3064-4DCA-B843-CFE4D5F361F9}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(SolutionProperties) = preSolution | ||||||
|  | 		HideSolutionNode = FALSE | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(NestedProjects) = preSolution | ||||||
|  | 		{DD6855D6-B19A-4125-BC53-3BD856BF7D0B} = {F3994F88-26E0-4123-8304-1FB0346E6A1F} | ||||||
|  | 		{F18C641D-3064-4DCA-B843-CFE4D5F361F9} = {9DBA13A6-339F-4FD6-B53D-43F2D015C840} | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||||
|  | 		SolutionGuid = {771B556E-9EA3-46CD-BC3F-5DCF1098A8B7} | ||||||
|  | 	EndGlobalSection | ||||||
|  | EndGlobal | ||||||
| @@ -0,0 +1,65 @@ | |||||||
|  | using Core.Blueprint.External.Clients.Blueprint; | ||||||
|  | using Core.Blueprint.External.GatewayConfigurations; | ||||||
|  | using Lib.Architecture.BuildingBlocks.Helpers.Token; | ||||||
|  | using Microsoft.AspNetCore.Http; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  | using Microsoft.Extensions.DependencyInjection; | ||||||
|  | using Refit; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.External.ClientConfiguration | ||||||
|  | { | ||||||
|  |     public static class RegisterClientConfiguration | ||||||
|  |     { | ||||||
|  |         public static IServiceCollection RegisterExternalLayer(this IServiceCollection services, IConfiguration configuration) | ||||||
|  |         { | ||||||
|  |             var gatewayConfiguration = new GatewayConfiguration(); | ||||||
|  |             var gatewaySettingsConfiguration = new GatewaySettingsConfigurations(configuration); | ||||||
|  |  | ||||||
|  |             // Register GatewayConfiguration as a singleton | ||||||
|  |             services.AddSingleton(gatewayConfiguration); | ||||||
|  |  | ||||||
|  |             // Register IHttpContextAccessor | ||||||
|  |             services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); | ||||||
|  |  | ||||||
|  |             // Register ITokenProvider | ||||||
|  |             services.AddSingleton<ITokenProvider, HttpContextTokenProvider>(); | ||||||
|  |  | ||||||
|  |             // Register the custom AuthenticatedHttpClientHandler | ||||||
|  |             services.AddTransient(provider => | ||||||
|  |             { | ||||||
|  |                 var tokenProvider = provider.GetRequiredService<ITokenProvider>(); | ||||||
|  |                 var trackingIdHandler = new TrackingMechanismExtension(provider.GetRequiredService<IHttpContextAccessor>()); | ||||||
|  |  | ||||||
|  |                 var handler = new AuthenticatedHttpClientHandler(tokenProvider) | ||||||
|  |                 { | ||||||
|  |                     InnerHandler = new HttpClientHandler() // Setting the InnerHandler manually | ||||||
|  |                 }; | ||||||
|  |  | ||||||
|  |                 // Attach the TrackingIdHandler as the outermost handler | ||||||
|  |                 trackingIdHandler.InnerHandler = handler; | ||||||
|  |  | ||||||
|  |                 return handler; | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |             var blueprintServiceApiUrl = GatewaySettingsConfigurations.GetBlueprintServiceAPIEndpoint().Endpoint.Url; | ||||||
|  |  | ||||||
|  |             // Register IDashBoardServiceClient with the manually created HttpClient | ||||||
|  |             services.AddScoped(provider => | ||||||
|  |             { | ||||||
|  |                 var handler = provider.GetRequiredService<AuthenticatedHttpClientHandler>(); | ||||||
|  |                 var handlerTrackingId = new TrackingMechanismExtension(provider.GetRequiredService<IHttpContextAccessor>()); // Using the TrackingIdHandler here | ||||||
|  |                                                                                                                              // Chain the handlers | ||||||
|  |                 handlerTrackingId.InnerHandler = handler; //chaining | ||||||
|  |  | ||||||
|  |                 var httpClient = new HttpClient(handlerTrackingId) | ||||||
|  |                 { | ||||||
|  |                     BaseAddress = new Uri(blueprintServiceApiUrl), | ||||||
|  |                     Timeout = TimeSpan.FromMinutes(1) | ||||||
|  |                 }; | ||||||
|  |                 return RestService.For<IBlueprintServiceClient>(httpClient); | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |             return services; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,17 @@ | |||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Adapters | ||||||
|  | { | ||||||
|  |     public class BlueprintAdapter | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |         public string? Description { get; set; } | ||||||
|  |         public string _Id { get; set; } = null!; | ||||||
|  |         public string Id { get; init; } = null!; | ||||||
|  |         public DateTime CreatedAt { get; set; } | ||||||
|  |         public string? CreatedBy { get; set; } | ||||||
|  |         public DateTime? UpdatedAt { get; set; } | ||||||
|  |         public string? UpdatedBy { get; set; } | ||||||
|  |         public StatusEnum Status { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,10 @@ | |||||||
|  | using Core.Blueprint.KeyVault; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Adapters | ||||||
|  | { | ||||||
|  |     public class KeyVaultAdapter | ||||||
|  |     { | ||||||
|  |         public KeyVaultResponse Item1 { get; set; } | ||||||
|  |         public string Item2 { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,18 @@ | |||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Adapters | ||||||
|  | { | ||||||
|  |     public class UserProjectAdapter | ||||||
|  |     { | ||||||
|  |         public string ProjectCode { get; set; } = null!; | ||||||
|  |         public string ProjectDescription { get; set; } = null!; | ||||||
|  |         public string UserId { get; set; } = null!; | ||||||
|  |         public int Id { get; set; } | ||||||
|  |         public string Guid { get; set; } = null!; | ||||||
|  |         public DateTime CreatedAt { get; set; } | ||||||
|  |         public string? CreatedBy { get; set; } | ||||||
|  |         public DateTime? UpdatedAt { get; set; } | ||||||
|  |         public string? UpdatedBy { get; set; } | ||||||
|  |         public StatusEnum Status { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,70 @@ | |||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Adapters; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests.BlobStorage; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests.KeyVault; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests.Mongo; | ||||||
|  | using Core.Blueprint.External.Clients.Blueprint.Requests.SQL; | ||||||
|  | using Core.Blueprint.KeyVault; | ||||||
|  | using Core.Blueprint.Storage; | ||||||
|  | using Core.Blueprint.Storage.Adapters; | ||||||
|  | using Microsoft.AspNetCore.Mvc; | ||||||
|  | using Refit; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint | ||||||
|  | { | ||||||
|  |     public interface IBlueprintServiceClient | ||||||
|  |     { | ||||||
|  |         [Post("/v1/MongoBlueprint/Create")] | ||||||
|  |         Task<ApiResponse<BlueprintAdapter>> CreateBlueprintService([Body] CreateBlueprintRequest newBlueprint, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/MongoBlueprint/GetAll")] | ||||||
|  |         Task<ApiResponse<IEnumerable<BlueprintAdapter>>> GetAllBlueprintsService(CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/MongoBlueprint/GetById")] | ||||||
|  |         Task<ApiResponse<BlueprintAdapter>> GetBlueprintByIdService([Body] GetBlueprintRequest request, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Put("/v1/MongoBlueprint/Update")] | ||||||
|  |         Task<ApiResponse<BlueprintAdapter>> UpdateBlueprintService([Body] UpdateBlueprintRequest entity, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Delete("/v1/MongoBlueprint/Delete")] | ||||||
|  |         Task<ApiResponse<BlueprintAdapter>> DeleteBlueprintService([Body] DeleteBlueprintRequest request, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/SQLUserProject/Create")] | ||||||
|  |         Task<ApiResponse<UserProjectAdapter>> CreateUserProjectService([Body] CreateUserProjectRequest newUserProject, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/SQLUserProject/GetAll")] | ||||||
|  |         Task<ApiResponse<IEnumerable<UserProjectAdapter>>> GetAllUserProjectsService(CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/SQLUserProject/GetById")] | ||||||
|  |         Task<ApiResponse<UserProjectAdapter>> GetUserProjectByIdService([Body] GetUserProjectRequest request, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Put("/v1/SQLUserProject/Update")] | ||||||
|  |         Task<ApiResponse<UserProjectAdapter>> UpdateUserProjectService([Body] UpdateUserProjectRequest entity, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Delete("/v1/SQLUserProject/Delete")] | ||||||
|  |         Task<ApiResponse<UserProjectAdapter>> DeleteUserProjectService([Body] DeleteUserProjectRequest request, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/KeyVault/CreateSecret")] | ||||||
|  |         Task<ApiResponse<KeyVaultResponse>> CreateSecretService([Body] CreateSecretRequest newKeyVault, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/KeyVault/GetSecretByName")] | ||||||
|  |         Task<ApiResponse<KeyVaultAdapter>> GetSecretByNameService([Body] GetSecretRequest request, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Put("/v1/KeyVault/UpdateSecret")] | ||||||
|  |         Task<ApiResponse<KeyVaultAdapter>> UpdateSecretService([Body] UpdateSecretRequest entity, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Delete("/v1/KeyVault/DeleteSecret")] | ||||||
|  |         Task<ApiResponse<KeyVaultAdapter>> DeleteSecretService([Body] DeleteSecretRequest request, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/BlobStorage/UploadBlob")] | ||||||
|  |         Task<ApiResponse<BlobFileAdapter>> UploadBlobService([Body] UploadBlobRequest request, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Get("/v1/BlobStorage/GetBlobList")] | ||||||
|  |         Task<ApiResponse<List<BlobFileAdapter>>> GetBlobListAsync([FromQuery] string? prefix, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Post("/v1/BlobStorage/DownloadBlob")] | ||||||
|  |         Task<ApiResponse<BlobDownloadUriAdapter>> DownloadBlobAsync([Body] DownloadBlobRequest request, CancellationToken cancellationToken = default); | ||||||
|  |  | ||||||
|  |         [Delete("/v1/BlobStorage/DeleteBlob")] | ||||||
|  |         Task<ApiResponse<BlobFileAdapter>> DeleteBlobService([Body] DeleteBlobRequest request, CancellationToken cancellationToken = default); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,7 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.BlobStorage | ||||||
|  | { | ||||||
|  |     public class DeleteBlobRequest | ||||||
|  |     { | ||||||
|  |         public string BlobName { get; set; } = null!; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,7 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.BlobStorage | ||||||
|  | { | ||||||
|  |     public class DownloadBlobRequest | ||||||
|  |     { | ||||||
|  |         public string BlobName { get; set; } = null!; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,7 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.BlobStorage | ||||||
|  | { | ||||||
|  |     public class GetBlobListRequest | ||||||
|  |     { | ||||||
|  |         public string? Prefix { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.BlobStorage | ||||||
|  | { | ||||||
|  |     public class UploadBlobRequest | ||||||
|  |     { | ||||||
|  |         public string BlobName { get; set; } = null!; | ||||||
|  |  | ||||||
|  |         public byte[] BlobContent { get; set; } = null!; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.KeyVault | ||||||
|  | { | ||||||
|  |     public class CreateSecretRequest | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |  | ||||||
|  |         public string Value { get; set; } = null!; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.KeyVault; | ||||||
|  |  | ||||||
|  | public class DeleteSecretRequest | ||||||
|  | { | ||||||
|  |     public string Name { get; set; } | ||||||
|  | } | ||||||
| @@ -0,0 +1,7 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.KeyVault | ||||||
|  | { | ||||||
|  |     public class GetSecretRequest | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.KeyVault | ||||||
|  | { | ||||||
|  |     public class UpdateSecretRequest | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |         public string Value { get; set; } = null!; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.Mongo | ||||||
|  | { | ||||||
|  |     public class CreateBlueprintRequest | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |  | ||||||
|  |         public string? Description { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,7 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.Mongo | ||||||
|  | { | ||||||
|  |     public class DeleteBlueprintRequest | ||||||
|  |     { | ||||||
|  |         public string _Id { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.Mongo | ||||||
|  | { | ||||||
|  |     public class GetAllBlueprintsRequest | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,7 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.Mongo | ||||||
|  | { | ||||||
|  |     public class GetBlueprintRequest | ||||||
|  |     { | ||||||
|  |         public string _Id { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.Mongo | ||||||
|  | { | ||||||
|  |     public class UpdateBlueprintRequest | ||||||
|  |     { | ||||||
|  |         public string Name { get; set; } = null!; | ||||||
|  |         public string? Description { get; set; } | ||||||
|  |         public string _Id { get; set; } = null!; | ||||||
|  |         public string Id { get; init; } = null!; | ||||||
|  |         public DateTime CreatedAt { get; set; } | ||||||
|  |         public string? CreatedBy { get; set; } | ||||||
|  |         public DateTime? UpdatedAt { get; set; } | ||||||
|  |         public string? UpdatedBy { get; set; } | ||||||
|  |         public StatusEnum Status { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,9 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.SQL | ||||||
|  | { | ||||||
|  |     public class CreateUserProjectRequest | ||||||
|  |     { | ||||||
|  |         public string ProjectCode { get; set; } = null!; | ||||||
|  |         public string ProjectDescription { get; set; } = null!; | ||||||
|  |         public string UserId { get; set; } = null!; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,7 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.SQL | ||||||
|  | { | ||||||
|  |     public class DeleteUserProjectRequest | ||||||
|  |     { | ||||||
|  |         public int Id { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,6 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.SQL | ||||||
|  | { | ||||||
|  |     public class GetAllUserProjectsRequest | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,7 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.SQL | ||||||
|  | { | ||||||
|  |     public class GetUserProjectRequest | ||||||
|  |     { | ||||||
|  |         public int Id { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,16 @@ | |||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests.SQL | ||||||
|  | { | ||||||
|  |     public class UpdateUserProjectRequest | ||||||
|  |     { | ||||||
|  |         public string ProjectCode { get; set; } = null!; | ||||||
|  |         public string ProjectDescription { get; set; } = null!; | ||||||
|  |         public string UserId { get; set; } = null!; | ||||||
|  |         public int Id { get; set; } | ||||||
|  |         public string Guid { get; set; } = null!; | ||||||
|  |         public DateTime CreatedAt { get; set; } | ||||||
|  |         public string? CreatedBy { get; set; } | ||||||
|  |         public DateTime? UpdatedAt { get; set; } | ||||||
|  |         public string? UpdatedBy { get; set; } | ||||||
|  |         public StatusEnum Status { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | using System.Text.Json.Serialization; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.External.Clients.Blueprint.Requests | ||||||
|  | { | ||||||
|  |     [JsonConverter(typeof(JsonStringEnumConverter))] | ||||||
|  |     public enum StatusEnum | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         Active = 0, | ||||||
|  |  | ||||||
|  |         Inactive = 1, | ||||||
|  |  | ||||||
|  |         Deleted = 2 | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										20
									
								
								Core.Blueprint.External/Core.Blueprint.External.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Core.Blueprint.External/Core.Blueprint.External.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>net8.0</TargetFramework> | ||||||
|  |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|  |     <Nullable>enable</Nullable> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="Core.Blueprint.KeyVault" Version="0.3.0-alpha0037" /> | ||||||
|  |     <PackageReference Include="Core.Blueprint.Storage" Version="0.3.0-alpha0049" /> | ||||||
|  |     <PackageReference Include="Lib.Architecture.BuildingBlocks" Version="0.9.0-alpha0008" /> | ||||||
|  |     <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" /> | ||||||
|  |     <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" /> | ||||||
|  |     <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" /> | ||||||
|  |     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" /> | ||||||
|  |     <PackageReference Include="Refit" Version="8.0.0" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |  | ||||||
|  | </Project> | ||||||
| @@ -0,0 +1,17 @@ | |||||||
|  | namespace Core.Blueprint.External.GatewayConfigurations | ||||||
|  | { | ||||||
|  |     public record GatewayConfiguration | ||||||
|  |     { | ||||||
|  |         public GatewayConfiguration() | ||||||
|  |         { | ||||||
|  |             BlueprintService = new BlueprintServiceAPI(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public BlueprintServiceAPI BlueprintService { get; set; } | ||||||
|  |     } | ||||||
|  |     public record BlueprintServiceAPI | ||||||
|  |     { | ||||||
|  |         public string Channel { get; set; } | ||||||
|  |         public BaseEndpoint Endpoint { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,46 @@ | |||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.External.GatewayConfigurations | ||||||
|  | { | ||||||
|  |     public class GatewaySettingsConfigurations | ||||||
|  |     { | ||||||
|  |         private static GatewayConfiguration GatewayConfigurations { get; set; } = new GatewayConfiguration(); | ||||||
|  |         private readonly IConfiguration _configuration; | ||||||
|  |  | ||||||
|  |         public GatewaySettingsConfigurations(IConfiguration configuration) | ||||||
|  |         { | ||||||
|  |             _configuration = configuration; | ||||||
|  |             SetBlueprintServiceAPIEndpoint(); | ||||||
|  |         } | ||||||
|  |         public static BlueprintServiceAPI GetBlueprintServiceAPIEndpoint() | ||||||
|  |         { | ||||||
|  |             return GatewayConfigurations.BlueprintService; | ||||||
|  |         } | ||||||
|  |         private GatewayConfiguration SetBlueprintServiceAPIEndpoint() | ||||||
|  |         { | ||||||
|  |             IConfigurationSection source; | ||||||
|  |             var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; | ||||||
|  |  | ||||||
|  |             if (environment == "Local") | ||||||
|  |                 source = _configuration.GetSection("LocalGateways"); | ||||||
|  |             else | ||||||
|  |                 source = _configuration.GetSection("Gateways"); | ||||||
|  |  | ||||||
|  |             var endpoint = source["BlueprintService"] ?? string.Empty; | ||||||
|  |  | ||||||
|  |             GatewayConfigurations.BlueprintService = new BlueprintServiceAPI() | ||||||
|  |             { | ||||||
|  |                 Endpoint = new BaseEndpoint() | ||||||
|  |                 { | ||||||
|  |                     Uri = new Uri(endpoint), | ||||||
|  |                     Url = endpoint, | ||||||
|  |                     Token = string.Empty, | ||||||
|  |                     APIName = "Blueprint Service" | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  |  | ||||||
|  |             return GatewayConfigurations; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										18
									
								
								Core.Blueprint.External/TrackingMechanismExtension.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								Core.Blueprint.External/TrackingMechanismExtension.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | using Microsoft.AspNetCore.Http; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.External | ||||||
|  | { | ||||||
|  |     public sealed class TrackingMechanismExtension(IHttpContextAccessor httpContextAccessor) : DelegatingHandler | ||||||
|  |     { | ||||||
|  |         private readonly IHttpContextAccessor _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor)); | ||||||
|  |  | ||||||
|  |         protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             if (_httpContextAccessor.HttpContext != null) | ||||||
|  |             { | ||||||
|  |                 request.Headers.Add("TrackingId", Guid.NewGuid().ToString()); | ||||||
|  |             } | ||||||
|  |             return await base.SendAsync(request, cancellationToken).ConfigureAwait(false); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Sergio Matias Urquin
					Sergio Matias Urquin