From f91b935374aebabd1307e05380a9499e3c2c38ca Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Fri, 13 Oct 2023 18:28:15 -0400 Subject: [PATCH 01/30] Added Azure Pipeline to ACR --- ...28165655_InitialDocumentCreate.Designer.cs | 95 -------------- .../20230828165655_InitialDocumentCreate.cs | 60 --------- ...0830200432_DocumentTranslation.Designer.cs | 118 ------------------ .../20230830200432_DocumentTranslation.cs | 70 ----------- .../DocumentDbContextModelSnapshot.cs | 115 ----------------- DamageAssesmentApi/azure-pipelines.yml | 21 ++++ 6 files changed, 21 insertions(+), 458 deletions(-) delete mode 100644 DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230828165655_InitialDocumentCreate.Designer.cs delete mode 100644 DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230828165655_InitialDocumentCreate.cs delete mode 100644 DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230830200432_DocumentTranslation.Designer.cs delete mode 100644 DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230830200432_DocumentTranslation.cs delete mode 100644 DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/DocumentDbContextModelSnapshot.cs create mode 100644 DamageAssesmentApi/azure-pipelines.yml diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230828165655_InitialDocumentCreate.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230828165655_InitialDocumentCreate.Designer.cs deleted file mode 100644 index 8072057..0000000 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230828165655_InitialDocumentCreate.Designer.cs +++ /dev/null @@ -1,95 +0,0 @@ -// -using System; -using DamageAssesment.Api.DocuLinks.Db; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace DamageAssesment.Api.DocuLinks.Migrations -{ - [DbContext(typeof(DoculinkDbContext))] - [Migration("20230828165655_InitialDocumentCreate")] - partial class InitialDocumentCreate - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("DamageAssesment.Api.DocuLinks.Db.Document", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("dateCreated") - .HasColumnType("datetime2"); - - b.Property("dateUpdated") - .HasColumnType("datetime2"); - - b.Property("description") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("docName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("linkTypeId") - .HasColumnType("int"); - - b.Property("title") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("url") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Documents"); - }); - - modelBuilder.Entity("DamageAssesment.Api.DocuLinks.Db.LinkType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("TypeText") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("LinkTypes"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230828165655_InitialDocumentCreate.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230828165655_InitialDocumentCreate.cs deleted file mode 100644 index 741574e..0000000 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230828165655_InitialDocumentCreate.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace DamageAssesment.Api.DocuLinks.Migrations -{ - /// - public partial class InitialDocumentCreate : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Documents", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - title = table.Column(type: "nvarchar(max)", nullable: false), - linkTypeId = table.Column(type: "int", nullable: false), - description = table.Column(type: "nvarchar(max)", nullable: false), - docName = table.Column(type: "nvarchar(max)", nullable: false), - url = table.Column(type: "nvarchar(max)", nullable: false), - Path = table.Column(type: "nvarchar(max)", nullable: false), - IsActive = table.Column(type: "bit", nullable: false), - dateCreated = table.Column(type: "datetime2", nullable: false), - dateUpdated = table.Column(type: "datetime2", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Documents", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "LinkTypes", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - TypeText = table.Column(type: "nvarchar(max)", nullable: false), - IsActive = table.Column(type: "bit", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_LinkTypes", x => x.Id); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Documents"); - - migrationBuilder.DropTable( - name: "LinkTypes"); - } - } -} diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230830200432_DocumentTranslation.Designer.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230830200432_DocumentTranslation.Designer.cs deleted file mode 100644 index b9006ba..0000000 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230830200432_DocumentTranslation.Designer.cs +++ /dev/null @@ -1,118 +0,0 @@ -// -using System; -using DamageAssesment.Api.DocuLinks.Db; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace DamageAssesment.Api.DocuLinks.Migrations -{ - [DbContext(typeof(DoculinkDbContext))] - [Migration("20230830200432_DocumentTranslation")] - partial class DocumentTranslation - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("DamageAssesment.Api.DocuLinks.Db.Document", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("dateCreated") - .HasColumnType("datetime2"); - - b.Property("dateUpdated") - .HasColumnType("datetime2"); - - b.Property("docName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("linkTypeId") - .HasColumnType("int"); - - b.Property("url") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Documents"); - }); - - modelBuilder.Entity("DamageAssesment.Api.DocuLinks.Db.DocumentsTranslation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("DocumentId") - .HasColumnType("int"); - - b.Property("Language") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("description") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("title") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("DocumentsTranslations"); - }); - - modelBuilder.Entity("DamageAssesment.Api.DocuLinks.Db.LinkType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("IsAttachment") - .HasColumnType("bit"); - - b.Property("TypeText") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("LinkTypes"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230830200432_DocumentTranslation.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230830200432_DocumentTranslation.cs deleted file mode 100644 index d639539..0000000 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/20230830200432_DocumentTranslation.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace DamageAssesment.Api.DocuLinks.Migrations -{ - /// - public partial class DocumentTranslation : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "description", - table: "Documents"); - - migrationBuilder.DropColumn( - name: "title", - table: "Documents"); - - migrationBuilder.AddColumn( - name: "IsAttachment", - table: "LinkTypes", - type: "bit", - nullable: false, - defaultValue: false); - - migrationBuilder.CreateTable( - name: "DocumentsTranslations", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - DocumentId = table.Column(type: "int", nullable: false), - title = table.Column(type: "nvarchar(max)", nullable: false), - description = table.Column(type: "nvarchar(max)", nullable: false), - Language = table.Column(type: "nvarchar(max)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_DocumentsTranslations", x => x.Id); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "DocumentsTranslations"); - - migrationBuilder.DropColumn( - name: "IsAttachment", - table: "LinkTypes"); - - migrationBuilder.AddColumn( - name: "description", - table: "Documents", - type: "nvarchar(max)", - nullable: false, - defaultValue: ""); - - migrationBuilder.AddColumn( - name: "title", - table: "Documents", - type: "nvarchar(max)", - nullable: false, - defaultValue: ""); - } - } -} diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/DocumentDbContextModelSnapshot.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/DocumentDbContextModelSnapshot.cs deleted file mode 100644 index a692f80..0000000 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Migrations/DocumentDbContextModelSnapshot.cs +++ /dev/null @@ -1,115 +0,0 @@ -// -using System; -using DamageAssesment.Api.DocuLinks.Db; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace DamageAssesment.Api.DocuLinks.Migrations -{ - [DbContext(typeof(DoculinkDbContext))] - partial class DocumentDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.9") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("DamageAssesment.Api.DocuLinks.Db.Document", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("Path") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("dateCreated") - .HasColumnType("datetime2"); - - b.Property("dateUpdated") - .HasColumnType("datetime2"); - - b.Property("docName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("linkTypeId") - .HasColumnType("int"); - - b.Property("url") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Documents"); - }); - - modelBuilder.Entity("DamageAssesment.Api.DocuLinks.Db.DocumentsTranslation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("DocumentId") - .HasColumnType("int"); - - b.Property("Language") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("description") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("title") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("DocumentsTranslations"); - }); - - modelBuilder.Entity("DamageAssesment.Api.DocuLinks.Db.LinkType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("IsAttachment") - .HasColumnType("bit"); - - b.Property("TypeText") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("LinkTypes"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml new file mode 100644 index 0000000..147dd91 --- /dev/null +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -0,0 +1,21 @@ +trigger: + - docker-branch # Change this to your preferred branch or trigger + +pr: + - '*' + +pool: + vmImage: 'ubuntu-latest' + +jobs: +- job: 'BuildAndPush' + steps: + - script: | + docker-compose -f docker-compose.yml build + docker login -u $(acrServiceConnectionUsername) -p $(acrServiceConnectionPassword) $(acrServiceConnectionServer) + docker-compose -f docker-compose.yml push + displayName: 'Build and Push Docker Compose Project' + env: + acrServiceConnectionUsername: $(ACRServiceConnectionName.username) + acrServiceConnectionPassword: $(ACRServiceConnectionName.password) + acrServiceConnectionServer: $(ACRServiceConnectionName.server) \ No newline at end of file From 45109881ad3a7909550a08f15a459c9c545baf2e Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Sat, 14 Oct 2023 04:12:30 +0000 Subject: [PATCH 02/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 147dd91..747ee0f 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -16,6 +16,6 @@ jobs: docker-compose -f docker-compose.yml push displayName: 'Build and Push Docker Compose Project' env: - acrServiceConnectionUsername: $(ACRServiceConnectionName.username) - acrServiceConnectionPassword: $(ACRServiceConnectionName.password) - acrServiceConnectionServer: $(ACRServiceConnectionName.server) \ No newline at end of file + acrServiceConnectionUsername: "dadeSchoolsContainerRegistry" + acrServiceConnectionPassword: "k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn" + acrServiceConnectionServer: "dadeschoolscontainerregistry.azurecr.io" From d3cf6a63e51d2c215065967afd75531a1e0c166d Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Sat, 14 Oct 2023 04:13:24 +0000 Subject: [PATCH 03/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 747ee0f..32a0e68 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -9,13 +9,13 @@ pool: jobs: - job: 'BuildAndPush' + env: + acrServiceConnectionUsername: "dadeSchoolsContainerRegistry" + acrServiceConnectionPassword: "k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn" + acrServiceConnectionServer: "dadeschoolscontainerregistry.azurecr.io" steps: - script: | docker-compose -f docker-compose.yml build docker login -u $(acrServiceConnectionUsername) -p $(acrServiceConnectionPassword) $(acrServiceConnectionServer) docker-compose -f docker-compose.yml push displayName: 'Build and Push Docker Compose Project' - env: - acrServiceConnectionUsername: "dadeSchoolsContainerRegistry" - acrServiceConnectionPassword: "k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn" - acrServiceConnectionServer: "dadeschoolscontainerregistry.azurecr.io" From 0dd6d3b1e36afcfc6e8452f9f14e39326ee0896b Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Sat, 14 Oct 2023 04:14:40 +0000 Subject: [PATCH 04/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 32a0e68..3f78ac3 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -9,13 +9,15 @@ pool: jobs: - job: 'BuildAndPush' - env: - acrServiceConnectionUsername: "dadeSchoolsContainerRegistry" - acrServiceConnectionPassword: "k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn" - acrServiceConnectionServer: "dadeschoolscontainerregistry.azurecr.io" + pool: + vmImage: 'ubuntu-latest' steps: - script: | docker-compose -f docker-compose.yml build docker login -u $(acrServiceConnectionUsername) -p $(acrServiceConnectionPassword) $(acrServiceConnectionServer) docker-compose -f docker-compose.yml push displayName: 'Build and Push Docker Compose Project' + env: + acrServiceConnectionUsername: "dadeSchoolsContainerRegistry" + acrServiceConnectionPassword: "k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn" + acrServiceConnectionServer: "dadeschoolscontainerregistry.azurecr.io" From 7985428f8b70037edecd4c85818936086b00d83d Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Sat, 14 Oct 2023 04:16:24 +0000 Subject: [PATCH 05/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 3f78ac3..33fad0a 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -1,5 +1,7 @@ trigger: - - docker-branch # Change this to your preferred branch or trigger + branches: + include: + - docker-branch # Change this to your preferred branch or trigger pr: - '*' From 3ac36bf86fc09475c4b74ee40a43bb0b77ab0931 Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Sun, 15 Oct 2023 16:48:47 +0000 Subject: [PATCH 06/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 33fad0a..aba5677 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -16,10 +16,7 @@ jobs: steps: - script: | docker-compose -f docker-compose.yml build - docker login -u $(acrServiceConnectionUsername) -p $(acrServiceConnectionPassword) $(acrServiceConnectionServer) + docker login -u $("dadeSchoolsContainerRegistry") -p $("k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn") $("dadeschoolscontainerregistry.azurecr.io") docker-compose -f docker-compose.yml push displayName: 'Build and Push Docker Compose Project' - env: - acrServiceConnectionUsername: "dadeSchoolsContainerRegistry" - acrServiceConnectionPassword: "k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn" - acrServiceConnectionServer: "dadeschoolscontainerregistry.azurecr.io" + \ No newline at end of file From 55e27059e5d018760c90293465fb404211fbf99b Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Mon, 16 Oct 2023 03:31:15 +0000 Subject: [PATCH 07/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index aba5677..996f9db 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -1,8 +1,3 @@ -trigger: - branches: - include: - - docker-branch # Change this to your preferred branch or trigger - pr: - '*' @@ -14,9 +9,14 @@ jobs: pool: vmImage: 'ubuntu-latest' steps: + - checkout: self - script: | docker-compose -f docker-compose.yml build - docker login -u $("dadeSchoolsContainerRegistry") -p $("k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn") $("dadeschoolscontainerregistry.azurecr.io") + docker login -u "$(dadeSchoolsContainerRegistry)" -p "$(k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn)" "dadeschoolscontainerregistry.azurecr.io" docker-compose -f docker-compose.yml push displayName: 'Build and Push Docker Compose Project' - \ No newline at end of file + +trigger: + branches: + include: + - docker-branch From 7935302b2d31c112af057590519e23086803e403 Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Mon, 16 Oct 2023 03:40:48 +0000 Subject: [PATCH 08/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 996f9db..4ee7e7b 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -1,3 +1,5 @@ +name: Build & Push to ACR Pipeline # Replace "Build and Push to ACR" with the desired name + pr: - '*' @@ -11,9 +13,9 @@ jobs: steps: - checkout: self - script: | - docker-compose -f docker-compose.yml build + docker-compose -f compose-files/docker-compose.sql.yml build docker login -u "$(dadeSchoolsContainerRegistry)" -p "$(k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn)" "dadeschoolscontainerregistry.azurecr.io" - docker-compose -f docker-compose.yml push + docker-compose -f compose-files/docker-compose.sql.yml push displayName: 'Build and Push Docker Compose Project' trigger: From dadbcf98b9473eaf63fce9075ff9372c78ca38e2 Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Mon, 16 Oct 2023 03:44:19 +0000 Subject: [PATCH 09/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 4ee7e7b..f6df08d 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -1,4 +1,4 @@ -name: Build & Push to ACR Pipeline # Replace "Build and Push to ACR" with the desired name +name: Build & Push to ACR Pipeline pr: - '*' @@ -13,9 +13,9 @@ jobs: steps: - checkout: self - script: | - docker-compose -f compose-files/docker-compose.sql.yml build + docker-compose build docker login -u "$(dadeSchoolsContainerRegistry)" -p "$(k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn)" "dadeschoolscontainerregistry.azurecr.io" - docker-compose -f compose-files/docker-compose.sql.yml push + docker-compose push displayName: 'Build and Push Docker Compose Project' trigger: From 08f873e8e35ec75836074309de23f7748cab8f70 Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Mon, 16 Oct 2023 03:47:09 +0000 Subject: [PATCH 10/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index f6df08d..e473b30 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -13,9 +13,9 @@ jobs: steps: - checkout: self - script: | - docker-compose build + docker-compose -f **/docker-compose.yml build docker login -u "$(dadeSchoolsContainerRegistry)" -p "$(k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn)" "dadeschoolscontainerregistry.azurecr.io" - docker-compose push + docker-compose -f **/docker-compose.yml push displayName: 'Build and Push Docker Compose Project' trigger: From c89c6f60c36d72f1853c0d418195ae78ef2f312a Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Mon, 16 Oct 2023 11:21:54 +0000 Subject: [PATCH 11/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index e473b30..7cc8ea8 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -13,8 +13,9 @@ jobs: steps: - checkout: self - script: | + export DOCKER_CLI_CONTEXT=default docker-compose -f **/docker-compose.yml build - docker login -u "$(dadeSchoolsContainerRegistry)" -p "$(k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn)" "dadeschoolscontainerregistry.azurecr.io" + docker login -u dadeSchoolsContainerRegistry -p k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn dadeschoolscontainerregistry.azurecr.io docker-compose -f **/docker-compose.yml push displayName: 'Build and Push Docker Compose Project' From 8a803ad1577b74bd4683aae3f3051a49cc40ef6c Mon Sep 17 00:00:00 2001 From: uppuv Date: Mon, 16 Oct 2023 14:02:28 -0400 Subject: [PATCH 12/30] added logic to get active surveys from survey responses --- .../Controllers/SurveyResponsesController.cs | 22 ++++++++++++--- .../Interfaces/ISurveysResponse.cs | 4 +-- .../Providers/SurveyResponsesProvider.cs | 28 +++++++++---------- .../Providers/SurveysProvider.cs | 5 ++-- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs index d5f6192..36f40a5 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs @@ -198,11 +198,12 @@ namespace DamageAssesment.Api.Responses.Controllers else return BadRequest(result.ErrorMessage); } - + [Route("responses/surveys/active")] + [Route("responses/surveys/active/{language:alpha}")] [Route("responses/surveys/active/{employeeid:int}")] [Route("responses/surveys/active/{employeeid:int}/{language:alpha}")] [HttpGet] - public async Task GetActiveSurveysAsync(int employeeid, string? language) + public async Task GetActiveSurveysAsync(int? employeeid, string? language) { var result = await this.surveyResponseProvider.GetActiveSurveysAsync(employeeid, language); if (result.IsSuccess) @@ -211,11 +212,24 @@ namespace DamageAssesment.Api.Responses.Controllers } return NoContent(); } - + //[Route("responses/surveys/active")] + //[Route("responses/surveys/active/{language:alpha}")] + //[HttpGet] + //public async Task GetActiveSurveysAsync( string? language) + //{ + // var result = await this.surveyResponseProvider.GetActiveSurveysAsync(null, language); + // if (result.IsSuccess) + // { + // return Ok(result.Surveys); + // } + // return NoContent(); + //} + [Route("responses/surveys/historic")] + [Route("responses/surveys/historic/{language:alpha}")] [Route("responses/surveys/historic/{employeeid:int}")] [Route("responses/surveys/historic/{employeeid:int}/{language:alpha}")] [HttpGet] - public async Task GetHistoricSurveysAsync(int employeeid, string? language) + public async Task GetHistoricSurveysAsync(int? employeeid, string? language) { var result = await this.surveyResponseProvider.GetHistoricSurveysAsync(employeeid, language); if (result.IsSuccess) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs index dea50eb..19893c8 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs @@ -9,8 +9,8 @@ namespace DamageAssesment.Api.Responses.Interfaces Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse); // Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId); Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(int employeeid); - Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int employeeid, string language); - Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int employeeid, string language); + Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language); + Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int? employeeid, string language); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> DeleteSurveyResponseAsync(int Id); Task<(bool IsSuccess, dynamic SurveyResponse, string ErrorMessage)> GetSurveyResponseByIdAsync(int responseId); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs index 5278c5c..af11925 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs @@ -112,24 +112,18 @@ namespace DamageAssesment.Api.Responses.Providers } } - public async Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int employeeid, string language) + public async Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language) { try { logger?.LogInformation("Querying to get SurveyResponse object from DB"); //get all the survey that already taken by the employee - var listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).Select(y => y.SurveyId).ToListAsync(); var surveys = await surveyServiceProvider.getSurveysAsync(language); - - if (surveys != null) - { - surveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now).ToList(); - } - - if (listOfsurveysId==null || listOfsurveysId.Count == 0) + surveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now).ToList(); + if (employeeid==null || employeeid==0) return (true, surveys, null); - - var activeSurveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now && !listOfsurveysId.Contains(s.Id)); + List listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid.Value).Select(y => y.SurveyId).ToListAsync(); + var activeSurveys = surveys.Where(s => !listOfsurveysId.Contains(s.Id)); return (true, activeSurveys, null); } catch (Exception ex) @@ -139,21 +133,25 @@ namespace DamageAssesment.Api.Responses.Providers } } - public async Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int employeeid, string language) + public async Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int? employeeid, string language) { try { logger?.LogInformation("Querying to get SurveyResponse object from DB"); - //get all the survey that already taken by the employee - var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); + var surveys = await surveyServiceProvider.getSurveysAsync(language); + // returning only historic data: end date is less than current date. + surveys = surveys.Where(s => s.EndDate < DateTime.Now).ToList(); + if(employeeid==null|| employeeid==0) + return (true, surveys, null); + var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); var historicSurveys = from s in surveys from r in surveyResponses where s.Id == r.SurveyId select s; - return (true, historicSurveys, null); + } catch (Exception ex) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs index 2d6cbc9..de945c6 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs @@ -18,7 +18,7 @@ namespace DamageAssesment.Api.Surveys.Providers this.surveyDbContext = surveysDbContext; this.logger = logger; this.mapper = mapper; - //seedData(); + // seedData(); } // Method to seed initial data into the database @@ -93,7 +93,8 @@ namespace DamageAssesment.Api.Surveys.Providers try { logger?.LogInformation("Get all Surveys from DB"); - var surveys = await surveyDbContext.Surveys.Where(s => s.IsEnabled == true).ToListAsync(); + //checking is enabled in survey response + var surveys = await surveyDbContext.Surveys.ToListAsync();//Where(s => s.IsEnabled == true) if (surveys != null) { From 8349e78f6ecbb15f7eaccfd83da708e8d4b92e40 Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Mon, 16 Oct 2023 23:30:50 +0000 Subject: [PATCH 13/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 64 ++++++++++++++++++++------ 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 7cc8ea8..2e367d4 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -1,25 +1,61 @@ name: Build & Push to ACR Pipeline +trigger: +- '*' + pr: - - '*' +- '*' pool: vmImage: 'ubuntu-latest' jobs: -- job: 'BuildAndPush' - pool: - vmImage: 'ubuntu-latest' +- job: BuildAndPushImages steps: - checkout: self - - script: | - export DOCKER_CLI_CONTEXT=default - docker-compose -f **/docker-compose.yml build - docker login -u dadeSchoolsContainerRegistry -p k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn dadeschoolscontainerregistry.azurecr.io - docker-compose -f **/docker-compose.yml push - displayName: 'Build and Push Docker Compose Project' -trigger: - branches: - include: - - docker-branch + - bash: | + #!/bin/bash + + # Specify the path to your docker-compose.yml + composeFile="$(find $(Build.SourcesDirectory) -name docker-compose.yml | head -1)" + + # Check if a docker-compose.yml file was found + if [ -z "$composeFile" ]; then + echo "No docker-compose.yml file found in the workspace." + exit 1 + fi + + # Log the path to the docker-compose.yml file + echo "Using docker-compose file at: $composeFile" + + # Log in to ACR (replace ACR_USERNAME and ACR_PASSWORD) + docker login dadeschoolscontainerregistry.azurecr.io -u ACR_USERNAME -p ACR_PASSWORD + + # List of services to build, tag, and push + services=( + "damageassesmentapianswers" + "damageassesmentapiattachments" + "damageassesmentapiemployees" + "damageassesmentapilocations" + "damageassesmentapiquestions" + "damageassesmentapisurveys" + "damageassesmentapidoculinks" + "damageassesmentapiresponses" + ) + + # Loop through the services and build, tag, and push + for service in "${services[@]}"; do + # Build the service + docker-compose -f "$composeFile" build "$service" + + # Tag the image for ACR + docker tag "$service" "dadeschoolscontainerregistry.azurecr.io/$service" + + # Push the image to ACR + docker push "dadeschoolscontainerregistry.azurecr.io/$service" + done + displayName: 'Build and Push Docker Images' + env: + ACR_USERNAME: $(acrUsername) # Set your ACR username secret here + ACR_PASSWORD: $(acrPassword) # Set your ACR password secret here From f3216418701b080965e42c87a3b3deef7eeb76b4 Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 11:36:35 -0400 Subject: [PATCH 14/30] folder for Common build support scripts --- Scripts/build_and_push_services2acr.ps1 | 30 ++++++++++++++++++++++++ Scripts/build_and_push_services2acr.sh | 31 +++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 Scripts/build_and_push_services2acr.ps1 create mode 100644 Scripts/build_and_push_services2acr.sh diff --git a/Scripts/build_and_push_services2acr.ps1 b/Scripts/build_and_push_services2acr.ps1 new file mode 100644 index 0000000..d61eb0e --- /dev/null +++ b/Scripts/build_and_push_services2acr.ps1 @@ -0,0 +1,30 @@ +# powershell -ExecutionPolicy Bypass -File .\build_and_push_services2acr.ps1 +# Specify the path to your docker-compose.yml +$composeFile = "C:\Users\santh\OneDrive\Desktop\DOCKERS\ubuntu\Sprint6\C1011\Backend-API-Services\DamageAssesmentApi\docker-compose.yml" + +# List of services to build, tag, and push +$services = @( + "damageassesmentapianswers", + "damageassesmentapiattachments", + "damageassesmentapiemployees", + "damageassesmentapilocations", + "damageassesmentapiquestions", + "damageassesmentapisurveys", + "damageassesmentapidoculinks", + "damageassesmentapiresponses" +) + +# Log in to ACR (replace ACR_USERNAME and ACR_PASSWORD) +docker login dadeschoolscontainerregistry.azurecr.io -u dadeSchoolsContainerRegistry -p k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn + +# Loop through the services and build, tag, and push +foreach ($service in $services) { + # Build the service + docker-compose -f $composeFile build $service + + # Tag the image for ACR + docker tag "$service" "dadeschoolscontainerregistry.azurecr.io/$service" + + # Push the image to ACR + docker push "dadeschoolscontainerregistry.azurecr.io/$service" +} diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh new file mode 100644 index 0000000..990902b --- /dev/null +++ b/Scripts/build_and_push_services2acr.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Specify the path to your docker-compose.yml +composeFile="C:/Users/santh/OneDrive/Desktop/DOCKERS/ubuntu/Sprint6/C1011/Backend-API-Services/DamageAssesmentApi/docker-compose.yml" + +# List of services to build, tag, and push +services=( + "damageassesmentapianswers" + "damageassesmentapiattachments" + "damageassesmentapiemployees" + "damageassesmentapilocations" + "damageassesmentapiquestions" + "damageassesmentapisurveys" + "damageassesmentapidoculinks" + "damageassesmentapiresponses" +) + +# Log in to ACR (replace ACR_USERNAME and ACR_PASSWORD) +docker login dadeschoolscontainerregistry.azurecr.io -u dadeSchoolsContainerRegistry -p k1f8hE0O5hj3tYCCR/5stNrkw5BZoTmAqid/hvaVo8+ACRDc2Arn + +# Loop through the services and build, tag, and push +for service in "${services[@]}"; do + # Build the service + docker-compose -f "$composeFile" build "$service" + + # Tag the image for ACR + docker tag "$service" "dadeschoolscontainerregistry.azurecr.io/$service" + + # Push the image to ACR + docker push "dadeschoolscontainerregistry.azurecr.io/$service" +done From 7b821decbd8f0d08fca100ab414f501a3544edb7 Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 12:09:42 -0400 Subject: [PATCH 15/30] Updated with folder path --- Scripts/build_and_push_services2acr.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh index 990902b..478a313 100644 --- a/Scripts/build_and_push_services2acr.sh +++ b/Scripts/build_and_push_services2acr.sh @@ -1,7 +1,13 @@ #!/bin/bash -# Specify the path to your docker-compose.yml -composeFile="C:/Users/santh/OneDrive/Desktop/DOCKERS/ubuntu/Sprint6/C1011/Backend-API-Services/DamageAssesmentApi/docker-compose.yml" +# Get the current working directory +current_directory="$(pwd)" + +# Specify the relative path to the docker-compose.yml +relative_path="Backend-API-Services/DamageAssesmentApi/docker-compose.yml" + +# Combine the current directory with the relative path to get the full path to docker-compose.yml +composeFile="$current_directory/$relative_path" # List of services to build, tag, and push services=( From 1f046e0c70ff8c5adf2ee2c580da166aaf237ba7 Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Tue, 17 Oct 2023 16:37:23 +0000 Subject: [PATCH 16/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 57 ++++---------------------- 1 file changed, 7 insertions(+), 50 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 2e367d4..9bd1ee7 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -1,61 +1,18 @@ -name: Build & Push to ACR Pipeline - trigger: -- '*' + - '*' pr: -- '*' + - '*' pool: vmImage: 'ubuntu-latest' -jobs: -- job: BuildAndPushImages - steps: +steps: - checkout: self - - bash: | + - script: | #!/bin/bash - # Specify the path to your docker-compose.yml - composeFile="$(find $(Build.SourcesDirectory) -name docker-compose.yml | head -1)" - - # Check if a docker-compose.yml file was found - if [ -z "$composeFile" ]; then - echo "No docker-compose.yml file found in the workspace." - exit 1 - fi - - # Log the path to the docker-compose.yml file - echo "Using docker-compose file at: $composeFile" - - # Log in to ACR (replace ACR_USERNAME and ACR_PASSWORD) - docker login dadeschoolscontainerregistry.azurecr.io -u ACR_USERNAME -p ACR_PASSWORD - - # List of services to build, tag, and push - services=( - "damageassesmentapianswers" - "damageassesmentapiattachments" - "damageassesmentapiemployees" - "damageassesmentapilocations" - "damageassesmentapiquestions" - "damageassesmentapisurveys" - "damageassesmentapidoculinks" - "damageassesmentapiresponses" - ) - - # Loop through the services and build, tag, and push - for service in "${services[@]}"; do - # Build the service - docker-compose -f "$composeFile" build "$service" - - # Tag the image for ACR - docker tag "$service" "dadeschoolscontainerregistry.azurecr.io/$service" - - # Push the image to ACR - docker push "dadeschoolscontainerregistry.azurecr.io/$service" - done - displayName: 'Build and Push Docker Images' - env: - ACR_USERNAME: $(acrUsername) # Set your ACR username secret here - ACR_PASSWORD: $(acrPassword) # Set your ACR password secret here + chmod +x ./Backend-API-Services/Script/build_and_push_services2acr.sh + ./Backend-API-Services/Script/build_and_push_services2acr.sh + displayName: 'Run build_and_push_services2acr.sh' From afb520463a0276715313d75ca80e76206681fb6a Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Tue, 17 Oct 2023 16:41:54 +0000 Subject: [PATCH 17/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 9bd1ee7..6778953 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -13,6 +13,6 @@ steps: - script: | #!/bin/bash - chmod +x ./Backend-API-Services/Script/build_and_push_services2acr.sh - ./Backend-API-Services/Script/build_and_push_services2acr.sh + chmod +x ./Script/build_and_push_services2acr.sh + ./Script/build_and_push_services2acr.sh displayName: 'Run build_and_push_services2acr.sh' From e8cbe7616643d2e41580a5e17c3e5c11d79a56a9 Mon Sep 17 00:00:00 2001 From: Santhosh Nair <913441@dadeschools.net> Date: Tue, 17 Oct 2023 16:44:04 +0000 Subject: [PATCH 18/30] Update azure-pipelines.yml for Azure Pipelines --- DamageAssesmentApi/azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DamageAssesmentApi/azure-pipelines.yml b/DamageAssesmentApi/azure-pipelines.yml index 6778953..bbaebd3 100644 --- a/DamageAssesmentApi/azure-pipelines.yml +++ b/DamageAssesmentApi/azure-pipelines.yml @@ -13,6 +13,6 @@ steps: - script: | #!/bin/bash - chmod +x ./Script/build_and_push_services2acr.sh - ./Script/build_and_push_services2acr.sh + chmod +x ./Scripts/build_and_push_services2acr.sh + ./Scripts/build_and_push_services2acr.sh displayName: 'Run build_and_push_services2acr.sh' From f7141493cad663d0b8a8b76502ac6b480160ea84 Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 12:51:51 -0400 Subject: [PATCH 19/30] Updated relative path --- Scripts/build_and_push_services2acr.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh index 478a313..10ee2c5 100644 --- a/Scripts/build_and_push_services2acr.sh +++ b/Scripts/build_and_push_services2acr.sh @@ -4,21 +4,21 @@ current_directory="$(pwd)" # Specify the relative path to the docker-compose.yml -relative_path="Backend-API-Services/DamageAssesmentApi/docker-compose.yml" +relative_path="Backend-API-Services/DamageAssesmentApi" # Combine the current directory with the relative path to get the full path to docker-compose.yml -composeFile="$current_directory/$relative_path" +composeFile="$current_directory/$relative_path/docker-compose.yml" # List of services to build, tag, and push services=( - "damageassesmentapianswers" - "damageassesmentapiattachments" - "damageassesmentapiemployees" - "damageassesmentapilocations" - "damageassesmentapiquestions" - "damageassesmentapisurveys" - "damageassesmentapidoculinks" - "damageassesmentapiresponses" + "damageassesment.api.answers" + "damageassesment.api.attachments" + "damageassesment.api.employees" + "damageassesment.api.locations" + "damageassesment.api.questions" + "damageassesment.api.responses" + "damageassesment.api.surveys" + "damageassesment.api.doculinks" ) # Log in to ACR (replace ACR_USERNAME and ACR_PASSWORD) From fa68071d64123f33feb305321852baa453f3787c Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 15:14:41 -0400 Subject: [PATCH 20/30] modified push acr script --- Scripts/build_and_push_services2acr.sh | 36 +++++++++++++++++++------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh index 10ee2c5..0f128ac 100644 --- a/Scripts/build_and_push_services2acr.sh +++ b/Scripts/build_and_push_services2acr.sh @@ -2,23 +2,31 @@ # Get the current working directory current_directory="$(pwd)" +echo "Current directory: $current_directory" + +# Navigate one folder up +cd .. + +# Get and display the new working directory +current_directory="$(pwd)" +echo "New directory: $current_directory" # Specify the relative path to the docker-compose.yml -relative_path="Backend-API-Services/DamageAssesmentApi" +relative_path="DamageAssesmentApi" # Combine the current directory with the relative path to get the full path to docker-compose.yml composeFile="$current_directory/$relative_path/docker-compose.yml" # List of services to build, tag, and push services=( - "damageassesment.api.answers" - "damageassesment.api.attachments" - "damageassesment.api.employees" - "damageassesment.api.locations" - "damageassesment.api.questions" - "damageassesment.api.responses" - "damageassesment.api.surveys" - "damageassesment.api.doculinks" + "damageassesmentapianswers" + "damageassesmentapiattachments" + "damageassesmentapiemployees" + "damageassesmentapilocations" + "damageassesmentapiquestions" + "damageassesmentapisurveys" + "damageassesmentapidoculinks" + "damageassesmentapiresponses" ) # Log in to ACR (replace ACR_USERNAME and ACR_PASSWORD) @@ -27,7 +35,7 @@ docker login dadeschoolscontainerregistry.azurecr.io -u dadeSchoolsContainerRegi # Loop through the services and build, tag, and push for service in "${services[@]}"; do # Build the service - docker-compose -f "$composeFile" build "$service" + docker-compose -f "$composeFile" build # "$service" # Tag the image for ACR docker tag "$service" "dadeschoolscontainerregistry.azurecr.io/$service" @@ -35,3 +43,11 @@ for service in "${services[@]}"; do # Push the image to ACR docker push "dadeschoolscontainerregistry.azurecr.io/$service" done + +# Get and display the current working directory +current_directory="$(pwd)" +echo "Current directory: $current_directory" + +# Wait for a keypress +echo "Press any key to continue..." +read -n 1 -s -r -p "" From 0cc5be64ee2b63065dc44c7e52f788367bc96792 Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 15:27:44 -0400 Subject: [PATCH 21/30] modified push acr script --- Scripts/build_and_push_services2acr.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh index 0f128ac..c650dc9 100644 --- a/Scripts/build_and_push_services2acr.sh +++ b/Scripts/build_and_push_services2acr.sh @@ -35,10 +35,10 @@ docker login dadeschoolscontainerregistry.azurecr.io -u dadeSchoolsContainerRegi # Loop through the services and build, tag, and push for service in "${services[@]}"; do # Build the service - docker-compose -f "$composeFile" build # "$service" + docker-compose -f "$composeFile" build "$service" # Tag the image for ACR - docker tag "$service" "dadeschoolscontainerregistry.azurecr.io/$service" + docker tag $service "dadeschoolscontainerregistry.azurecr.io/$service" # Push the image to ACR docker push "dadeschoolscontainerregistry.azurecr.io/$service" @@ -49,5 +49,5 @@ current_directory="$(pwd)" echo "Current directory: $current_directory" # Wait for a keypress -echo "Press any key to continue..." -read -n 1 -s -r -p "" +#echo "Press any key to continue..." +#read -n 1 -s -r -p "" From 39df8c017b58a9fd42592eb9392f4fa7bfc45c14 Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 22:07:15 -0400 Subject: [PATCH 22/30] modified push acr script --- Scripts/build_and_push_services2acr.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh index c650dc9..0483d57 100644 --- a/Scripts/build_and_push_services2acr.sh +++ b/Scripts/build_and_push_services2acr.sh @@ -15,7 +15,7 @@ echo "New directory: $current_directory" relative_path="DamageAssesmentApi" # Combine the current directory with the relative path to get the full path to docker-compose.yml -composeFile="$current_directory/$relative_path/docker-compose.yml" +composeFile="$current_directory/DamageAssesmentApi/docker-compose.yml" # List of services to build, tag, and push services=( @@ -35,7 +35,7 @@ docker login dadeschoolscontainerregistry.azurecr.io -u dadeSchoolsContainerRegi # Loop through the services and build, tag, and push for service in "${services[@]}"; do # Build the service - docker-compose -f "$composeFile" build "$service" + docker-compose -f "$composeFile" build #"$service" # Tag the image for ACR docker tag $service "dadeschoolscontainerregistry.azurecr.io/$service" From aae073d4566483c7ed860ef196d312934d609211 Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 22:10:31 -0400 Subject: [PATCH 23/30] modified push acr script --- Scripts/build_and_push_services2acr.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh index 0483d57..48412a4 100644 --- a/Scripts/build_and_push_services2acr.sh +++ b/Scripts/build_and_push_services2acr.sh @@ -15,7 +15,8 @@ echo "New directory: $current_directory" relative_path="DamageAssesmentApi" # Combine the current directory with the relative path to get the full path to docker-compose.yml -composeFile="$current_directory/DamageAssesmentApi/docker-compose.yml" +#composeFile="$current_directory/DamageAssesmentApi/docker-compose.yml" +composeFile="./DamageAssesmentApi/docker-compose.yml" # List of services to build, tag, and push services=( From 40ab868e82f3b5d19208d6ce9bba41fce4ee5b00 Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 22:18:56 -0400 Subject: [PATCH 24/30] Updated relative path --- Scripts/build_and_push_services2acr.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh index 48412a4..a4fd039 100644 --- a/Scripts/build_and_push_services2acr.sh +++ b/Scripts/build_and_push_services2acr.sh @@ -5,7 +5,7 @@ current_directory="$(pwd)" echo "Current directory: $current_directory" # Navigate one folder up -cd .. +#cd .. # Get and display the new working directory current_directory="$(pwd)" @@ -16,7 +16,7 @@ relative_path="DamageAssesmentApi" # Combine the current directory with the relative path to get the full path to docker-compose.yml #composeFile="$current_directory/DamageAssesmentApi/docker-compose.yml" -composeFile="./DamageAssesmentApi/docker-compose.yml" +composeFile="../DamageAssesmentApi/docker-compose.yml" # List of services to build, tag, and push services=( @@ -51,4 +51,4 @@ echo "Current directory: $current_directory" # Wait for a keypress #echo "Press any key to continue..." -#read -n 1 -s -r -p "" +read -n 1 -s -r -p "" From d219faa14709cca9c36d6d254cc89fd682f70b8d Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 22:40:34 -0400 Subject: [PATCH 25/30] Updated with folder path --- Scripts/build_and_push_services2acr.sh | 32 ++++++++------------------ 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh index a4fd039..dd0250b 100644 --- a/Scripts/build_and_push_services2acr.sh +++ b/Scripts/build_and_push_services2acr.sh @@ -1,22 +1,16 @@ #!/bin/bash -# Get the current working directory -current_directory="$(pwd)" -echo "Current directory: $current_directory" +# Determine the current directory (where the script is located) +script_directory="$( cd "$(dirname "$0")" ; pwd -P )" -# Navigate one folder up -#cd .. - -# Get and display the new working directory -current_directory="$(pwd)" -echo "New directory: $current_directory" +# Navigate to the root of the repository +repository_root="$script_directory/.." # Specify the relative path to the docker-compose.yml -relative_path="DamageAssesmentApi" +relative_path="DamageAssesmentApi/docker-compose.yml" -# Combine the current directory with the relative path to get the full path to docker-compose.yml -#composeFile="$current_directory/DamageAssesmentApi/docker-compose.yml" -composeFile="../DamageAssesmentApi/docker-compose.yml" +# Combine the repository root directory with the relative path to get the full path to docker-compose.yml +composeFile="$repository_root/$relative_path" # List of services to build, tag, and push services=( @@ -36,19 +30,11 @@ docker login dadeschoolscontainerregistry.azurecr.io -u dadeSchoolsContainerRegi # Loop through the services and build, tag, and push for service in "${services[@]}"; do # Build the service - docker-compose -f "$composeFile" build #"$service" + docker-compose -f "$composeFile" build #"$service" # Tag the image for ACR - docker tag $service "dadeschoolscontainerregistry.azurecr.io/$service" + docker tag "$service" "dadeschoolscontainerregistry.azurecr.io/$service" # Push the image to ACR docker push "dadeschoolscontainerregistry.azurecr.io/$service" done - -# Get and display the current working directory -current_directory="$(pwd)" -echo "Current directory: $current_directory" - -# Wait for a keypress -#echo "Press any key to continue..." -read -n 1 -s -r -p "" From f9b7fad33b96dd78a4a357d1193e40c255e909d0 Mon Sep 17 00:00:00 2001 From: Santhosh S <913341@dadeschools.net> Date: Tue, 17 Oct 2023 23:04:28 -0400 Subject: [PATCH 26/30] Updated with folder path --- Scripts/build_and_push_services2acr.sh | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Scripts/build_and_push_services2acr.sh b/Scripts/build_and_push_services2acr.sh index dd0250b..d562f19 100644 --- a/Scripts/build_and_push_services2acr.sh +++ b/Scripts/build_and_push_services2acr.sh @@ -3,14 +3,13 @@ # Determine the current directory (where the script is located) script_directory="$( cd "$(dirname "$0")" ; pwd -P )" -# Navigate to the root of the repository -repository_root="$script_directory/.." +# Use the 'find' command to locate the 'docker-compose.yml' file within the repository directory +composeFile=$(find "$script_directory/.." -name "docker-compose.yml" -type f | head -n 1) -# Specify the relative path to the docker-compose.yml -relative_path="DamageAssesmentApi/docker-compose.yml" - -# Combine the repository root directory with the relative path to get the full path to docker-compose.yml -composeFile="$repository_root/$relative_path" +if [ -z "$composeFile" ]; then + echo "docker-compose.yml not found." + exit 1 +fi # List of services to build, tag, and push services=( @@ -30,7 +29,7 @@ docker login dadeschoolscontainerregistry.azurecr.io -u dadeSchoolsContainerRegi # Loop through the services and build, tag, and push for service in "${services[@]}"; do # Build the service - docker-compose -f "$composeFile" build #"$service" + docker-compose -f "$composeFile" build "$service" # Tag the image for ACR docker tag "$service" "dadeschoolscontainerregistry.azurecr.io/$service" From 7b7e5c0ce80b1b1816b8850246fcf87f36a6fa5e Mon Sep 17 00:00:00 2001 From: uppuv Date: Mon, 23 Oct 2023 12:03:50 -0400 Subject: [PATCH 27/30] added status field in survey micro service --- .../Models/Survey.cs | 7 +++++++ .../Providers/SurveysProvider.cs | 21 +++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Models/Survey.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Models/Survey.cs index 25f5405..38fa72a 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Models/Survey.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Models/Survey.cs @@ -2,9 +2,16 @@ namespace DamageAssesment.Api.Surveys.Models { + public enum SurveyStatus + { + PENDING, + ACTIVE, + INACTIVE + } public class MultiLanSurvey : BaseSurvey { public object Titles { get; set; } + public string Status { get; set; } } public class Survey : BaseSurvey { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs index de945c6..e48efc1 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs @@ -26,9 +26,9 @@ namespace DamageAssesment.Api.Surveys.Providers { if (!surveyDbContext.Surveys.Any()) { - var survey1 = new Db.Survey { IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90), CreatedDate = DateTime.Now }; - var survey2 = new Db.Survey { IsEnabled = true, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90), CreatedDate = DateTime.Now }; - var survey3 = new Db.Survey { IsEnabled = false, StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(90), CreatedDate = DateTime.Now }; + var survey1 = new Db.Survey { IsEnabled = true, StartDate = DateTime.Now.AddDays(10), EndDate = DateTime.Now.AddDays(90), CreatedDate = DateTime.Now }; + var survey2 = new Db.Survey { IsEnabled = true, StartDate = DateTime.Now.AddDays(-10), EndDate = DateTime.Now.AddDays(90), CreatedDate = DateTime.Now.AddDays(-10) }; + var survey3 = new Db.Survey { IsEnabled = true, StartDate = DateTime.Now.AddDays(-100), EndDate = DateTime.Now.AddDays(-10), CreatedDate = DateTime.Now.AddDays(-100) }; surveyDbContext.Surveys.Add(survey1); surveyDbContext.Surveys.Add(survey2); @@ -85,7 +85,15 @@ namespace DamageAssesment.Api.Surveys.Providers MultiLanguage = dict; return MultiLanguage; } - + public string GetStatus(DateTime StartDate,DateTime EndDate) + { + if (StartDate > DateTime.Now) + return SurveyStatus.PENDING.ToString(); + else if (StartDate <= DateTime.Now && EndDate > DateTime.Now) + return SurveyStatus.ACTIVE.ToString(); + else + return SurveyStatus.INACTIVE.ToString(); + } // Method to get surveys asynchronously with multi-language support public async Task<(bool IsSuccess, IEnumerable Surveys, string ErrorMessage)> GetSurveysAsync(string language) { @@ -106,6 +114,7 @@ namespace DamageAssesment.Api.Surveys.Providers EndDate = s.EndDate, IsEnabled = s.IsEnabled, CreatedDate = s.CreatedDate, + Status= GetStatus(s.StartDate,s.EndDate), Titles = CreateMultiLanguageObject(GetSurveyTranslations(s.Id, null, language)) }; @@ -140,6 +149,7 @@ namespace DamageAssesment.Api.Surveys.Providers EndDate = survey.EndDate, IsEnabled = survey.IsEnabled, CreatedDate = survey.CreatedDate, + Status = GetStatus(survey.StartDate, survey.EndDate), Titles = CreateMultiLanguageObject(GetSurveyTranslations(survey.Id, null, language)) }; logger?.LogInformation($"Survey Id: {id} found"); @@ -173,6 +183,7 @@ namespace DamageAssesment.Api.Surveys.Providers } await surveyDbContext.SaveChangesAsync(); var result = mapper.Map(_survey); + result.Status = GetStatus(_survey.StartDate, _survey.EndDate); result.Titles = CreateMultiLanguageObject(GetSurveyTranslations(_survey.Id, survey.Titles, "")); return (true, result, "Successful"); } @@ -217,6 +228,7 @@ namespace DamageAssesment.Api.Surveys.Providers await surveyDbContext.SaveChangesAsync(); var result = mapper.Map(_survey); + result.Status = GetStatus(_survey.StartDate, _survey.EndDate); result.Titles = CreateMultiLanguageObject(GetSurveyTranslations(_survey.Id, survey.Titles, "")); return (true, result, "Successful"); } @@ -249,6 +261,7 @@ namespace DamageAssesment.Api.Surveys.Providers if (survey != null) { var result = mapper.Map(survey); + result.Status = GetStatus(survey.StartDate, survey.EndDate); result.Titles = CreateMultiLanguageObject(GetSurveyTranslations(survey.Id, null, "")); surveyDbContext.Surveys.Remove(survey); await surveyDbContext.SaveChangesAsync(); From 499ac9248bff70d4da44535bc275cb5c5d793b6b Mon Sep 17 00:00:00 2001 From: uppuv Date: Tue, 24 Oct 2023 12:15:13 -0400 Subject: [PATCH 28/30] reverted doculinks grouping by linktype --- .../DoculinkServiceTest.cs | 6 +++--- .../DamageAssesment.Api.DocuLinks.Test/MockData.cs | 6 +++--- .../Interfaces/IDoculinkProvider.cs | 8 ++++---- .../Providers/DoculinkProvider.cs | 12 ++++++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs index 14ddaaa..a8f45d1 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/DoculinkServiceTest.cs @@ -16,7 +16,7 @@ namespace DamageAssesment.Api.DocuLinks.Test { var mockDocumentService = new Mock(); var mockUploadService = new Mock(); - var mockResponse = await MockData.getNoContentResponses(); + var mockResponse = await MockData.getNoContentResponse(); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms","en",null)).ReturnsAsync(mockResponse); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); @@ -30,7 +30,7 @@ namespace DamageAssesment.Api.DocuLinks.Test { var mockDocumentService = new Mock(); var mockUploadService = new Mock(); - var mockResponse = await MockData.getNoContentResponses(); + var mockResponse = await MockData.getNoContentResponse(); mockDocumentService.Setup(service => service.GetdocumentsByLinkAsync("forms", "en", true)).ReturnsAsync(mockResponse); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); @@ -83,7 +83,7 @@ namespace DamageAssesment.Api.DocuLinks.Test { var mockDocumentService = new Mock(); var mockUploadService = new Mock(); - var mockResponse = await MockData.getNoContentResponses(); + var mockResponse = await MockData.getNoContentResponse(); mockDocumentService.Setup(service => service.GetdocumentsByLinkTypeIdAsync(null, "en", true)).ReturnsAsync(mockResponse); var DocumentProvider = new DoculinkController(mockDocumentService.Object, mockUploadService.Object); diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/MockData.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/MockData.cs index 23ffae4..843b4d3 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/MockData.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks.Test/MockData.cs @@ -11,7 +11,7 @@ namespace DamageAssesment.Api.DocuLinks.Test public class MockData { - public static async Task<(bool, List, string)> getOkResponses() + public static async Task<(bool, List, string)> getOkResponses() { List list = new List(); @@ -46,8 +46,8 @@ namespace DamageAssesment.Api.DocuLinks.Test doclinksAttachments= doclinksAttachments }); } - List doculinks = list.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); - return (true, doculinks, null); + // List doculinks = list.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); + return (true, list, null); } diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs index 6d271fd..e9717ee 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Interfaces/IDoculinkProvider.cs @@ -6,11 +6,11 @@ namespace DamageAssesment.Api.DocuLinks.Interfaces { Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> GetDocumentAsync(int id, string? linktype, string? language); Task<(bool IsSuccess, Models.Doculink Document, string ErrorMessage)> GetDocumentByidAsync(int id); - // Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetDocumnetsAsync(string? language); - Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkAsync(string? linkType, string? language, bool? isactive); - Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive); + // Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetDocumnetsAsync(string? language); + Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkAsync(string? linkType, string? language, bool? isactive); + Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive); Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> PostDocumentAsync(Models.Doculink Document); - Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id,Models.Doculink Document); + Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> UpdateDocumentAsync(int id, Models.Doculink Document); Task<(bool IsSuccess, Models.ResDoculink Document, string ErrorMessage)> DeleteDocumentAsync(int id); Task<(bool IsSuccess, int counter, string message)> GetDocumentCounter(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs index 81535ab..5eb57ae 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.DocuLinks/Providers/DoculinkProvider.cs @@ -171,7 +171,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers return MultiLanguage; } - public async Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive) + public async Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkTypeIdAsync(int? linkTypeId, string? language, bool? isactive) { try @@ -195,8 +195,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers item.doclinksAttachments = mapper.Map, List>( DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList()); } - List doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); - return (true, doculinks, null); + // List doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); + return (true, result, null); } return (false, null, "Not found"); } @@ -207,7 +207,7 @@ namespace DamageAssesment.Api.DocuLinks.Providers } } - public async Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkAsync(string? linkType, string? language, bool? isactive) + public async Task<(bool IsSuccess, IEnumerable documents, string ErrorMessage)> GetdocumentsByLinkAsync(string? linkType, string? language, bool? isactive) { try @@ -231,8 +231,8 @@ namespace DamageAssesment.Api.DocuLinks.Providers item.doclinksAttachments = mapper.Map, List>( DocumentDbContext.DoclinksAttachments.AsNoTracking().Where(a => a.DocumentId == item.Id).ToList()); } - List doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); - return (true, doculinks, null); + //List doculinks = result.GroupBy(a => a.linkTypeId).Select(a => new ResDoculinks() { linkTypeId = a.Key, doculinks = a.ToList() }).ToList(); + return (true, result, null); } return (false, null, "Not found"); } From 6f10e9962736b9605c1030e1ee5ea0c861e41827 Mon Sep 17 00:00:00 2001 From: uppuv Date: Wed, 1 Nov 2023 12:42:30 -0400 Subject: [PATCH 29/30] added excel export and removed random number --- .../SurveyResponsesServiceTest.cs | 62 +++---- .../Controllers/SurveyResponsesController.cs | 32 +++- .../DamageAssesment.Api.Responses.csproj | 1 + .../Interfaces/IExcelExportService.cs | 7 + .../Interfaces/IQuestionServiceProvider.cs | 3 +- .../Interfaces/ISurveysResponse.cs | 3 +- .../Models/Attachment.cs | 1 + .../Models/Location.cs | 1 + .../Models/QuestionCategory.cs | 10 ++ .../Models/SurveyExport.cs | 24 +++ .../DamageAssesment.Api.Responses/Program.cs | 1 + .../Providers/ExcelExportService.cs | 56 ++++++ .../Providers/SurveyResponsesProvider.cs | 170 ++++++++++++++++-- .../Services/QuestionServiceProvider.cs | 27 ++- .../appsettings.json | 2 +- .../Providers/SurveysProvider.cs | 18 +- 16 files changed, 360 insertions(+), 58 deletions(-) create mode 100644 DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IExcelExportService.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.Responses/Models/QuestionCategory.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyExport.cs create mode 100644 DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/ExcelExportService.cs diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs index 48cec58..05b3e02 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses.Test/SurveyResponsesServiceTest.cs @@ -12,9 +12,11 @@ namespace DamageAssesment.SurveyResponses.Test public class SurveyResponsesServiceTest { Mock mockSurveyResponseService; + Mock mockExcelExportService; public SurveyResponsesServiceTest() { mockSurveyResponseService = new Mock(); + mockExcelExportService = new Mock(); } [Fact(DisplayName = "Get Responses - Ok case")] @@ -23,7 +25,7 @@ namespace DamageAssesment.SurveyResponses.Test SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(mockRequestObject); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); Assert.Equal(200, result.StatusCode); } @@ -33,7 +35,7 @@ namespace DamageAssesment.SurveyResponses.Test { var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesAsync(1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (BadRequestObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1); Assert.Equal(400, result.StatusCode); } @@ -43,9 +45,9 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1,1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); - var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1,1); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); + var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1); Assert.Equal(200, result.StatusCode); } @@ -53,9 +55,9 @@ namespace DamageAssesment.SurveyResponses.Test public async Task GetSurveyResponsesBySurveyAsync_ShouldReturnStatusCode204() { var mockResponse = await MockData.getResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1,1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); - var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1,1); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAsync(1, 1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); + var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesAsync(1, 1); Assert.Equal(204, result.StatusCode); } @@ -67,9 +69,9 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1,1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); - var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1,1); + mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); + var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1); Assert.Equal(200, result.StatusCode); } @@ -78,7 +80,7 @@ namespace DamageAssesment.SurveyResponses.Test { var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(1, 1, 1); Assert.Equal(204, result.StatusCode); } @@ -88,9 +90,9 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes",1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); - var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes",1); + mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); + var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1); Assert.Equal(200, result.StatusCode); } @@ -99,8 +101,8 @@ namespace DamageAssesment.SurveyResponses.Test { var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.GetResponsesByAnswerAsync(1, 1, "Yes", 1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); - var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes",1); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); + var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponsesByAnswerAsyncAsync(1, 1, "Yes", 1); Assert.Equal(204, result.StatusCode); } @@ -110,8 +112,8 @@ namespace DamageAssesment.SurveyResponses.Test { SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); - mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1,1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1); Assert.Equal(200, result.StatusCode); } @@ -121,7 +123,7 @@ namespace DamageAssesment.SurveyResponses.Test { var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.GetAnswersByRegionAsync(1, 1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (NoContentResult)await surveyResponseProvider.GetAnswersByRegionAsync(1, 1); Assert.Equal(204, result.StatusCode); } @@ -132,7 +134,7 @@ namespace DamageAssesment.SurveyResponses.Test SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1); Assert.Equal(200, result.StatusCode); } @@ -142,7 +144,7 @@ namespace DamageAssesment.SurveyResponses.Test { var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.GetSurveyResponsesByMaintenanceCenterAsync(1, 1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (NoContentResult)await surveyResponseProvider.GetAnswersByMaintenaceCentersync(1, 1); Assert.Equal(204, result.StatusCode); } @@ -153,7 +155,7 @@ namespace DamageAssesment.SurveyResponses.Test SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(); mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (OkObjectResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); Assert.Equal(200, result.StatusCode); } @@ -163,7 +165,7 @@ namespace DamageAssesment.SurveyResponses.Test { var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.GetSurveyResponseByIdAsync(1)).ReturnsAsync(mockResponse); - var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseProvider = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (NoContentResult)await surveyResponseProvider.GetSurveyResponseByIdAsync(1); Assert.Equal(204, result.StatusCode); } @@ -175,7 +177,7 @@ namespace DamageAssesment.SurveyResponses.Test SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(mockRequestObject); mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse); - var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (OkObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); Assert.Equal(200, result.StatusCode); } @@ -186,7 +188,7 @@ namespace DamageAssesment.SurveyResponses.Test SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.PostSurveyResponseAsync(mockRequestObject)).ReturnsAsync(mockResponse); - var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (BadRequestObjectResult)await surveyResponseController.PostSurveysAsync(mockRequestObject); Assert.Equal(400, result.StatusCode); } @@ -197,7 +199,7 @@ namespace DamageAssesment.SurveyResponses.Test SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(mockRequestObject); mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); - var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (OkObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); Assert.Equal(200, result.StatusCode); } @@ -208,7 +210,7 @@ namespace DamageAssesment.SurveyResponses.Test SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.PutSurveyResponseAsync(1, mockRequestObject)).ReturnsAsync(mockResponse); ; - var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (BadRequestObjectResult)await surveyResponseController.PutSurveyResponseAsync(1, mockRequestObject); Assert.Equal(400, result.StatusCode); } @@ -219,7 +221,7 @@ namespace DamageAssesment.SurveyResponses.Test SurveyResponse mockRequestObject = await MockData.getSurveyResponseObject(); var mockResponse = await MockData.getOkResponse(mockRequestObject); mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); - var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (OkObjectResult)await surveyResponseController.DeleteSurveyResponseAsync(1); Assert.Equal(200, result.StatusCode); } @@ -229,7 +231,7 @@ namespace DamageAssesment.SurveyResponses.Test { var mockResponse = await MockData.getResponse(); mockSurveyResponseService.Setup(service => service.DeleteSurveyResponseAsync(1)).ReturnsAsync(mockResponse); ; - var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object); + var surveyResponseController = new SurveyResponsesController(mockSurveyResponseService.Object, mockExcelExportService.Object); var result = (NotFoundResult)await surveyResponseController.DeleteSurveyResponseAsync(1); Assert.Equal(404, result.StatusCode); } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs index 36f40a5..a8f36f4 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs @@ -8,10 +8,12 @@ namespace DamageAssesment.Api.Responses.Controllers public class SurveyResponsesController : ControllerBase { private readonly ISurveysResponse surveyResponseProvider; + private readonly IExcelExportService excelExportService; - public SurveyResponsesController(ISurveysResponse surveyResponseProvider) + public SurveyResponsesController(ISurveysResponse surveyResponseProvider, IExcelExportService excelExportService) { this.surveyResponseProvider = surveyResponseProvider; + this.excelExportService = excelExportService; } /// /// GET request for retrieving survey responses. @@ -57,9 +59,9 @@ namespace DamageAssesment.Api.Responses.Controllers [Route("responses/{surveyid:int}/{locationid:int}/{employeeid:int}")] [Route("responses/{surveyid:int}/{locationid:int}")] [HttpGet] - public async Task GetSurveyResponsesBySurveyAndLocationAsync(int surveyid, int locationid,int? employeeid) + public async Task GetSurveyResponsesBySurveyAndLocationAsync(int surveyid, int locationid, int? employeeid) { - var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid,employeeid ?? 0); + var result = await this.surveyResponseProvider.GetSurveyResponsesBySurveyAndLocationAsync(surveyid, locationid, employeeid ?? 0); if (result.IsSuccess) { return Ok(result.SurveyResponses); @@ -198,6 +200,9 @@ namespace DamageAssesment.Api.Responses.Controllers else return BadRequest(result.ErrorMessage); } + /// + /// Get All active surveys . + /// [Route("responses/surveys/active")] [Route("responses/surveys/active/{language:alpha}")] [Route("responses/surveys/active/{employeeid:int}")] @@ -212,6 +217,23 @@ namespace DamageAssesment.Api.Responses.Controllers } return NoContent(); } + /// + /// Export all survey response data based on survey id. + /// + [HttpGet] + [Route("responses/surveys/export/{surveyid}")] + public async Task GetExcelSurveysAsync(int surveyid,string language, bool IsAdmin = false) + { + var result = await this.surveyResponseProvider.ExportSurveyResponsesAsync(surveyid,language, IsAdmin); + if (result.IsSuccess&& result.surveyResponses.Count>0) + { + + byte[] fileContents = excelExportService.ExportToExcel(result.surveyResponses); + return File(fileContents, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "data.xlsx"); + //return Ok(result.Surveys); + } + return NoContent(); + } //[Route("responses/surveys/active")] //[Route("responses/surveys/active/{language:alpha}")] //[HttpGet] @@ -224,6 +246,10 @@ namespace DamageAssesment.Api.Responses.Controllers // } // return NoContent(); //} + + /// + /// Get all historical surveys . + /// [Route("responses/surveys/historic")] [Route("responses/surveys/historic/{language:alpha}")] [Route("responses/surveys/historic/{employeeid:int}")] diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/DamageAssesment.Api.Responses.csproj b/DamageAssesmentApi/DamageAssesment.Api.Responses/DamageAssesment.Api.Responses.csproj index 1ee7c58..99c5c0c 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/DamageAssesment.Api.Responses.csproj +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/DamageAssesment.Api.Responses.csproj @@ -11,6 +11,7 @@ + diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IExcelExportService.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IExcelExportService.cs new file mode 100644 index 0000000..31b832f --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IExcelExportService.cs @@ -0,0 +1,7 @@ +namespace DamageAssesment.Api.Responses.Interfaces +{ + public interface IExcelExportService + { + public byte[] ExportToExcel(List responses); + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IQuestionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IQuestionServiceProvider.cs index 5c54e57..bbcec8b 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IQuestionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/IQuestionServiceProvider.cs @@ -4,8 +4,9 @@ namespace DamageAssesment.Api.Responses.Interfaces { public interface IQuestionServiceProvider { - Task> getQuestionsAsync(); + Task> getQuestionsAsync(string language); Task> getSurveyQuestionsAsync(int surveyId); Task getQuestionsAsync(int questionId); + Task> GetQuestionCategoriesAsync(string? language); } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs index 19893c8..05a8eed 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Interfaces/ISurveysResponse.cs @@ -7,8 +7,9 @@ namespace DamageAssesment.Api.Responses.Interfaces { Task<(bool IsSuccess, dynamic Answers, string ErrorMessage)> GetAnswersByRegionAsync(int surveyId, int employeeid); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse); - // Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId); + // Task<(bool IsSuccess,dynamic surveyResponses, string ErrorMessage)> GetSurveyResponseAsync(int responseId); Task<(bool IsSuccess, dynamic surveyResponses, string ErrorMessage)> GetSurveyResponsesAsync(int employeeid); + Task<(bool IsSuccess, List surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(int surveyId, string language, bool IsAdmin); Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language); Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetHistoricSurveysAsync(int? employeeid, string language); Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PutSurveyResponseAsync(int Id, Models.SurveyResponse surveyResponse); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Attachment.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Attachment.cs index 6194789..71a87d3 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Attachment.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Attachment.cs @@ -11,6 +11,7 @@ namespace DamageAssesment.Api.Responses.Models public int? AnswerId { get; set; } public bool IsDeleted { get; set; } + public string FileName { get; set; } public Attachment(int answerId, string uri) { diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Location.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Location.cs index d5996d2..e217a7b 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Location.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Location.cs @@ -4,6 +4,7 @@ { public int Id { get; set; } public int RegionId { get; set; } + public string LocationCode { get; set; } public string Name { get; set; } public string MaintenanceCenter { get; set; } public string SchoolType { get; set; } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/QuestionCategory.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/QuestionCategory.cs new file mode 100644 index 0000000..c7c9379 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/QuestionCategory.cs @@ -0,0 +1,10 @@ +namespace DamageAssesment.Api.Responses.Models +{ + public class QuestionCategory + { + public int Id { get; set; } + public string IconName { get; set; } + public string IconLibrary { get; set; } + public object Titles { get; set; } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyExport.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyExport.cs new file mode 100644 index 0000000..e2f820b --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/SurveyExport.cs @@ -0,0 +1,24 @@ +namespace DamageAssesment.Api.Responses.Models +{ + public class SurveyExport + { + public int Id { get; set; } + public string SurveyQuestion { get; set; } + public string Answer { get; set; } + public string Category { get; set; } + + public string School { get; set; } + public string Location { get; set; } + public string Region { get; set; } + + public string MC { get; set; } + public string ResponseDate { get; set; } + public string Notes { get; set; } + + public string Attachment1 { get; set; } + public string Attachment2 { get; set; } + public string Attachment3 { get; set; } + public string Attachment4 { get; set; } + public string Attachment5 { get; set; } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Program.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Program.cs index f7b7216..91adc1c 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Program.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Program.cs @@ -26,6 +26,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHttpClient(). AddTransientHttpErrorPolicy(policy => policy.WaitAndRetryAsync(maxApiCallRetries, _ => TimeSpan.FromSeconds(intervalToRetry))). diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/ExcelExportService.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/ExcelExportService.cs new file mode 100644 index 0000000..0740cc6 --- /dev/null +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/ExcelExportService.cs @@ -0,0 +1,56 @@ +using DamageAssesment.Api.Responses.Interfaces; +using DamageAssesment.Api.Responses.Models; +using OfficeOpenXml; +using System.Collections.Generic; + +namespace DamageAssesment.Api.Responses.Providers +{ + public class ExcelExportService : IExcelExportService + { + public byte[] ExportToExcel(List responses) + { + ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + using (var package = new ExcelPackage()) + { + // Create the first worksheet and populate it with responses + var workSheet1 = package.Workbook.Worksheets.Add("responses"); + PopulateWorksheet(workSheet1, responses); + return package.GetAsByteArray(); + } + } + private void PopulateWorksheet(ExcelWorksheet worksheet, List data) + { + if (data.Count > 0) + { + var properties = data[0].GetType().GetProperties(); + List IsAttchments = new List(); + // Add column headers + for (int col = 1; col <= properties.Length; col++) + { + worksheet.Cells[1, col].Value = properties[col - 1].Name; + if (properties[col - 1].Name.ToLower().Contains("attachment")) + IsAttchments.Add(col); + } + + // Add data + for (int row = 2; row <= data.Count + 1; row++) + { + for (int col = 1; col <= properties.Length; col++) + { + string value = Convert.ToString(properties[col - 1].GetValue(data[row - 2])); + if (IsAttchments.Where(a => a == col).Count() > 0 && !string.IsNullOrEmpty(value)) + { + List attachments = value.Split("##").ToList(); + Uri linkUri = new Uri(attachments[1]); + worksheet.Cells[row, col].Hyperlink = linkUri; + worksheet.Cells[row, col].Value = attachments[0]; + worksheet.Cells[row, col].Style.Font.UnderLine = true; + } + else + worksheet.Cells[row, col].Value = value; + } + } + } + } + } +} diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs index af11925..2b5e3b0 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs @@ -3,6 +3,9 @@ using DamageAssesment.Api.Responses.Db; using DamageAssesment.Api.Responses.Interfaces; using DamageAssesment.Api.Responses.Models; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using System.Reflection; +using System.Text.Json; namespace DamageAssesment.Api.Responses.Providers { @@ -43,7 +46,6 @@ namespace DamageAssesment.Api.Responses.Providers // Create and save SurveyResponse records with references to existing Employee and Location records surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 1, LocationId = 1, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); surveyResponseDbContext.SurveyResponses.Add(new Db.SurveyResponse { SurveyId = 1, EmployeeId = 2, LocationId = 2, ClientDevice = "Mobile", Latitude = 98.8767, Longitute = -129.9897, KeyAnswerResult = "true", CreatedDate = DateTime.Now }); - surveyResponseDbContext.SaveChanges(); } } @@ -111,7 +113,7 @@ namespace DamageAssesment.Api.Responses.Providers return (false, null, ex.Message); } } - + public async Task<(bool IsSuccess, dynamic Surveys, string ErrorMessage)> GetActiveSurveysAsync(int? employeeid, string language) { try @@ -120,9 +122,9 @@ namespace DamageAssesment.Api.Responses.Providers //get all the survey that already taken by the employee var surveys = await surveyServiceProvider.getSurveysAsync(language); surveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now).ToList(); - if (employeeid==null || employeeid==0) + if (employeeid == null || employeeid == 0) return (true, surveys, null); - List listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid.Value).Select(y => y.SurveyId).ToListAsync(); + List listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid.Value).Select(y => y.SurveyId).ToListAsync(); var activeSurveys = surveys.Where(s => !listOfsurveysId.Contains(s.Id)); return (true, activeSurveys, null); } @@ -142,10 +144,9 @@ namespace DamageAssesment.Api.Responses.Providers var surveys = await surveyServiceProvider.getSurveysAsync(language); // returning only historic data: end date is less than current date. surveys = surveys.Where(s => s.EndDate < DateTime.Now).ToList(); - if(employeeid==null|| employeeid==0) + if (employeeid == null || employeeid == 0) return (true, surveys, null); var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); - var historicSurveys = from s in surveys from r in surveyResponses where s.Id == r.SurveyId @@ -308,6 +309,26 @@ namespace DamageAssesment.Api.Responses.Providers return (false, null, ex.Message); } } + public async Task<(bool IsSuccess, List surveyResponses, string ErrorMessage)> ExportSurveyResponsesAsync(int surveyId, string language, bool isadmin) + { + try + { + var responses = await getAllSurveyResponsesExcelAsync(surveyId,language, isadmin); + + if (responses != null) + return (true, responses, "Request Successful."); + else + { + responses = null; + return (true, responses, "Empty object returned"); + } + } + catch (Exception ex) + { + logger?.LogError(ex.ToString()); + return (false, null, ex.Message); + } + } public async Task<(bool IsSuccess, Models.SurveyResponse SurveyResponse, string ErrorMessage)> PostSurveyResponseAsync(Models.SurveyResponse surveyResponse) { @@ -488,7 +509,7 @@ namespace DamageAssesment.Api.Responses.Providers { var employee = await employeeServiceProvider.getEmployeeAsync(surveyResponse.EmployeeId); var answers = await answerServiceProvider.GetAnswersByResponseIdAsync(surveyResponse.Id); - var allQuestions = await questionServiceProvider.getQuestionsAsync(); + var allQuestions = await questionServiceProvider.getQuestionsAsync(null); var questions = allQuestions.Where(s => s.SurveyId == surveyResponse.SurveyId); var attachments = await attachmentServiceProvider.getAttachmentsAsync(); @@ -544,7 +565,7 @@ namespace DamageAssesment.Api.Responses.Providers } var answers = await answerServiceProvider.getAnswersAsync(); - var questions = await questionServiceProvider.getQuestionsAsync(); + var questions = await questionServiceProvider.getQuestionsAsync(null); var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; //var surveyQuestions = await questionServiceProvider.getSurveyQuestionsAsync(surveyId); @@ -650,7 +671,7 @@ namespace DamageAssesment.Api.Responses.Providers var answers = await answerServiceProvider.getAnswersAsync(); - var questions = await questionServiceProvider.getQuestionsAsync(); + var questions = await questionServiceProvider.getQuestionsAsync(null); var attachments = await attachmentServiceProvider.getAttachmentsAsync(); var result = from r in surveyResonses @@ -687,7 +708,136 @@ namespace DamageAssesment.Api.Responses.Providers return null; } } + //Method to get All Survey Responses for excel export + private async Task> getAllSurveyResponsesExcelAsync(int surveyId,string language, bool isadmin) + { + try + { + if (string.IsNullOrEmpty(language)) language = "en"; + List surveyResonses; + surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a=>a.SurveyId==surveyId).ToListAsync(); + var answers = await answerServiceProvider.getAnswersAsync(); + var Locations = await locationServiceProvider.getLocationsAsync(); + var regions = await regionServiceProvider.getRegionsAsync(); + var questions = await questionServiceProvider.getQuestionsAsync(language); + var categories = await questionServiceProvider.GetQuestionCategoriesAsync(language); + var attachments = await attachmentServiceProvider.getAttachmentsAsync(); + List questionLists = new List(); + var allques = from res in surveyResonses + join loc in Locations on res.LocationId equals loc.Id + join reg in regions on loc.RegionId equals reg.Id + join ans in answers on res.Id equals ans.SurveyResponseId + join q in questions on ans.QuestionId equals q.Id + join qc in categories on q.CategoryId equals qc.Id + select new + { + responseId = res.Id, + questionId = q.Id, + QuestionNumber = q.QuestionNumber, + Category = JsonSerializer.Deserialize>(qc.Titles.ToString())[language], + question = q.Text[language], + answerId = ans.Id, + AnswerText = ans.AnswerText, + Comment = ans.Comment, + Location = loc.LocationCode, + school = loc.Name, + Region = reg.Name, + MC = loc.MaintenanceCenter, + ResponseDate = res.CreatedDate, + EmployeeId = res.EmployeeId, + ClientDevice = res.ClientDevice, + Attachments = attachments.Where(a => a.AnswerId == ans.Id).Select(a => a.FileName + "##" + a.URI).ToList() + }; + List allresoponses = new List(); + foreach (var item in allques) + { + List ansattachments = item.Attachments.ToList(); + + //// Initialize the attachment dictionary + //var attachmentsobject = new Dictionary(); + //for (int i = 0; i < ansattachments.Count; i++) + //{ + // attachmentsobject["Attachment"+(i+1).ToString()] = ansattachments[i]; + //} + + + string[] variables = new string[5]; + for (int i = 0; i < 5; i++) // Assuming you want to assign 5 values + { + if (i < ansattachments.Count()) + { + variables[i] = ansattachments[i]; + } + else + { + variables[i] = string.Empty; // or null, or any other default value + } + } + + // Now, you can access the values using the variables + string att1 = variables[0], att2 = variables[1], att3 = variables[2], att4 = variables[3], att5 = variables[4]; + object response; + if (isadmin) + { + response = new + { + SurveyQuestion = item.question, + Answer = item.AnswerText, + Category = item.Category, + School = item.school, + Location = item.Location, + Region = item.Region, + MC = item.MC, + ResponseDate = item.ResponseDate.ToString(), + Notes = item.Comment, + Attachment1 = att1, + Attachment2 = att2, + Attachment3 = att3, + Attachment4 = att4, + Attachment5 = att5, + User = item.EmployeeId, + DeviceType = item.ClientDevice, + Reference = item.responseId + }; + // Add the attachment dictionary to the response object + // response = new { response, Attachments = attachments }; + } + else + { + response = new + { + SurveyQuestion = item.question, + Answer = item.AnswerText, + Category = item.Category, + School = item.school, + Location = item.Location, + Region = item.Region, + MC = item.MC, + ResponseDate = item.ResponseDate.ToString(), + Notes = item.Comment, + Attachment1 = att1, + Attachment2 = att2, + Attachment3 = att3, + Attachment4 = att4, + Attachment5 = att5 + }; + + // Add the attachment dictionary to the response object + // response = new { response, Attachments = attachments }; + } + allresoponses.Add(response); + } + return allresoponses; + + + } + catch (Exception ex) + { + logger?.LogError($"Exception Found : {ex.Message} - Ref: SurveyResponsesProvider.getSurveyResponseBySurveyIdAsync()"); + return null; + } + } //Method to get Answers By Maintenance Center by surveyId private async Task getResultsByMaintenanceCenterAsync(int surveyId, int employeeid) @@ -784,7 +934,7 @@ namespace DamageAssesment.Api.Responses.Providers } var answers = await answerServiceProvider.getAnswersAsync(); - var questions = await questionServiceProvider.getQuestionsAsync(); + var questions = await questionServiceProvider.getQuestionsAsync(null); var surveyQuestions = from q in questions where q.SurveyId == surveyId select q; var attachments = await attachmentServiceProvider.getAttachmentsAsync(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/QuestionServiceProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/QuestionServiceProvider.cs index 95086b8..bc9c912 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/QuestionServiceProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Services/QuestionServiceProvider.cs @@ -10,10 +10,12 @@ namespace DamageAssesment.Api.Responses.Services { } - public async Task> getQuestionsAsync() + public async Task> getQuestionsAsync(string language) { try { + if (!string.IsNullOrEmpty(language)) + url = url + "/" + language; var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); var questions = JsonConvert.DeserializeObject>(responseJsonString); @@ -27,6 +29,27 @@ namespace DamageAssesment.Api.Responses.Services return new List(); } } + public async Task> GetQuestionCategoriesAsync(string? language) + { + try + { + url = urlBase + configuration.GetValue("RessourceSettings:QuestionCategory"); + + if (!string.IsNullOrEmpty(language)) + url = url + "/" + language; + var responseJsonString = await httpUtil.SendAsync(HttpMethod.Get, url, null); + var questions = JsonConvert.DeserializeObject>(responseJsonString); + + if (questions == null || !questions.Any()) + return new List(); + else return questions; + } + catch (Exception ex) + { + logger?.LogError($"Exception Found : {ex.Message} - Ref: QuestionServiceProvider.GetQuestionCategoriesAsync()"); + return new List(); + } + } public async Task> getSurveyQuestionsAsync(int surveyId) { @@ -37,7 +60,7 @@ namespace DamageAssesment.Api.Responses.Services var questions = JsonConvert.DeserializeObject>(responseJsonString); if (questions == null || !questions.Any()) - return new List() ; + return new List(); else return questions; } catch (Exception ex) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.json b/DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.json index f23b75a..f7df084 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.json +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/appsettings.json @@ -25,12 +25,12 @@ "AttachmentUrlBase": "http://damageassesment.api.attachments:80", "SurveyUrlBase": "http://damageassesment.api.surveys:80" }, - "RessourceSettings": { "Employee": "/employees", "EmployeeById": "/employees/{0}", "Question": "/questions", "QuestionById": "/questions/{0}", + "QuestionCategory": "/questions/categories", "SurveyQuestion": "/questions/bysurvey/{0}", "Survey": "/surveys", "SurveyById": "/surveys/{0}", diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs index e48efc1..5a84843 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs @@ -18,7 +18,7 @@ namespace DamageAssesment.Api.Surveys.Providers this.surveyDbContext = surveysDbContext; this.logger = logger; this.mapper = mapper; - // seedData(); + //seedData(); } // Method to seed initial data into the database @@ -44,10 +44,10 @@ namespace DamageAssesment.Api.Surveys.Providers surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey2.Id, Language = "en", Title = "Hurricane Andrew Aftermath Survey" }); surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey2.Id, Language = "es", Title = "Encuesta sobre las secuelas del huracán Andrew" }); surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey2.Id, Language = "fr", Title = "Enquête sur les conséquences de l'ouragan Andrew" }); - - surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "en", Title = "Hurricane Idalia Aftermath Survey" }); - surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "es", Title = "Encuesta sobre las secuelas del huracán Idalia" }); - surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "fr", Title = "Enquête sur les conséquences de l'ouragan Idalia" }); + + surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "en", Title = "Hurricane Irma" }); + surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "es", Title = "Huracán Irma" }); + surveyDbContext.SurveysTranslation.Add(new Db.SurveyTranslation { SurveyId = survey3.Id, Language = "fr", Title = "Ouragan Irma" }); surveyDbContext.SaveChanges(); } @@ -85,7 +85,7 @@ namespace DamageAssesment.Api.Surveys.Providers MultiLanguage = dict; return MultiLanguage; } - public string GetStatus(DateTime StartDate,DateTime EndDate) + public string GetStatus(DateTime StartDate, DateTime EndDate) { if (StartDate > DateTime.Now) return SurveyStatus.PENDING.ToString(); @@ -114,7 +114,7 @@ namespace DamageAssesment.Api.Surveys.Providers EndDate = s.EndDate, IsEnabled = s.IsEnabled, CreatedDate = s.CreatedDate, - Status= GetStatus(s.StartDate,s.EndDate), + Status = GetStatus(s.StartDate, s.EndDate), Titles = CreateMultiLanguageObject(GetSurveyTranslations(s.Id, null, language)) }; @@ -217,12 +217,10 @@ namespace DamageAssesment.Api.Surveys.Providers _survey = mapper.Map(survey); surveyDbContext.Surveys.Update(_survey); await surveyDbContext.SaveChangesAsync(); - List listSurveyTranslation = new List(); - Random random = new Random(); foreach (var title in survey.Titles) { - listSurveyTranslation.Add(new Db.SurveyTranslation { Id = random.Next(), SurveyId = _survey.Id, Language = title.Language, Title = title.Title }); + listSurveyTranslation.Add(new Db.SurveyTranslation { SurveyId = _survey.Id, Language = title.Language, Title = title.Title }); } surveyDbContext.SurveysTranslation.AddRange(listSurveyTranslation); await surveyDbContext.SaveChangesAsync(); From c80749e292f23ba04ec392f535ec9d13a9866943 Mon Sep 17 00:00:00 2001 From: uppuv Date: Sun, 5 Nov 2023 13:20:29 -0500 Subject: [PATCH 30/30] ixed survey issue in response level, and added logic for start and end date as optional date. --- .../Controllers/SurveyResponsesController.cs | 6 ++--- .../Models/Survey.cs | 11 ++++++++-- .../Providers/ExcelExportService.cs | 16 +++++++++----- .../Providers/SurveyResponsesProvider.cs | 10 ++++----- .../DamageAssesment.Api.Surveys/Db/Survey.cs | 5 +++-- .../Models/Survey.cs | 6 ++--- .../Providers/SurveysProvider.cs | 22 +++++++++++++------ 7 files changed, 49 insertions(+), 27 deletions(-) diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs index a8f36f4..871106c 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Controllers/SurveyResponsesController.cs @@ -222,10 +222,10 @@ namespace DamageAssesment.Api.Responses.Controllers /// [HttpGet] [Route("responses/surveys/export/{surveyid}")] - public async Task GetExcelSurveysAsync(int surveyid,string language, bool IsAdmin = false) + public async Task GetExcelSurveysAsync(int surveyid, string language, bool IsAdmin = false) { - var result = await this.surveyResponseProvider.ExportSurveyResponsesAsync(surveyid,language, IsAdmin); - if (result.IsSuccess&& result.surveyResponses.Count>0) + var result = await this.surveyResponseProvider.ExportSurveyResponsesAsync(surveyid, language, IsAdmin); + if (result.IsSuccess && result.surveyResponses.Count > 0) { byte[] fileContents = excelExportService.ExportToExcel(result.surveyResponses); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Survey.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Survey.cs index 8265046..5419251 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Survey.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Models/Survey.cs @@ -2,13 +2,20 @@ namespace DamageAssesment.Api.Responses.Models { + public enum SurveyStatus + { + PENDING, + ACTIVE, + INACTIVE + } public class Survey { public int Id { get; set; } public bool IsEnabled { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } + public DateTime? StartDate { get; set; } + public DateTime? EndDate { get; set; } public DateTime CreatedDate { get; set; } + public string Status { get; set; } public Dictionary Titles { get; set; } } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/ExcelExportService.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/ExcelExportService.cs index 0740cc6..b0fb669 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/ExcelExportService.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/ExcelExportService.cs @@ -2,6 +2,7 @@ using DamageAssesment.Api.Responses.Models; using OfficeOpenXml; using System.Collections.Generic; +using System.ComponentModel; namespace DamageAssesment.Api.Responses.Providers { @@ -9,7 +10,7 @@ namespace DamageAssesment.Api.Responses.Providers { public byte[] ExportToExcel(List responses) { - ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; using (var package = new ExcelPackage()) { // Create the first worksheet and populate it with responses @@ -37,17 +38,22 @@ namespace DamageAssesment.Api.Responses.Providers { for (int col = 1; col <= properties.Length; col++) { + string value = Convert.ToString(properties[col - 1].GetValue(data[row - 2])); if (IsAttchments.Where(a => a == col).Count() > 0 && !string.IsNullOrEmpty(value)) { List attachments = value.Split("##").ToList(); - Uri linkUri = new Uri(attachments[1]); - worksheet.Cells[row, col].Hyperlink = linkUri; - worksheet.Cells[row, col].Value = attachments[0]; - worksheet.Cells[row, col].Style.Font.UnderLine = true; + try + { + Uri linkUri = new Uri(attachments[1]); + worksheet.Cells[row, col].Value = attachments[0]; + worksheet.Cells[row, col].Style.Font.UnderLine = true; + } + catch { worksheet.Cells[row, col].Value = attachments[1]; } } else worksheet.Cells[row, col].Value = value; + } } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs index 2b5e3b0..d52d153 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Responses/Providers/SurveyResponsesProvider.cs @@ -121,7 +121,7 @@ namespace DamageAssesment.Api.Responses.Providers logger?.LogInformation("Querying to get SurveyResponse object from DB"); //get all the survey that already taken by the employee var surveys = await surveyServiceProvider.getSurveysAsync(language); - surveys = surveys.Where(s => s.IsEnabled == true && s.StartDate <= DateTime.Now && s.EndDate >= DateTime.Now).ToList(); + surveys = surveys.Where(s => s.IsEnabled == true && s.Status == SurveyStatus.ACTIVE.ToString()).ToList(); if (employeeid == null || employeeid == 0) return (true, surveys, null); List listOfsurveysId = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid.Value).Select(y => y.SurveyId).ToListAsync(); @@ -143,7 +143,7 @@ namespace DamageAssesment.Api.Responses.Providers var surveys = await surveyServiceProvider.getSurveysAsync(language); // returning only historic data: end date is less than current date. - surveys = surveys.Where(s => s.EndDate < DateTime.Now).ToList(); + surveys = surveys.Where(s => s.Status == SurveyStatus.INACTIVE.ToString()).ToList(); if (employeeid == null || employeeid == 0) return (true, surveys, null); var surveyResponses = await surveyResponseDbContext.SurveyResponses.Where(x => x.EmployeeId == employeeid).ToListAsync(); @@ -313,7 +313,7 @@ namespace DamageAssesment.Api.Responses.Providers { try { - var responses = await getAllSurveyResponsesExcelAsync(surveyId,language, isadmin); + var responses = await getAllSurveyResponsesExcelAsync(surveyId, language, isadmin); if (responses != null) return (true, responses, "Request Successful."); @@ -709,13 +709,13 @@ namespace DamageAssesment.Api.Responses.Providers } } //Method to get All Survey Responses for excel export - private async Task> getAllSurveyResponsesExcelAsync(int surveyId,string language, bool isadmin) + private async Task> getAllSurveyResponsesExcelAsync(int surveyId, string language, bool isadmin) { try { if (string.IsNullOrEmpty(language)) language = "en"; List surveyResonses; - surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a=>a.SurveyId==surveyId).ToListAsync(); + surveyResonses = await surveyResponseDbContext.SurveyResponses.Where(a => a.SurveyId == surveyId).ToListAsync(); var answers = await answerServiceProvider.getAnswersAsync(); var Locations = await locationServiceProvider.getLocationsAsync(); var regions = await regionServiceProvider.getRegionsAsync(); diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Db/Survey.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Db/Survey.cs index c031f57..2f19281 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Db/Survey.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Db/Survey.cs @@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace DamageAssesment.Api.Surveys.Db { + [Table("Surveys")] public class Survey { [Key] @@ -12,9 +13,9 @@ namespace DamageAssesment.Api.Surveys.Db public bool IsEnabled { get; set; } - public DateTime StartDate { get; set; } + public DateTime? StartDate { get; set; } - public DateTime EndDate { get; set; } + public DateTime? EndDate { get; set; } public DateTime CreatedDate { get; set; } = DateTime.Now; /* diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Models/Survey.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Models/Survey.cs index 38fa72a..746047c 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Models/Survey.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Models/Survey.cs @@ -21,8 +21,8 @@ namespace DamageAssesment.Api.Surveys.Models { public int Id { get; set; } public bool IsEnabled { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } - public DateTime CreatedDate { get; set; } + public DateTime? StartDate { get; set; } + public DateTime? EndDate { get; set; } + public DateTime? CreatedDate { get; set; } } } diff --git a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs index 5a84843..3a2e81c 100644 --- a/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs +++ b/DamageAssesmentApi/DamageAssesment.Api.Surveys/Providers/SurveysProvider.cs @@ -85,14 +85,21 @@ namespace DamageAssesment.Api.Surveys.Providers MultiLanguage = dict; return MultiLanguage; } - public string GetStatus(DateTime StartDate, DateTime EndDate) + public string GetStatus(DateTime? StartDate, DateTime? EndDate) { - if (StartDate > DateTime.Now) - return SurveyStatus.PENDING.ToString(); - else if (StartDate <= DateTime.Now && EndDate > DateTime.Now) - return SurveyStatus.ACTIVE.ToString(); - else + try + { + if (StartDate > DateTime.Now) + return SurveyStatus.PENDING.ToString(); + else if (StartDate <= DateTime.Now && EndDate > DateTime.Now) + return SurveyStatus.ACTIVE.ToString(); + else + return SurveyStatus.INACTIVE.ToString(); + } + catch + { return SurveyStatus.INACTIVE.ToString(); + } } // Method to get surveys asynchronously with multi-language support public async Task<(bool IsSuccess, IEnumerable Surveys, string ErrorMessage)> GetSurveysAsync(string language) @@ -136,7 +143,8 @@ namespace DamageAssesment.Api.Surveys.Providers try { logger?.LogInformation("Query Survey"); - var survey = await surveyDbContext.Surveys.SingleOrDefaultAsync(s => s.Id == id && s.IsEnabled == true); + // removed is enabled becuase we are using it in responses to get response + var survey = await surveyDbContext.Surveys.SingleOrDefaultAsync(s => s.Id == id); if (survey != null) {