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

Adds ability for developers to authenticate users in the local environment #108

Merged
merged 21 commits into from
Mar 1, 2024

Conversation

as1729
Copy link
Contributor

@as1729 as1729 commented Feb 14, 2024

Context

With the implementation of Passage we are introducing a dependence on a third-party service to manage user-authentication. This can pose a challenge for local development if every developer needs to sign-up to get API-keys etc.
This PR ensures that in the local environment developers have the ability to authenticate a user merely by providing an email address of a valid user.

How does the flow of data work?

  1. LoginPage front-end component renders the appropriate page depending on whether the environment's auth-provider is local | custom-auth | passage. Note: custom-auth will be deprecated once passage is implemented.
image image
  1. web/src/auth.ts instantiates the correct auth implementation client based on the same AUTH_PROVIDER environment variable.

  2. The Auth client makes requests to localhost:8911/localAuth which is a new endpoint served by api/src/functions/localAuth/localAuth.ts function.

  3. The localAuth.ts handler verifies the request and looks for the user-email submitted and checks whether a user with that email exists in the database. If the user is not found it sends a 4xx code or sends the user-object back in the 200 response.

  4. The front-end stores the email the local_auth_token key of localStorage. This will then be passed in as part of the header in subsequent localhost:8911/graphql requests as Authorization: Bearer ${localStorage.local_auth_token}

  5. The createGraphQLHandler then passes this information to the getCurrentUser function in api/src/lib/auth which does a similar check as Step 4 and passes back the user that is tied to the token passed in the Authorization header.

Testing

  1. Ensure the database is seeded with the latest users added in this PR.
  2. Ensure that the AUTH_PROVIDER environment variable is set to local and the app has restarted since changing this variable.
  3. Navigate to localhost:8910/login
  4. Verify that [email protected] redirects back to the login page.
  5. Verify that [email protected] successfully redirects to localhost:8910/
  6. Verify that hitting Logout on the top right redirects back to /login
  7. Verify that going to root / redirects back to /login since no user is logged in

Copy link

github-actions bot commented Feb 14, 2024

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 22.6 3.14 30.56 22.99
🟢  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
🔴   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 5.09 2.22 6.66 5.22
🔴   auth.ts 18.91 9.67 25 20 45-51,83-111,130,134-169
🔴   aws.ts 27.02 12.5 18.18 27.02 46-51,67-99,126-167,180
🟢   constants.ts 100 100 100 100
🔴   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 66.66 100 45.45 66.66
🟢   reportingPeriods.scenarios.ts 100 100 100 100
🟡   reportingPeriods.ts 64.7 100 45.45 64.7 43-66
🟢  services/subrecipients 85.71 100 71.42 85.71
🟢   subrecipients.scenarios.ts 100 100 100 100
🟢   subrecipients.ts 84.61 100 71.42 84.61 47-52
🔴  services/uploadValidations 0 100 0 0
🔴   uploadValidations.scenarios.ts 0 100 100 0 5
🔴   uploadValidations.ts 0 100 0 0 9-66
🟡  services/uploads 66.66 100 41.66 66.66
🟢   uploads.scenarios.ts 100 100 100 100
🟡   uploads.ts 65 100 41.66 65 49-69
🟡  services/users 62.16 25 63.63 62.16
🟢   users.scenarios.ts 100 100 100 100
🟡   users.ts 60 25 60 60 39-46,53,62,69,88-96,102-108
Coverage report for web suite
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🔴 All files 13.36 13.83 11.23 12.67
🟢  api/src/lib 100 100 100 100
🟢   constants.ts 100 100 100 100
🔴  web/src 23.33 8.33 14.28 23.33
🔴   App.tsx 0 0 0 0 3-36
🟢   Routes.tsx 100 100 100 100
🔴   auth.ts 29.41 50 8.33 29.41 38-52,65-100
🔴   entry.client.tsx 0 0 100 0 10-22
🔴  web/src/auth 9.09 0 8.33 9.09
🔴   localAuth.ts 9.09 0 8.33 9.09 39-68,76-80
🔴  web/src/components/Agency/Agencies 0 100 0 0
🔴   Agencies.tsx 0 100 0 0 9-21
🔴  web/src/components/Agency/AgenciesCell 0 100 0 0
🔴   AgenciesCell.tsx 0 100 0 0 8-39
🔴  web/src/components/Agency/Agency 0 0 0 0
🔴   Agency.tsx 0 0 0 0 10-78
🔴  web/src/components/Agency/AgencyCell 0 100 0 0
🔴   AgencyCell.tsx 0 100 0 0 7-27
🔴  web/src/components/Agency/AgencyForm 0 0 0 0
🔴   AgencyForm.tsx 0 0 0 0 25-42
🔴  web/src/components/Agency/EditAgencyCell 0 100 0 0
🔴   EditAgencyCell.tsx 0 100 0 0 10-59
🔴  web/src/components/Agency/NewAgency 0 100 0 0
🔴   NewAgency.tsx 0 100 0 0 9-35
🟢  web/src/components/Navigation 100 66.66 100 100
🟢   Navigation.tsx 100 66.66 100 100 46-66
🔴  web/src/components/Organization/EditOrganizationCell 0 100 0 0
🔴   EditOrganizationCell.tsx 0 100 0 0 13-62
🔴  web/src/components/Organization/EditOrganizationForm 0 0 0 0
🔴   EditOrganizationForm.tsx 0 0 0 0 27-41
🔴  web/src/components/Organization/NewOrganization 0 100 0 0
🔴   NewOrganization.tsx 0 100 0 0 9-37
🔴  web/src/components/Organization/NewOrganizationForm 0 0 0 0
🔴   NewOrganizationForm.tsx 0 0 0 0 25-54
🔴  web/src/components/Organization/Organization 0 0 0 0
🔴   Organization.tsx 0 0 0 0 10-70
🔴  web/src/components/Organization/OrganizationCell 0 100 0 0
🔴   OrganizationCell.tsx 0 100 0 0 7-27
🔴  web/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
🔴  web/src/components/Organization/Organizations 0 100 0 0
🔴   Organizations.tsx 0 100 0 0 9-21
🔴  web/src/components/Organization/OrganizationsCell 0 100 0 0
🔴   OrganizationsCell.tsx 0 100 0 0 8-37
🔴  web/src/components/ReportingPeriod/EditReportingPeriodCell 0 100 0 0
🔴   EditReportingPeriodCell.tsx 0 100 0 0 13-82
🔴  web/src/components/ReportingPeriod/NewReportingPeriod 0 100 0 0
🔴   NewReportingPeriod.tsx 0 100 0 0 9-35
🔴  web/src/components/ReportingPeriod/ReportingPeriod 0 0 0 0
🔴   ReportingPeriod.tsx 0 0 0 0 12-117
🔴  web/src/components/ReportingPeriod/ReportingPeriodCell 0 100 0 0
🔴   ReportingPeriodCell.tsx 0 100 0 0 7-37
🔴  web/src/components/ReportingPeriod/ReportingPeriodForm 0 0 0 0
🔴   ReportingPeriodForm.tsx 0 0 0 0 19-44
🔴  web/src/components/ReportingPeriod/ReportingPeriods 0 0 0 0
🔴   ReportingPeriods.tsx 0 0 0 0 13-104
🔴  web/src/components/ReportingPeriod/ReportingPeriodsCell 0 100 0 0
🔴   ReportingPeriodsCell.tsx 0 100 0 0 8-47
🟡  web/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 66-69
🔴  web/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
🟡  web/src/components/TemplateUploadReportingPeriodCell 55 0 55.55 47.05
🟢   TemplateUploadReportingPeriodCell.mock.ts 100 100 100 100
🔴   TemplateUploadReportingPeriodCell.stories.tsx 0 0 0 0 11-37
🟢   TemplateUploadReportingPeriodCell.tsx 100 100 100 100
🔴  web/src/components/Upload/EditUploadCell 0 100 0 0
🔴   EditUploadCell.tsx 0 100 0 0 10-68
🔴  web/src/components/Upload/NewUpload 0 100 0 0
🔴   NewUpload.tsx 0 100 0 0 8-32
🔴  web/src/components/Upload/Upload 0 0 0 0
🔴   Upload.tsx 0 0 0 0 12-100
🔴  web/src/components/Upload/UploadCell 0 100 0 0
🔴   UploadCell.tsx 0 100 0 0 7-32
🔴  web/src/components/Upload/UploadForm 0 0 0 0
🔴   UploadForm.tsx 0 0 0 0 21-97
🔴  web/src/components/Upload/Uploads 0 0 0 0
🔴   Uploads.tsx 0 0 0 0 9-66
🔴   columns.tsx 0 0 0 0 7-62
🔴  web/src/components/Upload/UploadsCell 0 100 0 0
🔴   UploadsCell.tsx 0 100 0 0 8-53
🔴  web/src/components/User/EditUserCell 0 100 0 0
🔴   EditUserCell.tsx 0 100 0 0 10-58
🔴  web/src/components/User/NewUser 0 100 0 0
🔴   NewUser.tsx 0 100 0 0 9-32
🔴  web/src/components/User/User 0 0 0 0
🔴   User.tsx 0 0 0 0 10-94
🔴  web/src/components/User/UserCell 0 100 0 0
🔴   UserCell.tsx 0 100 0 0 7-30
🔴  web/src/components/User/UserForm 0 0 0 0
🔴   UserForm.tsx 0 0 0 0 28-202
🔴  web/src/components/User/Users 0 100 0 0
🔴   Users.tsx 0 100 0 0 9-24
🔴  web/src/components/User/UsersCell 0 100 0 0
🔴   UsersCell.tsx 0 100 0 0 8-44
🟡  web/src/layouts/AuthenticatedLayout 60 50 100 60
🔴   AuthenticatedLayout.stories.tsx 0 100 100 0 5-13
🟢   AuthenticatedLayout.tsx 100 50 100 100 24
🟢  web/src/lib 100 100 100 100
🟢   formatters.tsx 100 100 100 100
🟢   seeds.ts 100 100 100 100
🔴  web/src/pages/Agency/AgenciesPage 0 100 0 0
🔴   AgenciesPage.tsx 0 100 0 0 8-12
🔴  web/src/pages/Agency/AgencyPage 0 100 0 0
🔴   AgencyPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/Agency/EditAgencyPage 0 100 0 0
🔴   EditAgencyPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/Agency/NewAgencyPage 0 100 0 0
🔴   NewAgencyPage.tsx 0 100 0 0 3-4
🔴  web/src/pages/FatalErrorPage 0 0 0 0
🔴   FatalErrorPage.tsx 0 0 0 0 15
🟡  web/src/pages/ForbiddenPage 50 100 100 50
🔴   ForbiddenPage.stories.tsx 0 100 100 0 5-13
🟢   ForbiddenPage.tsx 100 100 100 100
🟡  web/src/pages/LoginPage 54.54 50 66.66 54.54
🔴   LoginPage.stories.tsx 0 100 100 0 5-13
🟡   LoginPage.tsx 66.66 50 66.66 66.66 19-22
🔴  web/src/pages/NotFoundPage 0 100 0 0
🔴   NotFoundPage.tsx 0 100 0 0 2
🔴  web/src/pages/Organization/EditOrganizationPage 0 100 0 0
🔴   EditOrganizationPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/Organization/NewOrganizationPage 0 100 0 0
🔴   NewOrganizationPage.tsx 0 100 0 0 3-4
🔴  web/src/pages/Organization/OrganizationPage 0 100 0 0
🔴   OrganizationPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/Organization/OrganizationsPage 0 100 0 0
🔴   OrganizationsPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/ReportingPeriod/EditReportingPeriodPage 0 100 0 0
🔴   EditReportingPeriodPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/ReportingPeriod/NewReportingPeriodPage 0 100 0 0
🔴   NewReportingPeriodPage.tsx 0 100 0 0 3-4
🔴  web/src/pages/ReportingPeriod/ReportingPeriodPage 0 100 0 0
🔴   ReportingPeriodPage.tsx 0 100 0 0 7-8
🟡  web/src/pages/ReportingPeriod/ReportingPeriodsPage 50 100 100 50
🔴   ReportingPeriodsPage.stories.tsx 0 100 100 0 5-13
🟢   ReportingPeriodsPage.tsx 100 100 100 100
🔴  web/src/pages/Upload/EditUploadPage 0 100 0 0
🔴   EditUploadPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/Upload/NewUploadPage 0 100 0 0
🔴   NewUploadPage.tsx 0 100 0 0 3-4
🔴  web/src/pages/Upload/UploadPage 0 100 0 0
🔴   UploadPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/Upload/UploadsPage 0 100 0 0
🔴   UploadsPage.tsx 0 100 0 0 7-8
🟡  web/src/pages/UploadTemplatePage 50 100 50 50
🔴   UploadTemplatePage.stories.tsx 0 100 100 0 5-13
🟡   UploadTemplatePage.tsx 75 100 50 75 9
🔴  web/src/pages/User/EditUserPage 0 100 0 0
🔴   EditUserPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/User/NewUserPage 0 100 0 0
🔴   NewUserPage.tsx 0 100 0 0 3-4
🔴  web/src/pages/User/UserPage 0 100 0 0
🔴   UserPage.tsx 0 100 0 0 7-8
🔴  web/src/pages/User/UsersPage 0 100 0 0
🔴   UsersPage.tsx 0 100 0 0 8-12
🔴  web/src/utils 0 0 0 0
🔴   index.ts 0 0 0 0 [3-37](https://github.com/usdigitalrespon...*[Comment body truncated]*

Copy link

github-actions bot commented Feb 14, 2024

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:51" -> (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:51" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-west-2:357150818708:task-definition/cpfreporter-console" -> (known after apply)
      ~ container_definitions    = jsonencode(
          ~ [
              ~ {
                  ~ image                  = "ghcr.io/usdigitalresponse/cpf-reporter-console@sha256:2d21ee84a85febfe90d2d6a53de877527f99c1ec667d85d2325c122c938731cc" -> "ghcr.io/usdigitalresponse/cpf-reporter-console@sha256:c67bea3b8c2b125afdd00a1c90e8333241c8a5973fb4c4386a8237cc56c98300"
-                   mountPoints            = []
                    name                   = "console"
-                   portMappings           = []
-                   systemControls         = []
-                   volumesFrom            = []
                    # (7 unchanged attributes hidden)
                },
            ] # forces replacement
        )
      ~ id                       = "cpfreporter-console" -> (known after apply)
      ~ revision                 = 51 -> (known after apply)
-       tags                     = {} -> null
        # (9 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

  # aws_s3_object.lambda_artifact-cpfValidation will be updated in-place
  ~ resource "aws_s3_object" "lambda_artifact-cpfValidation" {
      ~ etag                   = "c3faa07aa23dbaf9d25281622152bc55-5" -> "1e4683cb85e97d3200d97928196ea632"
        id                     = "cpfValidation.1e4683cb85e97d3200d97928196ea632.zip"
        tags                   = {}
      ~ version_id             = "nAgwvqMvX7BRCOyb8qq06ranHTFTzbGj" -> (known after apply)
        # (11 unchanged attributes hidden)
    }

  # aws_s3_object.lambda_artifact-excelToJson will be updated in-place
  ~ resource "aws_s3_object" "lambda_artifact-excelToJson" {
      ~ etag                   = "46bd4905044bdd17d1d04ca5c42f955f-6" -> "db2decf258f703af202a664d565cbcd6"
        id                     = "excelToJson.db2decf258f703af202a664d565cbcd6.zip"
        tags                   = {}
      ~ version_id             = "G5i_Wd24pz8oPu8vyCs_hZYauW0gRZ.i" -> (known after apply)
        # (11 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                   = "1aa6c6f3ffa0be6c5ab6901ed3d8cfd5-6" -> "e8bd53ecddb7e531c9a2ab7ddb98709f"
      ~ id                     = "graphql.b7c0d9335215f8f41b64860f2b9e98cf.zip" -> (known after apply)
      ~ key                    = "graphql.b7c0d9335215f8f41b64860f2b9e98cf.zip" -> "graphql.e8bd53ecddb7e531c9a2ab7ddb98709f.zip" # forces replacement
+       kms_key_id             = (known after apply)
-       metadata               = {} -> null
      ~ source_hash            = "b7c0d9335215f8f41b64860f2b9e98cf" -> "e8bd53ecddb7e531c9a2ab7ddb98709f"
      ~ storage_class          = "STANDARD" -> (known after apply)
-       tags                   = {} -> null
      ~ version_id             = "Ip6yqTvAjf025HUG3OIAOTHJNtqaWCXs" -> (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                   = "bc446b2ac400c86348aca2f5be96f6f1" -> "8e2d941391344bcab7e6b2d9f25c9adc"
        id                     = "dist/200.html"
      ~ source_hash            = "bc446b2ac400c86348aca2f5be96f6f1" -> "8e2d941391344bcab7e6b2d9f25c9adc"
        tags                   = {}
      ~ version_id             = "zKPKaONX81MBwzb8baZvMlxOlQwzQs6O" -> (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                   = "479b00fa34eb16c49865429e6848aff2" -> "9bf377b8b535c7e68273b3437f4c6e11"
        id                     = "dist/build-manifest.json"
      ~ source_hash            = "479b00fa34eb16c49865429e6848aff2" -> "9bf377b8b535c7e68273b3437f4c6e11"
        tags                   = {}
      ~ version_id             = "4gDtDI2mTQOXQshFI6TPsv9iBn3Q.aEq" -> (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                   = "81b7ff343dce623ffb190c5b1152f9fc" -> "94f081a63365905b2cd602ea71b8105f"
        id                     = "dist/chunk-references.json"
      ~ source_hash            = "81b7ff343dce623ffb190c5b1152f9fc" -> "94f081a63365905b2cd602ea71b8105f"
        tags                   = {}
      ~ version_id             = "5Ey2n1cHWBzJrIqVbevBc4rqJESxLzer" -> (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                   = "bc446b2ac400c86348aca2f5be96f6f1" -> "8e2d941391344bcab7e6b2d9f25c9adc"
        id                     = "dist/index.html"
      ~ source_hash            = "bc446b2ac400c86348aca2f5be96f6f1" -> "8e2d941391344bcab7e6b2d9f25c9adc"
        tags                   = {}
      ~ version_id             = "kV62qdVKCZqbjonymIXAvct2fz5Uv9PJ" -> (known after apply)
        # (10 unchanged attributes hidden)
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyAgenciesPage.66aff34e.chunk.js"] will be destroyed
  # (because key ["static/js/AgencyAgenciesPage.66aff34e.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                   = "c89670776769aaab8c506fc421e1a940" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/AgencyAgenciesPage.66aff34e.chunk.js" -> null
-       key                    = "dist/static/js/AgencyAgenciesPage.66aff34e.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyAgenciesPage.66aff34e.chunk.js" -> null
-       source_hash            = "c89670776769aaab8c506fc421e1a940" -> 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             = "Sd_pKZ53l4nCQUxY8ds2Ru2sy2k7cz5U" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyAgenciesPage.66aff34e.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/AgencyAgenciesPage.66aff34e.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.66aff34e.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/AgencyAgenciesPage.66aff34e.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.66aff34e.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             = "GCMCH09XwxgQ.NHlhiDIodJFWfYegEh_" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyAgenciesPage.d476831e.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                   = "94e8c5c9da4bb7eee23f8aee7189ad8d"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/AgencyAgenciesPage.d476831e.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.d476831e.chunk.js"
+       source_hash            = "94e8c5c9da4bb7eee23f8aee7189ad8d"
+       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.d476831e.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.d476831e.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.d476831e.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/AgencyEditAgencyPage.141ec034.chunk.js"] will be destroyed
  # (because key ["static/js/AgencyEditAgencyPage.141ec034.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                   = "c0e70b0c850bb33d1fa90fac69bbd5b3" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/AgencyEditAgencyPage.141ec034.chunk.js" -> null
-       key                    = "dist/static/js/AgencyEditAgencyPage.141ec034.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyEditAgencyPage.141ec034.chunk.js" -> null
-       source_hash            = "c0e70b0c850bb33d1fa90fac69bbd5b3" -> 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             = "rJCQgQgH0lKFBEGCtJtbxbLyfSBkXGaB" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyEditAgencyPage.141ec034.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/AgencyEditAgencyPage.141ec034.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                   = "4e11d0eec7753fcebe4544ba4612e69d" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/AgencyEditAgencyPage.141ec034.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/AgencyEditAgencyPage.141ec034.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyEditAgencyPage.141ec034.chunk.js.LICENSE.txt" -> null
-       source_hash            = "4e11d0eec7753fcebe4544ba4612e69d" -> 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             = "EyXmet3_UDgtbtFgj.F1e5iMBAvjWfuf" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyEditAgencyPage.15ee33fa.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                   = "43c598b1a024d9d02ddf16db3b98307c"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/AgencyEditAgencyPage.15ee33fa.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyEditAgencyPage.15ee33fa.chunk.js"
+       source_hash            = "43c598b1a024d9d02ddf16db3b98307c"
+       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/AgencyEditAgencyPage.15ee33fa.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                   = "4e11d0eec7753fcebe4544ba4612e69d"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/AgencyEditAgencyPage.15ee33fa.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/AgencyEditAgencyPage.15ee33fa.chunk.js.LICENSE.txt"
+       source_hash            = "4e11d0eec7753fcebe4544ba4612e69d"
+       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/AgencyNewAgencyPage.2d788207.chunk.js"] will be destroyed
  # (because key ["static/js/AgencyNewAgencyPage.2d788207.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                   = "4e8a7c41a91fcc059642be678d5418df" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/AgencyNewAgencyPage.2d788207.chunk.js" -> null
-       key                    = "dist/static/js/AgencyNewAgencyPage.2d788207.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyNewAgencyPage.2d788207.chunk.js" -> null
-       source_hash            = "4e8a7c41a91fcc059642be678d5418df" -> 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             = "huiDoy4fwTt8Dh2myXzrFB5bDjnAESs_" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyNewAgencyPage.2d788207.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/AgencyNewAgencyPage.2d788207.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                   = "16eb506bb04b8649c6a08c630eab671b" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/AgencyNewAgencyPage.2d788207.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/AgencyNewAgencyPage.2d788207.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyNewAgencyPage.2d788207.chunk.js.LICENSE.txt" -> null
-       source_hash            = "16eb506bb04b8649c6a08c630eab671b" -> 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             = "vnNy_NJZ22vKWR4lvPbTjfta5w5sU91f" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/AgencyNewAgencyPage.81b6daa8.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                   = "3411859ebcb21c8d168056519cbd5ed8"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/AgencyNewAgencyPage.81b6daa8.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/AgencyNewAgencyPage.81b6daa8.chunk.js"
+       source_hash            = "3411859ebcb21c8d168056519cbd5ed8"
+       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/AgencyNewAgencyPage.81b6daa8.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                   = "16eb506bb04b8649c6a08c630eab671b"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/AgencyNewAgencyPage.81b6daa8.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/AgencyNewAgencyPage.81b6daa8.chunk.js.LICENSE.txt"
+       source_hash            = "16eb506bb04b8649c6a08c630eab671b"
+       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/LoginPage.6d515f9d.chunk.js"] will be destroyed
  # (because key ["static/js/LoginPage.6d515f9d.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                   = "a6b36db5d237305f365a2ae2e9565ba9" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/LoginPage.6d515f9d.chunk.js" -> null
-       key                    = "dist/static/js/LoginPage.6d515f9d.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/LoginPage.6d515f9d.chunk.js" -> null
-       source_hash            = "a6b36db5d237305f365a2ae2e9565ba9" -> 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             = "jj9JYyrLrzbTK60PzV241jjX096y.bdd" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/LoginPage.6d515f9d.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/LoginPage.6d515f9d.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                   = "0cb98b03c5f49de681bca973ccc95978" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/LoginPage.6d515f9d.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/LoginPage.6d515f9d.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/LoginPage.6d515f9d.chunk.js.LICENSE.txt" -> null
-       source_hash            = "0cb98b03c5f49de681bca973ccc95978" -> 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             = "feqPSX6TbR710Zahl70XcNSYrN3piX6m" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/LoginPage.a7e97a69.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                   = "01530c51a535f3005fb80e8c706ee9de"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/LoginPage.a7e97a69.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/LoginPage.a7e97a69.chunk.js"
+       source_hash            = "01530c51a535f3005fb80e8c706ee9de"
+       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/LoginPage.a7e97a69.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                   = "f7acc4b4f3496e2aa6c4d47261fcb01c"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/LoginPage.a7e97a69.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/LoginPage.a7e97a69.chunk.js.LICENSE.txt"
+       source_hash            = "f7acc4b4f3496e2aa6c4d47261fcb01c"
+       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/UploadNewUploadPage.bed97733.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                   = "2acf787af5dd8fd9f456df7292b6ef2d"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UploadNewUploadPage.bed97733.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UploadNewUploadPage.bed97733.chunk.js"
+       source_hash            = "2acf787af5dd8fd9f456df7292b6ef2d"
+       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/UploadNewUploadPage.bed97733.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                   = "cc27fa172211f2877b50629ac7228a71"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UploadNewUploadPage.bed97733.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/UploadNewUploadPage.bed97733.chunk.js.LICENSE.txt"
+       source_hash            = "cc27fa172211f2877b50629ac7228a71"
+       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/UploadNewUploadPage.c1bfb54d.chunk.js"] will be destroyed
  # (because key ["static/js/UploadNewUploadPage.c1bfb54d.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                   = "77ffd8be9dd1b2f5f8dddae0a301303a" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UploadNewUploadPage.c1bfb54d.chunk.js" -> null
-       key                    = "dist/static/js/UploadNewUploadPage.c1bfb54d.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UploadNewUploadPage.c1bfb54d.chunk.js" -> null
-       source_hash            = "77ffd8be9dd1b2f5f8dddae0a301303a" -> 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             = "ZTFoYW6.yWAZMOWH1GXXlGPpVTkxDWfa" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UploadNewUploadPage.c1bfb54d.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/UploadNewUploadPage.c1bfb54d.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                   = "cc27fa172211f2877b50629ac7228a71" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UploadNewUploadPage.c1bfb54d.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/UploadNewUploadPage.c1bfb54d.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UploadNewUploadPage.c1bfb54d.chunk.js.LICENSE.txt" -> null
-       source_hash            = "cc27fa172211f2877b50629ac7228a71" -> 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             = "J7ukhliFiHZpjU6.Yk2kT_9hxjbLOFeU" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserEditUserPage.73cb0b0e.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                   = "90bc7a51ba853660efd913c994a8dfd2"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserEditUserPage.73cb0b0e.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.73cb0b0e.chunk.js"
+       source_hash            = "90bc7a51ba853660efd913c994a8dfd2"
+       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.73cb0b0e.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                   = "63401d07fb99a2c1ff4404567f6b3ec5"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserEditUserPage.73cb0b0e.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.73cb0b0e.chunk.js.LICENSE.txt"
+       source_hash            = "63401d07fb99a2c1ff4404567f6b3ec5"
+       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.940783cb.chunk.js"] will be destroyed
  # (because key ["static/js/UserEditUserPage.940783cb.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                   = "47daebe8befef780b94941fd05073a61" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserEditUserPage.940783cb.chunk.js" -> null
-       key                    = "dist/static/js/UserEditUserPage.940783cb.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserEditUserPage.940783cb.chunk.js" -> null
-       source_hash            = "47daebe8befef780b94941fd05073a61" -> 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             = "LHuN3gEOHqjubPyQQT4cpRhoZrUhS9lH" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserEditUserPage.940783cb.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/UserEditUserPage.940783cb.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                   = "63401d07fb99a2c1ff4404567f6b3ec5" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserEditUserPage.940783cb.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/UserEditUserPage.940783cb.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.940783cb.chunk.js.LICENSE.txt" -> null
-       source_hash            = "63401d07fb99a2c1ff4404567f6b3ec5" -> 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             = "zEGo3Txvy1hn3IxWRkPrEyD3yw1b51Nh" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserNewUserPage.6988a61a.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                   = "ebff79afa26679b041161de19a19225e"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserNewUserPage.6988a61a.chunk.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserNewUserPage.6988a61a.chunk.js"
+       source_hash            = "ebff79afa26679b041161de19a19225e"
+       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/UserNewUserPage.6988a61a.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                   = "8323bdf2524d967917b1d59b40ac09ac"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserNewUserPage.6988a61a.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/UserNewUserPage.6988a61a.chunk.js.LICENSE.txt"
+       source_hash            = "8323bdf2524d967917b1d59b40ac09ac"
+       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/UserNewUserPage.887f24f7.chunk.js"] will be destroyed
  # (because key ["static/js/UserNewUserPage.887f24f7.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                   = "caddef79342b116bc0c69580ad937c0d" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserNewUserPage.887f24f7.chunk.js" -> null
-       key                    = "dist/static/js/UserNewUserPage.887f24f7.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserNewUserPage.887f24f7.chunk.js" -> null
-       source_hash            = "caddef79342b116bc0c69580ad937c0d" -> 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             = "UdlshdLlArLVQXwiX914Y6cNqqDsdwld" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserNewUserPage.887f24f7.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/UserNewUserPage.887f24f7.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                   = "8323bdf2524d967917b1d59b40ac09ac" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserNewUserPage.887f24f7.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/UserNewUserPage.887f24f7.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserNewUserPage.887f24f7.chunk.js.LICENSE.txt" -> null
-       source_hash            = "8323bdf2524d967917b1d59b40ac09ac" -> 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             = "mas5IhW_W6fzOv3sgYsLk7EB7f.AumcP" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserUsersPage.16609d38.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                   = "6db2063a604b18e7b55e2dd15c2a173d"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/UserUsersPage.16609d38.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.16609d38.chunk.js"
+       source_hash            = "6db2063a604b18e7b55e2dd15c2a173d"
+       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.16609d38.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.16609d38.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.16609d38.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.3397dcad.chunk.js"] will be destroyed
  # (because key ["static/js/UserUsersPage.3397dcad.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                   = "9dcf7264fb9b1aa9ba16187b0df41617" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserUsersPage.3397dcad.chunk.js" -> null
-       key                    = "dist/static/js/UserUsersPage.3397dcad.chunk.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserUsersPage.3397dcad.chunk.js" -> null
-       source_hash            = "9dcf7264fb9b1aa9ba16187b0df41617" -> 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             = "lk9mJevsCUuZn44Em2v9MUGykeht9Drd" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/UserUsersPage.3397dcad.chunk.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/UserUsersPage.3397dcad.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                   = "c6fdde5760bf5d008d4ac72ddd13b210" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/UserUsersPage.3397dcad.chunk.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/UserUsersPage.3397dcad.chunk.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/UserUsersPage.3397dcad.chunk.js.LICENSE.txt" -> null
-       source_hash            = "c6fdde5760bf5d008d4ac72ddd13b210" -> 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             = "XqlfS3yo4AlF.99LOxQ5R89XLSxGF0VS" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/app.38202ff3.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                   = "49b58ecfec104f953c242172d53293bf"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/app.38202ff3.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/app.38202ff3.js"
+       source_hash            = "49b58ecfec104f953c242172d53293bf"
+       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/app.38202ff3.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                   = "b703266ba347d460c07ac79899e011fa"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/app.38202ff3.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/app.38202ff3.js.LICENSE.txt"
+       source_hash            = "b703266ba347d460c07ac79899e011fa"
+       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/app.97c927f8.js"] will be destroyed
  # (because key ["static/js/app.97c927f8.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                   = "a7685b0797eb9d2c0b073dc4ddcbd137" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/app.97c927f8.js" -> null
-       key                    = "dist/static/js/app.97c927f8.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/app.97c927f8.js" -> null
-       source_hash            = "a7685b0797eb9d2c0b073dc4ddcbd137" -> 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             = "jMHft7lRjONqUsPQW_bq41NRHb8G9LIA" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/app.97c927f8.js.LICENSE.txt"] will be destroyed
  # (because key ["static/js/app.97c927f8.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                   = "9806104531a6dc74425d37448a95fecc" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/app.97c927f8.js.LICENSE.txt" -> null
-       key                    = "dist/static/js/app.97c927f8.js.LICENSE.txt" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/app.97c927f8.js.LICENSE.txt" -> null
-       source_hash            = "9806104531a6dc74425d37448a95fecc" -> 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             = "ZSkHMCjSV4L0Uu4CxhX7HbQP1NYokZkD" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/runtime-app.431150e5.js"] will be destroyed
  # (because key ["static/js/runtime-app.431150e5.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                   = "dbf867edc0817b845435373ac70c548c" -> null
-       force_destroy          = false -> null
-       id                     = "dist/static/js/runtime-app.431150e5.js" -> null
-       key                    = "dist/static/js/runtime-app.431150e5.js" -> null
-       metadata               = {} -> null
-       server_side_encryption = "AES256" -> null
-       source                 = "/home/runner/work/cpf-reporter/cpf-reporter/web/dist/static/js/runtime-app.431150e5.js" -> null
-       source_hash            = "dbf867edc0817b845435373ac70c548c" -> 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             = "pfQDdAJJhG11TmrizJC9lwtPa.0tLY2Y" -> null
    }

  # aws_s3_object.origin_dist_artifact["static/js/runtime-app.e4e1bc01.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                   = "3da77b5968ae28dbb72b25b692b699c0"
+       force_destroy          = false
+       id                     = (known after apply)
+       key                    = "dist/static/js/runtime-app.e4e1bc01.js"
+       kms_key_id             = (known after apply)
+       server_side_encryption = "AES256"
+       source          ...*[Comment body truncated]*

Copy link
Member

@TylerHendrickson TylerHendrickson left a comment

Choose a reason for hiding this comment

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

A few preliminary suggestions. As discussed in Slack, I think it would be ideal to implement a "local auth" option using the minimal custom auth interface provided by Redwood. In addition to lowering complexity, I think it would more closely following the auth implementation that we'll use for Passage.

And just to add – if that doesn't seem feasible (since I'm admittedly only relying on "in theory it should work based on the docs" here), it would definitely be useful to better understand the caveats.

api/src/lib/auth.ts Outdated Show resolved Hide resolved
terraform/variables.tf Outdated Show resolved Hide resolved
web/src/auth/localAuth.ts Outdated Show resolved Hide resolved
web/src/auth/localAuth.ts Outdated Show resolved Hide resolved
web/src/auth/localAuth.ts Outdated Show resolved Hide resolved
scripts/seed.ts Fixed Show resolved Hide resolved
@as1729 as1729 enabled auto-merge (squash) March 1, 2024 19:22
Copy link
Member

@TylerHendrickson TylerHendrickson left a comment

Choose a reason for hiding this comment

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

Suggesting a few things to fix up. I'm also noticing a few issues when browsing, although they might be out of scope for this issue:

  1. Navigating to the /agencies route/tab throws an error because something is still looking for .organizationId where it doesn't exist.
  2. (When logged in as the usdr-admin@ user) I don't see the "Users" tab in the header menu. If I navigate to /users directly, I get the text "Access to this page is restricted."

scripts/seed.ts Outdated Show resolved Hide resolved
scripts/seed.ts Outdated Show resolved Hide resolved
scripts/seed.ts Outdated Show resolved Hide resolved
scripts/seed.ts Fixed Show resolved Hide resolved
scripts/seed.ts Outdated Show resolved Hide resolved
@as1729 as1729 requested a review from TylerHendrickson March 1, 2024 21:55
@as1729 as1729 merged commit 446939c into main Mar 1, 2024
19 checks passed
@as1729 as1729 deleted the as/add-local-auth-module branch March 1, 2024 22:20
@as1729 as1729 mentioned this pull request Mar 6, 2024
29 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants