Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/CPF-56 Organization Creation by USDR admin role #64

Merged
merged 9 commits into from
Jan 12, 2024

Conversation

Vikariusu
Copy link
Contributor

@Vikariusu Vikariusu commented Dec 29, 2023

Ticket #56

EDIT: This PR is ready for review

This is a PR for creating organization form for USDR admin users. There are couple open questions I have to make this feature complete.

Currently we have the Role and User models in schema.prisma below:

model Role {
  id        Int      @id @default(autoincrement())
  name      String
  createdAt DateTime @default(now())
  updatedAt DateTime
  users     User[]
}

model User {
  id             Int                 @id @default(autoincrement())
  email          String
  name           String?
  agencyId       Int?
  organizationId Int?
  roleId         Int?
  createdAt      DateTime            @default(now()) @db.Timestamptz(6)
  updatedAt      DateTime            @default(now()) @db.Timestamptz(6)
  agency         Agency?             @relation(fields: [agencyId], references: [id])
  organization   Organization?       @relation(fields: [organizationId], references: [id])
  role           Role?               @relation(fields: [roleId], references: [id])
  certified      ReportingPeriod[]
  uploaded       Upload[]
  validated      UploadValidation[] @relation("ValidatedUploads")
  invalidated    UploadValidation[] @relation("InvalidatedUploads")
  subrecipients  Subrecipient[]
}

which means that user can only have 1 role. However, the getCurrentUser() function that provides (currently hardcoded) user data, uses roles array.

Questions:

  1. Can user have more than one role? Which format will be used?
  2. If user can only have one role (like the database is currently set up), is there a need for Role to be a separate model and not an Enum?
  3. The Lucid chart currently mentions 3 different user roles, written in snake case (like usdr_admin). Is that the convention we'll be using going forward? Currently I'm using usdr-admin.
  4. When creating a new admin user for the organization, what is the type of the admin that the user should have? Lucid chart lists organization_admin role for example, is this the role that should be assigned?

Functionality overview

Organizations tab

  1. Organizations tab renders only for users with usdr-admin role.
  2. For users without usdr-admin role, navigating to /organizations will show a newly added Forbidden page. Forbidden page renders when the current user doesn't have permissions to view that page but is logged in.

New Organization form

  1. Creates a new organization, assigns a new agency to that organization, and assigns a new admin user to both the organization and the agency.
  2. All fields are required. Trying to submit a form with empty fields will render "This field is required" under the missing fields.
  3. The backend logic assumes that the admin role exists and does not create a new role in the database.

New Organization form as a separate component

New Organization form has its own component, separate from Edit Organization form. By default, Redwood uses the same form for adding and editing but since those 2 forms are quite different, separating the two makes the code more clear.

…a component for saving a new Organization, create new Organization, Agency and admin user on save
@github-actions github-actions bot added enhancement New feature or request javascript labels Dec 29, 2023
Copy link

github-actions bot commented Dec 29, 2023

QA Summary

See our documentation for tips on how to resolve failing QA checks.

QA Check Result
🌐 Web Tests
🔗 API Tests
📏 ESLint
🧹 TFLint

Test Coverage

Coverage report for api suite
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🔴 All files 21.56 2.17 29.23 21.96
🟢  directives/requireAuth 100 100 100 100
🟢   requireAuth.ts 100 100 100 100
🟡  directives/skipAuth 50 100 0 50
🟡   skipAuth.ts 50 100 0 50 13
🔴  functions 0 100 0 0
🔴   graphql.ts 0 100 0 0 14-22
🔴  functions/cpfValidation 0 100 0 0
🔴   cpfValidation.scenarios.ts 0 100 100 0 3
🔴   cpfValidation.ts 0 100 0 0 7-26
🔴  functions/excelToJson 0 0 0 0
🔴   excelToJson.scenarios.ts 0 100 100 0 3
🔴   excelToJson.ts 0 0 0 0 12-47
🔴  graphql 0 100 100 0
🔴   agencies.sdl.ts 0 100 100 0 1
🔴   expenditureCategories.sdl.ts 0 100 100 0 1
🔴   inputTemplates.sdl.ts 0 100 100 0 1
🔴   organizations.sdl.ts 0 100 100 0 1
🔴   outputTemplates.sdl.ts 0 100 100 0 1
🔴   projects.sdl.ts 0 100 100 0 1
🔴   reportingPeriods.sdl.ts 0 100 100 0 1
🔴   roles.sdl.ts 0 100 100 0 1
🔴   subrecipients.sdl.ts 0 100 100 0 1
🔴   uploadValidations.sdl.ts 0 100 100 0 1
🔴   uploads.sdl.ts 0 100 100 0 1
🔴   users.sdl.ts 0 100 100 0 1
🔴  lib 4.91 2.23 6.66 5.04
🔴   auth.ts 20 10.34 25 21.21 40-41,73-102,121,125-160
🔴   aws.ts 27.02 12.5 18.18 27.02 46-51,67-99,125-166,179
🔴   db.ts 31.25 50 50 31.25 15-35,45,47
🔴   ec-codes.ts 0 100 100 0 1
🟢   logger.ts 100 100 100 100
🔴   persist-upload.js 0 0 0 0 16-295
🔴   preconditions.ts 0 0 0 0 2-3
🔴   records.js 0 0 0 0 12-214
🔴   templateRules.ts 0 0 0 0
🔴   tracer.ts 0 100 100 0 5-14
🔴   validate-upload.js 0 0 0 0 18-790
🔴   validation-error.ts 0 0 0 0 14-22
🔴   validation-rules.js 0 0 0 0 6-194
🟡  services/agencies 70.58 0 83.33 70.58
🟢   agencies.scenarios.ts 100 100 100 100
🟡   agencies.ts 68.75 0 83.33 68.75 39-47
🟢  services/expenditureCategories 92.3 100 83.33 92.3
🟢   expenditureCategories.scenarios.ts 100 100 100 100
🟢   expenditureCategories.ts 91.66 100 83.33 91.66 46
🟢  services/inputTemplates 92.3 100 83.33 92.3
🟢   inputTemplates.scenarios.ts 100 100 100 100
🟢   inputTemplates.ts 91.66 100 83.33 91.66 47
🟡  services/organizations 52 100 38.46 52
🟢   organizations.scenarios.ts 100 100 100 100
🟡   organizations.ts 50 100 38.46 50 36-66,89-113
🟢  services/outputTemplates 92.3 100 83.33 92.3
🟢   outputTemplates.scenarios.ts 100 100 100 100
🟢   outputTemplates.ts 91.66 100 83.33 91.66 43
🟡  services/projects 80 100 62.5 80
🟢   projects.scenarios.ts 100 100 100 100
🟡   projects.ts 78.57 100 62.5 78.57 45-51
🟡  services/reportingPeriods 53.84 0 41.66 56
🟢   reportingPeriods.scenarios.ts 100 100 100 100
🟡   reportingPeriods.ts 52 0 41.66 54.16 21-31,42-45,72-82
🟡  services/subrecipients 80 100 62.5 80
🟢   subrecipients.scenarios.ts 100 100 100 100
🟡   subrecipients.ts 78.57 100 62.5 78.57 47-55
🔴  services/uploadValidations 0 100 0 0
🔴   uploadValidations.scenarios.ts 0 100 100 0 5
🔴   uploadValidations.ts 0 100 0 0 9-66
🟡  services/uploads 70 100 45.45 70
🟢   uploads.scenarios.ts 100 100 100 100
🟡   uploads.ts 68.42 100 45.45 68.42 49-66
🟡  services/users 54.16 0 41.66 54.16
🟢   users.scenarios.ts 100 100 100 100
🟡   users.ts 52.17 0 41.66 52.17 40-48,54-69
Coverage report for web suite
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🔴 All files 14.76 12.03 13.27 13.84
🔴  src 25.92 0 21.42 25.92
🔴   App.tsx 0 0 0 0 3-35
🟢   Routes.tsx 100 100 100 100
🔴   auth.ts 35.71 100 16.66 35.71 33-47,71-91
🔴   entry.client.tsx 0 0 100 0 10-22
🔴  src/components/Agency/Agencies 0 100 0 0
🔴   Agencies.tsx 0 100 0 0 9-21
🔴  src/components/Agency/AgenciesCell 0 100 0 0
🔴   AgenciesCell.tsx 0 100 0 0 8-39
🔴  src/components/Agency/Agency 0 0 0 0
🔴   Agency.tsx 0 0 0 0 10-78
🔴  src/components/Agency/AgencyCell 0 100 0 0
🔴   AgencyCell.tsx 0 100 0 0 7-27
🔴  src/components/Agency/AgencyForm 0 0 0 0
🔴   AgencyForm.tsx 0 0 0 0 24-39
🔴  src/components/Agency/EditAgencyCell 0 100 0 0
🔴   EditAgencyCell.tsx 0 100 0 0 10-58
🔴  src/components/Agency/NewAgency 0 100 0 0
🔴   NewAgency.tsx 0 100 0 0 9-35
🟢  src/components/Navigation 100 50 100 100
🟢   Navigation.tsx 100 50 100 100 61
🔴  src/components/Organization/EditOrganizationCell 0 100 0 0
🔴   EditOrganizationCell.tsx 0 100 0 0 13-62
🔴  src/components/Organization/EditOrganizationForm 0 0 0 0
🔴   EditOrganizationForm.tsx 0 0 0 0 27-41
🔴  src/components/Organization/NewOrganization 0 100 0 0
🔴   NewOrganization.tsx 0 100 0 0 9-37
🔴  src/components/Organization/NewOrganizationForm 0 0 0 0
🔴   NewOrganizationForm.tsx 0 0 0 0 25-54
🔴  src/components/Organization/Organization 0 0 0 0
🔴   Organization.tsx 0 0 0 0 10-70
🔴  src/components/Organization/OrganizationCell 0 100 0 0
🔴   OrganizationCell.tsx 0 100 0 0 7-27
🔴  src/components/Organization/OrganizationPickListsCell 40.9 0 27.27 36.84
🟡   OrganizationPickListsCell.mock.ts 50 100 0 100
🔴   OrganizationPickListsCell.stories.tsx 0 0 0 0 6-32
🟡   OrganizationPickListsCell.tsx 72.72 100 50 66.66 38-63
🔴  src/components/Organization/Organizations 0 100 0 0
🔴   Organizations.tsx 0 100 0 0 9-21
🔴  src/components/Organization/OrganizationsCell 0 100 0 0
🔴   OrganizationsCell.tsx 0 100 0 0 8-37
🟡  src/components/ReportingPeriodCell 55 0 55.55 47.05
🟢   ReportingPeriodCell.mock.ts 100 100 100 100
🔴   ReportingPeriodCell.stories.tsx 0 0 0 0 6-32
🟢   ReportingPeriodCell.tsx 100 100 100 100
🟡  src/components/ReportingPeriodsCell 57.14 28.57 60 50
🟢   ReportingPeriodsCell.mock.ts 100 100 100 100
🔴   ReportingPeriodsCell.stories.tsx 0 0 0 0 6-32
🟢   ReportingPeriodsCell.tsx 100 66.66 100 100 63-66
🔴  src/components/TableBuilder 0 0 0 0
🔴   DebouncedInput.tsx 0 0 0 0 13-32
🔴   Filter.tsx 0 0 0 0 6-15
🔴   TableBuilder.tsx 0 0 0 0 22-70
🔴   TableHeader.tsx 0 0 0 0 5-42
🔴   TableRow.tsx 0 100 0 0 3-7
🔴  src/components/Upload/EditUploadCell 0 100 0 0
🔴   EditUploadCell.tsx 0 100 0 0 10-68
🔴  src/components/Upload/NewUpload 0 100 0 0
🔴   NewUpload.tsx 0 100 0 0 8-32
🔴  src/components/Upload/Upload 0 0 0 0
🔴   Upload.tsx 0 0 0 0 12-100
🔴  src/components/Upload/UploadCell 0 100 0 0
🔴   UploadCell.tsx 0 100 0 0 7-32
🔴  src/components/Upload/UploadForm 0 0 0 0
🔴   UploadForm.tsx 0 0 0 0 22-98
🔴  src/components/Upload/Uploads 0 0 0 0
🔴   Uploads.tsx 0 0 0 0 9-66
🔴   columns.tsx 0 0 0 0 7-62
🔴  src/components/Upload/UploadsCell 0 100 0 0
🔴   UploadsCell.tsx 0 100 0 0 8-53
🔴  src/components/User/EditUserCell 0 100 0 0
🔴   EditUserCell.tsx 0 100 0 0 10-60
🔴  src/components/User/NewUser 0 100 0 0
🔴   NewUser.tsx 0 100 0 0 9-32
🔴  src/components/User/User 0 0 0 0
🔴   User.tsx 0 0 0 0 10-94
🔴  src/components/User/UserCell 0 100 0 0
🔴   UserCell.tsx 0 100 0 0 7-31
🔴  src/components/User/UserForm 0 0 0 0
🔴   UserForm.tsx 0 0 0 0 26-40
🔴  src/components/User/Users 0 100 0 0
🔴   Users.tsx 0 100 0 0 9-24
🔴  src/components/User/UsersCell 0 100 0 0
🔴   UsersCell.tsx 0 100 0 0 8-43
🟡  src/layouts/AuthenticatedLayout 60 50 100 60
🔴   AuthenticatedLayout.stories.tsx 0 100 100 0 5-13
🟢   AuthenticatedLayout.tsx 100 50 100 100 24
🟢  src/lib 100 100 100 100
🟢   formatters.tsx 100 100 100 100
🔴  src/pages/Agency/AgenciesPage 0 100 0 0
🔴   AgenciesPage.tsx 0 100 0 0 7-11
🔴  src/pages/Agency/AgencyPage 0 100 0 0
🔴   AgencyPage.tsx 0 100 0 0 7-8
🔴  src/pages/Agency/EditAgencyPage 0 100 0 0
🔴   EditAgencyPage.tsx 0 100 0 0 7-8
🔴  src/pages/Agency/NewAgencyPage 0 100 0 0
🔴   NewAgencyPage.tsx 0 100 0 0 3-4
🔴  src/pages/FatalErrorPage 0 0 0 0
🔴   FatalErrorPage.tsx 0 0 0 0 15
🟡  src/pages/ForbiddenPage 50 100 100 50
🔴   ForbiddenPage.stories.tsx 0 100 100 0 5-13
🟢   ForbiddenPage.tsx 100 100 100 100
🟡  src/pages/LoginPage 50 100 100 50
🔴   LoginPage.stories.tsx 0 100 100 0 5-13
🟢   LoginPage.tsx 100 100 100 100
🔴  src/pages/NotFoundPage 0 100 0 0
🔴   NotFoundPage.tsx 0 100 0 0 2
🔴  src/pages/Organization/EditOrganizationPage 0 100 0 0
🔴   EditOrganizationPage.tsx 0 100 0 0 7-8
🔴  src/pages/Organization/NewOrganizationPage 0 100 0 0
🔴   NewOrganizationPage.tsx 0 100 0 0 3-4
🔴  src/pages/Organization/OrganizationPage 0 100 0 0
🔴   OrganizationPage.tsx 0 100 0 0 7-8
🔴  src/pages/Organization/OrganizationsPage 0 100 0 0
🔴   OrganizationsPage.tsx 0 100 0 0 7-8
🟡  src/pages/ReportingPeriodsPage 50 100 100 50
🔴   ReportingPeriodsPage.stories.tsx 0 100 100 0 5-13
🟢   ReportingPeriodsPage.tsx 100 100 100 100
🔴  src/pages/Upload/EditUploadPage 0 100 0 0
🔴   EditUploadPage.tsx 0 100 0 0 7-8
🔴  src/pages/Upload/NewUploadPage 0 100 0 0
🔴   NewUploadPage.tsx 0 100 0 0 3-4
🔴  src/pages/Upload/UploadPage 0 100 0 0
🔴   UploadPage.tsx 0 100 0 0 7-8
🔴  src/pages/Upload/UploadsPage 0 100 0 0
🔴   UploadsPage.tsx 0 100 0 0 7-8
🟡  src/pages/UploadTemplatePage 50 100 50 50
🔴   UploadTemplatePage.stories.tsx 0 100 100 0 5-13
🟡   UploadTemplatePage.tsx 75 100 50 75 9
🔴  src/pages/User/EditUserPage 0 100 0 0
🔴   EditUserPage.tsx 0 100 0 0 7-8
🔴  src/pages/User/NewUserPage 0 100 0 0
🔴   NewUserPage.tsx 0 100 0 0 3-4
🔴  src/pages/User/UserPage 0 100 0 0
🔴   UserPage.tsx 0 100 0 0 7-8
🔴  src/pages/User/UsersPage 0 100 0 0
🔴   UsersPage.tsx 0 100 0 0 7-11
🔴  src/utils 0 0 0 0
🔴   index.ts 0 0 0 0 3-37

Pusher: @Vikariusu, Action: pull_request_target, Workflow: Continuous Integration

Copy link

github-actions bot commented Dec 29, 2023

Terraform Summary

Step Result
🖌 Terraform Format & Style
⚙️ Terraform Initialization
🤖 Terraform Validation
📖 Terraform Plan

Hint: If "Terraform Format & Style" failed, run terraform fmt -recursive from the terraform/ directory and commit the results.

Output

Validation Output
Success! The configuration is valid.


Plan Output
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+   create
  ~ update in-place
-   destroy
-/+ destroy and then create replacement
+/- create replacement and then destroy

Terraform will perform the following actions:

  # aws_ecs_service.console will be updated in-place
  ~ resource "aws_ecs_service" "console" {
        id                                 = "arn:aws:ecs:us-west-2:357150818708:service/cpfreporter/cpfreporter-console"
        name                               = "cpfreporter-console"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-west-2:357150818708:task-definition/cpfreporter-console:35" -> (known after apply)
        # (15 unchanged attributes hidden)

        # (3 unchanged blocks hidden)
    }

  # aws_ecs_task_definition.console must be replaced
+/- resource "aws_ecs_task_definition" "console" {
      ~ arn                      = "arn:aws:ecs:us-west-2:357150818708:task-definition/cpfreporter-console:35" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-west-2:357150818708:task-definition/cpfreporter-console" -> (known after apply)
      ~ container_definitions    = (sensitive value) # forces replacement
      ~ id                       = "cpfreporter-console" -> (known after apply)
      ~ revision                 = 35 -> (known after apply)
-       tags                     = {} -> null
        # (9 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

  # aws_s3_object.lambda_artifact-cpfValidation must be replaced
-/+ resource "aws_s3_object" "lambda_artifact-cpfValidation" {
+       acl                    = (known after apply)
      ~ bucket_key_enabled     = false -> (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
      ~ content_type           = "binary/octet-stream" -> (known after apply)
      ~ etag                   = "eae6e9031bd39a0c2adceca7cf999cad-5" -> "33197d2b5c1fd56ba250eb5e465a0c4b"
      ~ id                     = "cpfValidation.04a1fc0c62a2d3a73d69887cbac0b8cb.zip" -> (known after apply)
      ~ key                    = "cpfValidation.04a1fc0c62a2d3a73d69887cbac0b8cb.zip" -> "cpfValidation.33197d2b5c1fd56ba250eb5e465a0c4b.zip" # forces replacement
+       kms_key_id             = (known after apply)
-       metadata               = {} -> null
      ~ source_hash            = "04a1fc0c62a2d3a73d69887cbac0b8cb" -> "33197d2b5c1fd56ba250eb5e465a0c4b"
      ~ storage_class          = "STANDARD" -> (known after apply)
-       tags                   = {} -> null
      ~ version_id             = "II8cEMlipelf0OKLOZV.hk9jwZG5lM._" -> (known after apply)
        # (5 unchanged attributes hidden)
    }

  # aws_s3_object.lambda_artifact-excelToJson must be replaced
-/+ resource "aws_s3_object" "lambda_artifact-excelToJson" {
+       acl                    = (known after apply)
      ~ bucket_key_enabled     = false -> (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
      ~ content_type           = "binary/octet-stream" -> (known after apply)
      ~ etag                   = "41ce91252ab8d3546fb5905ff561b7c4-6" -> "a353743c6db71a81967ec6cbdfe9b209"
      ~ id                     = "excelToJson.20739793d622992f3eae2ba77a6afbb0.zip" -> (known after apply)
      ~ key                    = "excelToJson.20739793d622992f3eae2ba77a6afbb0.zip" -> "excelToJson.a353743c6db71a81967ec6cbdfe9b209.zip" # forces replacement
+       kms_key_id             = (known after apply)
-       metadata               = {} -> null
      ~ source_hash            = "20739793d622992f3eae2ba77a6afbb0" -> "a353743c6db71a81967ec6cbdfe9b209"
      ~ storage_class          = "STANDARD" -> (known after apply)
-       tags                   = {} -> null
      ~ version_id             = "bV8dY0g8EiCsgEkIQdsAfKvx.pH3EIE5" -> (known after apply)
        # (5 unchanged attributes hidden)
    }

  # aws_s3_object.lambda_artifact-graphql must be replaced
+/- resource "aws_s3_object" "lambda_artifact-graphql" {
+       acl                    = (known after apply)
      ~ bucket_key_enabled     = false -> (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
      ~ content_type           = "binary/octet-stream" -> (known after apply)
      ~ etag                   = "4d9b7d28d657997f080fe7e419364fa7-6" -> "9d7eed5e0daf13beb5c9b4716cacf80c"
      ~ id                     = "graphql.8b5829391343440b34a2fc994a862af7.zip" -> (known after apply)
      ~ key                    = "graphql.8b5829391343440b34a2fc994a862af7.zip" -> "graphql.9d7eed5e0daf13beb5c9b4716cacf80c.zip" # forces replacement
+       kms_key_id             = (known after apply)
-       metadata               = {} -> null
      ~ source_hash            = "8b5829391343440b34a2fc994a862af7" -> "9d7eed5e0daf13beb5c9b4716cacf80c"
      ~ storage_class          = "STANDARD" -> (known after apply)
-       tags                   = {} -> null
      ~ version_id             = "trl0mcruuwEl6GFJ7XwuxitLVN4SYgOV" -> (known after apply)
        # (5 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["200.html"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "fa184afef55e9ddf3f4965ab9600c81a" -> "f76b8fd22d9e5aedced53332ed09ba49"
        id                     = "dist/200.html"
      ~ source_hash            = "fa184afef55e9ddf3f4965ab9600c81a" -> "f76b8fd22d9e5aedced53332ed09ba49"
        tags                   = {}
      ~ version_id             = "c2lcIwO3sccK8DAxspe1ZBfJ_2mXBbwV" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["build-manifest.json"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "46f4ef04b9184c59dcfa62a977562644" -> "952f0bed8a036823af79366296b545ea"
        id                     = "dist/build-manifest.json"
      ~ source_hash            = "46f4ef04b9184c59dcfa62a977562644" -> "952f0bed8a036823af79366296b545ea"
        tags                   = {}
      ~ version_id             = "0Odxckk.oBG.mmicGtauSvOWWVXd811T" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["chunk-references.json"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "b47535293641f90695f46b6cdc6f7e61" -> "0c35ebf227b5f35045d6202e41e55da6"
        id                     = "dist/chunk-references.json"
      ~ source_hash            = "b47535293641f90695f46b6cdc6f7e61" -> "0c35ebf227b5f35045d6202e41e55da6"
        tags                   = {}
      ~ version_id             = "p9LgTQ1PuxVKkmTGdZQJixVDT_PAgW9M" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["index.html"] will be updated in-place
  ~ resource "aws_s3_object" "origin_dist_artifact" {
      ~ etag                   = "fa184afef55e9ddf3f4965ab9600c81a" -> "f76b8fd22d9e5aedced53332ed09ba49"
        id                     = "dist/index.html"
      ~ source_hash            = "fa184afef55e9ddf3f4965ab9600c81a" -> "f76b8fd22d9e5aedced53332ed09ba49"
        tags                   = {}
      ~ version_id             = "rdpye57kt4Alloj.K5UIHrC2YVlKexYY" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["static/js/347.4f3d7466.chunk.js"] will be destroyed
  # (because key ["static/js/347.4f3d7466.chunk.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "155660514d5976f6873b2d5ff23e94b0" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/347.4f3d7466.chunk.js" -> null
-       key                    = "dist/static/js/347.4f3d7466.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/347.4f3d7466.chunk.js" -> null
-       source_hash            = "155660514d5976f6873b2d5ff23e94b0" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "PgTbiQmhK80GWgl6sKco4z2lOPWsg7nJ" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/347.4f3d7466.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/347.4f3d7466.chunk.js.LICENSE.txt"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/plain" -> null
-       etag                   = "67b5d8eb6b889161bd650a4d023e825c" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/347.4f3d7466.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/347.4f3d7466.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/347.4f3d7466.chunk.js.LICENSE.txt" -> null
-       source_hash            = "67b5d8eb6b889161bd650a4d023e825c" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "ly5FhR9lP1Tnbe8h_ZfrhcOcgDozfYem" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/347.cb7a3d10.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "f0b3bf96733331e45b9c3c98071634ae"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/347.cb7a3d10.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/347.cb7a3d10.chunk.js"
+       source_hash            = "f0b3bf96733331e45b9c3c98071634ae"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/347.cb7a3d10.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "67b5d8eb6b889161bd650a4d023e825c"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/347.cb7a3d10.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/347.cb7a3d10.chunk.js.LICENSE.txt"
+       source_hash            = "67b5d8eb6b889161bd650a4d023e825c"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyAgenciesPage.90843d4e.chunk.js"] will be destroyed
  # (because key ["static/js/AgencyAgenciesPage.90843d4e.chunk.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "7332d47cb0345623fc16ec92df33e5aa" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/AgencyAgenciesPage.90843d4e.chunk.js" -> null
-       key                    = "dist/static/js/AgencyAgenciesPage.90843d4e.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyAgenciesPage.90843d4e.chunk.js" -> null
-       source_hash            = "7332d47cb0345623fc16ec92df33e5aa" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "re6Fh_sP0OoGruZBIyLBtnxmmdvdMGpf" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyAgenciesPage.90843d4e.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/AgencyAgenciesPage.90843d4e.chunk.js.LICENSE.txt"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/plain" -> null
-       etag                   = "55d3003fc652eef3fccd962d62d4f328" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/AgencyAgenciesPage.90843d4e.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/AgencyAgenciesPage.90843d4e.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyAgenciesPage.90843d4e.chunk.js.LICENSE.txt" -> null
-       source_hash            = "55d3003fc652eef3fccd962d62d4f328" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "OvGyAd1cPbnBzhLyUNfH9nI6P6Lv3Xv." -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyAgenciesPage.fbaaf820.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "84030d4286604cc8ac79fc81bfb10085"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/AgencyAgenciesPage.fbaaf820.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyAgenciesPage.fbaaf820.chunk.js"
+       source_hash            = "84030d4286604cc8ac79fc81bfb10085"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyAgenciesPage.fbaaf820.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "55d3003fc652eef3fccd962d62d4f328"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/AgencyAgenciesPage.fbaaf820.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyAgenciesPage.fbaaf820.chunk.js.LICENSE.txt"
+       source_hash            = "55d3003fc652eef3fccd962d62d4f328"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/ForbiddenPage.cc985d61.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "1075062437fd06eaca2f7193cdc26779"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/ForbiddenPage.cc985d61.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/ForbiddenPage.cc985d61.chunk.js"
+       source_hash            = "1075062437fd06eaca2f7193cdc26779"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/ForbiddenPage.cc985d61.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "21962cae04ec342211f86142d0f0e5b2"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/ForbiddenPage.cc985d61.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/ForbiddenPage.cc985d61.chunk.js.LICENSE.txt"
+       source_hash            = "21962cae04ec342211f86142d0f0e5b2"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationEditOrganizationPage.4e3a30de.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "f4318de1ca1d8469a0dc37ed3db674bd"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/OrganizationEditOrganizationPage.4e3a30de.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationEditOrganizationPage.4e3a30de.chunk.js"
+       source_hash            = "f4318de1ca1d8469a0dc37ed3db674bd"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationEditOrganizationPage.4e3a30de.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "9a56729e133a208ed282910883d0a78d"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/OrganizationEditOrganizationPage.4e3a30de.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationEditOrganizationPage.4e3a30de.chunk.js.LICENSE.txt"
+       source_hash            = "9a56729e133a208ed282910883d0a78d"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationEditOrganizationPage.54afd531.chunk.js"] will be destroyed
  # (because key ["static/js/OrganizationEditOrganizationPage.54afd531.chunk.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "ed744eeae4e8a781269a95b38a33a4f2" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/OrganizationEditOrganizationPage.54afd531.chunk.js" -> null
-       key                    = "dist/static/js/OrganizationEditOrganizationPage.54afd531.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationEditOrganizationPage.54afd531.chunk.js" -> null
-       source_hash            = "ed744eeae4e8a781269a95b38a33a4f2" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "R.mSoUehSgfNJ716befS_wxcToH9CUSS" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationEditOrganizationPage.54afd531.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/OrganizationEditOrganizationPage.54afd531.chunk.js.LICENSE.txt"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/plain" -> null
-       etag                   = "8a0b38f7baa36897e72772f56e87a38f" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/OrganizationEditOrganizationPage.54afd531.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/OrganizationEditOrganizationPage.54afd531.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationEditOrganizationPage.54afd531.chunk.js.LICENSE.txt" -> null
-       source_hash            = "8a0b38f7baa36897e72772f56e87a38f" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "tnSz8kGJaBLjZaV.kzEXkb7bFki_DjCm" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationNewOrganizationPage.60348362.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "37dd257392d9ebb542a01f2315328205"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/OrganizationNewOrganizationPage.60348362.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationNewOrganizationPage.60348362.chunk.js"
+       source_hash            = "37dd257392d9ebb542a01f2315328205"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationNewOrganizationPage.60348362.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "1fe4b797c311fc06fda04e671fb6a084"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/OrganizationNewOrganizationPage.60348362.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationNewOrganizationPage.60348362.chunk.js.LICENSE.txt"
+       source_hash            = "1fe4b797c311fc06fda04e671fb6a084"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js"] will be destroyed
  # (because key ["static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "7418fcbef4a3521e97e10eb4b11a1bcb" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js" -> null
-       key                    = "dist/static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js" -> null
-       source_hash            = "7418fcbef4a3521e97e10eb4b11a1bcb" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "LPFeY9iycuOQA0kokcGN8639CUX0JcHn" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js.LICENSE.txt"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/plain" -> null
-       etag                   = "2a1e1a838077413f775b16b619b654f8" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationNewOrganizationPage.dbb40664.chunk.js.LICENSE.txt" -> null
-       source_hash            = "2a1e1a838077413f775b16b619b654f8" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "x0S.0rI15FzXxSQuAZPMTSjY0NHdb7bb" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationOrganizationsPage.07f257d5.chunk.js"] will be destroyed
  # (because key ["static/js/OrganizationOrganizationsPage.07f257d5.chunk.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "a141f1480467875e0c668e60ee663952" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/OrganizationOrganizationsPage.07f257d5.chunk.js" -> null
-       key                    = "dist/static/js/OrganizationOrganizationsPage.07f257d5.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationOrganizationsPage.07f257d5.chunk.js" -> null
-       source_hash            = "a141f1480467875e0c668e60ee663952" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "q_EP7c59keebqyTwMYRiu_AC7Td8_B3J" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationOrganizationsPage.07f257d5.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/OrganizationOrganizationsPage.07f257d5.chunk.js.LICENSE.txt"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/plain" -> null
-       etag                   = "ed5f295167ceab5c497248391619c11e" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/OrganizationOrganizationsPage.07f257d5.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/OrganizationOrganizationsPage.07f257d5.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationOrganizationsPage.07f257d5.chunk.js.LICENSE.txt" -> null
-       source_hash            = "ed5f295167ceab5c497248391619c11e" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "NDTOphyvKrhcDnz5mPa64pqa1NTPE1nn" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationOrganizationsPage.fae94ddf.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "6c9c4c2c1b33f5e660b6c7ad97bc8ef4"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/OrganizationOrganizationsPage.fae94ddf.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationOrganizationsPage.fae94ddf.chunk.js"
+       source_hash            = "6c9c4c2c1b33f5e660b6c7ad97bc8ef4"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/OrganizationOrganizationsPage.fae94ddf.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "ed5f295167ceab5c497248391619c11e"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/OrganizationOrganizationsPage.fae94ddf.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/OrganizationOrganizationsPage.fae94ddf.chunk.js.LICENSE.txt"
+       source_hash            = "ed5f295167ceab5c497248391619c11e"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/UploadUploadPage.05487ca5.chunk.js"] will be destroyed
  # (because key ["static/js/UploadUploadPage.05487ca5.chunk.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "eb01a0c4172ceedbf075eea6313db8a7" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UploadUploadPage.05487ca5.chunk.js" -> null
-       key                    = "dist/static/js/UploadUploadPage.05487ca5.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UploadUploadPage.05487ca5.chunk.js" -> null
-       source_hash            = "eb01a0c4172ceedbf075eea6313db8a7" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "qKepxZVDZN2IdM5VEnBUOyLTm9CDRu_G" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UploadUploadPage.05487ca5.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/UploadUploadPage.05487ca5.chunk.js.LICENSE.txt"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/plain" -> null
-       etag                   = "4b28630de6bdf18c74380d0d9f1a0ec2" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UploadUploadPage.05487ca5.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/UploadUploadPage.05487ca5.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UploadUploadPage.05487ca5.chunk.js.LICENSE.txt" -> null
-       source_hash            = "4b28630de6bdf18c74380d0d9f1a0ec2" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "F2MgaPudKFkxgTVN1CNQRxQBc81_MwN2" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UploadUploadPage.b3248455.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "9dede4c921c7c257de3afbba85d43add"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UploadUploadPage.b3248455.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UploadUploadPage.b3248455.chunk.js"
+       source_hash            = "9dede4c921c7c257de3afbba85d43add"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/UploadUploadPage.b3248455.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "4b28630de6bdf18c74380d0d9f1a0ec2"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UploadUploadPage.b3248455.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UploadUploadPage.b3248455.chunk.js.LICENSE.txt"
+       source_hash            = "4b28630de6bdf18c74380d0d9f1a0ec2"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserEditUserPage.c5808a6d.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "2e2e55545218b8ee143430ec8f7238c9"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserEditUserPage.c5808a6d.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserEditUserPage.c5808a6d.chunk.js"
+       source_hash            = "2e2e55545218b8ee143430ec8f7238c9"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserEditUserPage.c5808a6d.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "ff55400ddd5e70bd6f6876d992e0d673"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserEditUserPage.c5808a6d.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserEditUserPage.c5808a6d.chunk.js.LICENSE.txt"
+       source_hash            = "ff55400ddd5e70bd6f6876d992e0d673"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserEditUserPage.e889e786.chunk.js"] will be destroyed
  # (because key ["static/js/UserEditUserPage.e889e786.chunk.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "0a71864f0ba9f89ddb4b601ce7ce431f" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserEditUserPage.e889e786.chunk.js" -> null
-       key                    = "dist/static/js/UserEditUserPage.e889e786.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserEditUserPage.e889e786.chunk.js" -> null
-       source_hash            = "0a71864f0ba9f89ddb4b601ce7ce431f" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "40gp2vFea81MBnURAXfQqcNM2Zk6B9JQ" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserEditUserPage.e889e786.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/UserEditUserPage.e889e786.chunk.js.LICENSE.txt"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/plain" -> null
-       etag                   = "ff55400ddd5e70bd6f6876d992e0d673" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserEditUserPage.e889e786.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/UserEditUserPage.e889e786.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserEditUserPage.e889e786.chunk.js.LICENSE.txt" -> null
-       source_hash            = "ff55400ddd5e70bd6f6876d992e0d673" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "M.VQ3DHaGKvf0bBHT317faDWpEbx8Z1d" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserUserPage.1a9d80b4.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "1653f39992943266cbdc628086e3c7c5"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserUserPage.1a9d80b4.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserUserPage.1a9d80b4.chunk.js"
+       source_hash            = "1653f39992943266cbdc628086e3c7c5"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserUserPage.1a9d80b4.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "1759e5d7fb4b61a7afc4291ec777e7f1"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserUserPage.1a9d80b4.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserUserPage.1a9d80b4.chunk.js.LICENSE.txt"
+       source_hash            = "1759e5d7fb4b61a7afc4291ec777e7f1"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserUserPage.c58eb147.chunk.js"] will be destroyed
  # (because key ["static/js/UserUserPage.c58eb147.chunk.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "c55c32243d6be0c15ce2b198aa487dbc" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserUserPage.c58eb147.chunk.js" -> null
-       key                    = "dist/static/js/UserUserPage.c58eb147.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserUserPage.c58eb147.chunk.js" -> null
-       source_hash            = "c55c32243d6be0c15ce2b198aa487dbc" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "X0PmwlAsoPzSY9lxJnLkrjjDdPZGMyOA" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserUserPage.c58eb147.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/UserUserPage.c58eb147.chunk.js.LICENSE.txt"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/plain" -> null
-       etag                   = "1759e5d7fb4b61a7afc4291ec777e7f1" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserUserPage.c58eb147.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/UserUserPage.c58eb147.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserUserPage.c58eb147.chunk.js.LICENSE.txt" -> null
-       source_hash            = "1759e5d7fb4b61a7afc4291ec777e7f1" -> null
-       storage_class          = "STANDARD" -> null
-       tags                   = {} -> null
-       tags_all               = {
-           "env"        = "staging"
-           "management" = "terraform"
-           "owner"      = "grants"
-           "repo"       = "cpf-reporter"
-           "service"    = "cpf-reporter"
-           "usage"      = "workload"
        } -> null
-       version_id             = "YIITFhGQJ4ULgNUSh_r._07zOBYVZkjT" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserUsersPage.0366ba4d.chunk.js"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/javascript"
+       etag                   = "a95cdc852db3b11b2bdc7a9791880c43"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserUsersPage.0366ba4d.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserUsersPage.0366ba4d.chunk.js"
+       source_hash            = "a95cdc852db3b11b2bdc7a9791880c43"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserUsersPage.0366ba4d.chunk.js.LICENSE.txt"] will be created
+   resource "aws_s3_object" "origin_dist_artifact" {
+       acl                    = (known after apply)
+       bucket                 = "cpfreporter-origin-357150818708-us-west-2"
+       bucket_key_enabled     = (known after apply)
+       checksum_crc32         = (known after apply)
+       checksum_crc32c        = (known after apply)
+       checksum_sha1          = (known after apply)
+       checksum_sha256        = (known after apply)
+       content_type           = "text/plain"
+       etag                   = "c6fdde5760bf5d008d4ac72ddd13b210"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserUsersPage.0366ba4d.chunk.js.LICENSE.txt"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserUsersPage.0366ba4d.chunk.js.LICENSE.txt"
+       source_hash            = "c6fdde5760bf5d008d4ac72ddd13b210"
+       storage_class          = (known after apply)
+       tags_all               = {
+           "env"        = "staging"
+           "management" = "terraform"
+           "owner"      = "grants"
+           "repo"       = "cpf-reporter"
+           "service"    = "cpf-reporter"
+           "usage"      = "workload"
        }
+       version_id             = (known after apply)
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserUsersPage.c902b70c.chunk.js"] will be destroyed
  # (because key ["static/js/UserUsersPage.c902b70c.chunk.js"] is not in for_each map)
-   resource "aws_s3_object" "origin_dist_artifact" {
-       bucket                 = "cpfreporter-origin-357150818708-us-west-2" -> null
-       bucket_key_enabled     = false -> null
-       content_type           = "text/javascript" -> null
-       etag                   = "5543d6057426504a7b25c25a97e1b878" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserUsersPage.c902b70c.chunk.js" -> null
-...*[Comment body truncated]*

@as1729
Copy link
Contributor

as1729 commented Jan 3, 2024

Can user have more than one role? Which format will be used?

User can only have one role.

If user can only have one role (like the database is currently set up), is there a need for Role to be a separate model and not an Enum?

Good point. If the implementation is easier, then lets opt to keeping this as an enum on the users table.

The Lucid chart currently mentions 3 different user roles, written in snake case (like usdr_admin). Is that the convention we'll be using going forward? Currently I'm using usdr-admin.

No preference here. usdr-admin or usdr_admin are equally acceptable.

When creating a new admin user for the organization, what is the type of the admin that the user should have? Lucid chart lists organization_admin role for example, is this the role that should be assigned?

Yes, for all users the role should organization_admin however, for USDR users, we will manually write a script that creates them.

@Vikariusu Vikariusu marked this pull request as ready for review January 4, 2024 16:29
@Vikariusu
Copy link
Contributor Author

Made a few changes after talking to @as1729

  1. Removed the Role model and replaced it with an enum. Enums are commonly written in uppercase letters (e.g. USDR_ADMIN), which is the convention I've followed.
  2. Kept the hardcoded roles array in getCurrentUser() but changed the string that we're passing to match the enum formatting.
  3. Updated the user adding/editing forms to use a select input for the Role field, replacing the previous text field for Role ID.
  4. Used an existing formatEnum() function to change how we display user.role on the frontend (eg. ORGANIZATION_ADMIN to Organization admin )
  5. Replaced instances of the term 'Team' with 'Organization' in labels for consistency.

Copy link
Contributor

@dysmento dysmento left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@Vikariusu Vikariusu merged commit 4aa88b5 into main Jan 12, 2024
19 checks passed
@Vikariusu Vikariusu deleted the feature/CPF-56-organization-creation-by-usdr-admins branch January 12, 2024 17:34
@Vikariusu Vikariusu mentioned this pull request Jan 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants