main 9d72a781db91 cached
2379 files
4.4 MB
1.3M tokens
3173 symbols
1 requests
Download .txt
Showing preview only (5,185K chars total). Download the full file or copy to clipboard to get everything.
Repository: aws-samples/aws-serverless-saas-workshop
Branch: main
Commit: 9d72a781db91
Files: 2379
Total size: 4.4 MB

Directory structure:
gitextract_xdujmuk7/

├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cloud9Setup/
│   ├── .gitignore
│   ├── README.md
│   ├── increase-disk-size.sh
│   ├── pre-requisites-versions-check.sh
│   ├── pre-requisites.sh
│   └── samconfig.toml
├── LICENSE
├── LICENSE-SAMPLECODE
├── LICENSE-SUMMARY
├── Lab1/
│   ├── client/
│   │   └── Application/
│   │       ├── .browserslistrc
│   │       ├── .editorconfig
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── angular.json
│   │       ├── karma.conf.js
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── _nav.ts
│   │       │   │   ├── app-routing.module.ts
│   │       │   │   ├── app.component.scss
│   │       │   │   ├── app.component.ts
│   │       │   │   ├── app.module.ts
│   │       │   │   ├── models/
│   │       │   │   │   ├── index.ts
│   │       │   │   │   └── interfaces.ts
│   │       │   │   ├── nav/
│   │       │   │   │   ├── nav.component.html
│   │       │   │   │   ├── nav.component.scss
│   │       │   │   │   └── nav.component.ts
│   │       │   │   └── views/
│   │       │   │       ├── dashboard/
│   │       │   │       │   ├── dashboard-routing.module.ts
│   │       │   │       │   ├── dashboard.component.html
│   │       │   │       │   ├── dashboard.component.scss
│   │       │   │       │   ├── dashboard.component.ts
│   │       │   │       │   └── dashboard.module.ts
│   │       │   │       ├── orders/
│   │       │   │       │   ├── create/
│   │       │   │       │   │   ├── create.component.html
│   │       │   │       │   │   ├── create.component.scss
│   │       │   │       │   │   └── create.component.ts
│   │       │   │       │   ├── detail/
│   │       │   │       │   │   ├── detail.component.html
│   │       │   │       │   │   ├── detail.component.scss
│   │       │   │       │   │   └── detail.component.ts
│   │       │   │       │   ├── list/
│   │       │   │       │   │   ├── list.component.html
│   │       │   │       │   │   ├── list.component.scss
│   │       │   │       │   │   └── list.component.ts
│   │       │   │       │   ├── models/
│   │       │   │       │   │   ├── order.interface.ts
│   │       │   │       │   │   └── orderproduct.interface.ts
│   │       │   │       │   ├── orders-routing.module.ts
│   │       │   │       │   ├── orders.module.ts
│   │       │   │       │   └── orders.service.ts
│   │       │   │       └── products/
│   │       │   │           ├── create/
│   │       │   │           │   ├── create.component.html
│   │       │   │           │   ├── create.component.scss
│   │       │   │           │   └── create.component.ts
│   │       │   │           ├── edit/
│   │       │   │           │   ├── edit.component.html
│   │       │   │           │   ├── edit.component.scss
│   │       │   │           │   └── edit.component.ts
│   │       │   │           ├── list/
│   │       │   │           │   ├── list.component.html
│   │       │   │           │   ├── list.component.scss
│   │       │   │           │   └── list.component.ts
│   │       │   │           ├── models/
│   │       │   │           │   └── product.interface.ts
│   │       │   │           ├── product.service.ts
│   │       │   │           ├── products-routing.module.ts
│   │       │   │           └── products.module.ts
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   ├── custom-theme.scss
│   │       │   ├── environments/
│   │       │   │   ├── environment.prod.ts
│   │       │   │   └── environment.ts
│   │       │   ├── index.html
│   │       │   ├── main.ts
│   │       │   ├── polyfills.ts
│   │       │   ├── styles/
│   │       │   │   ├── _variables.scss
│   │       │   │   └── reset.scss
│   │       │   ├── styles.scss
│   │       │   └── test.ts
│   │       ├── tsconfig.app.json
│   │       ├── tsconfig.json
│   │       └── tsconfig.spec.json
│   ├── scripts/
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── layers/
│       │   ├── logger.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── samconfig.toml
│       └── template.yaml
├── Lab2/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── Landing/
│   │       ├── .browserslistrc
│   │       ├── .editorconfig
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── angular.json
│   │       ├── karma.conf.js
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── app-routing.module.ts
│   │       │   │   ├── app.component.scss
│   │       │   │   ├── app.component.ts
│   │       │   │   ├── app.module.ts
│   │       │   │   └── views/
│   │       │   │       ├── landing/
│   │       │   │       │   ├── landing.component.html
│   │       │   │       │   ├── landing.component.scss
│   │       │   │       │   └── landing.component.ts
│   │       │   │       └── register/
│   │       │   │           ├── register.component.html
│   │       │   │           ├── register.component.scss
│   │       │   │           └── register.component.ts
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   ├── custom-theme.scss
│   │       │   ├── environments/
│   │       │   │   ├── environment.prod.ts
│   │       │   │   └── environment.ts
│   │       │   ├── index.html
│   │       │   ├── main.ts
│   │       │   ├── polyfills.ts
│   │       │   ├── styles/
│   │       │   │   ├── _variables.scss
│   │       │   │   └── reset.scss
│   │       │   ├── styles.scss
│   │       │   └── test.ts
│   │       ├── tsconfig.app.json
│   │       ├── tsconfig.json
│   │       └── tsconfig.spec.json
│   ├── scripts/
│   │   ├── deploy-updates.sh
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   └── shared_service_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── layers/
│       │   ├── logger.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── samconfig.toml
│       └── template.yaml
├── Lab3/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Application/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── cypress/
│   │   │   │   ├── README.md
│   │   │   │   └── e2e/
│   │   │   │       └── 1-getting-started/
│   │   │   │           ├── basic-access.cy.js
│   │   │   │           └── product-testing.cy.js
│   │   │   ├── cypress.config.ts
│   │   │   ├── cypress.env.json.example
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │       │   └── models/
│   │   │   │   │       │       └── config-params.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── error/
│   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │       ├── orders/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── detail/
│   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │       ├── products/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │       │   └── products.module.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Landing/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── landing/
│   │   │   │   │       │   ├── landing.component.html
│   │   │   │   │       │   ├── landing.component.scss
│   │   │   │   │       │   └── landing.component.ts
│   │   │   │   │       └── register/
│   │   │   │   │           ├── register.component.html
│   │   │   │   │           ├── register.component.scss
│   │   │   │   │           └── register.component.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── dummy.txt
│   ├── scripts/
│   │   ├── deploy-updates.sh
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   ├── shared_service_authorizer.py
│       │   └── tenant_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── layers/
│       │   ├── auth_manager.py
│       │   ├── logger.py
│       │   ├── metrics_manager.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── shared-samconfig.toml
│       ├── shared-template.yaml
│       ├── tenant-samconfig.toml
│       └── tenant-template.yaml
├── Lab4/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Application/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── cypress/
│   │   │   │   ├── README.md
│   │   │   │   └── e2e/
│   │   │   │       └── 1-getting-started/
│   │   │   │           ├── basic-access.cy.js
│   │   │   │           └── product-testing.cy.js
│   │   │   ├── cypress.config.ts
│   │   │   ├── cypress.env.json.example
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │       │   └── models/
│   │   │   │   │       │       └── config-params.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── error/
│   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │       ├── orders/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── detail/
│   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │       ├── products/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │       │   └── products.module.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Landing/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── landing/
│   │   │   │   │       │   ├── landing.component.html
│   │   │   │   │       │   ├── landing.component.scss
│   │   │   │   │       │   └── landing.component.ts
│   │   │   │   │       └── register/
│   │   │   │   │           ├── register.component.html
│   │   │   │   │           ├── register.component.scss
│   │   │   │   │           └── register.component.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── dummy.txt
│   ├── scripts/
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   ├── shared_service_authorizer.py
│       │   └── tenant_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── layers/
│       │   ├── auth_manager.py
│       │   ├── logger.py
│       │   ├── metrics_manager.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── shared-samconfig.toml
│       ├── shared-template.yaml
│       ├── tenant-samconfig.toml
│       └── tenant-template.yaml
├── Lab5/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Application/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── cypress/
│   │   │   │   ├── README.md
│   │   │   │   └── e2e/
│   │   │   │       └── 1-getting-started/
│   │   │   │           ├── basic-access.cy.js
│   │   │   │           └── product-testing.cy.js
│   │   │   ├── cypress.config.ts
│   │   │   ├── cypress.env.json.example
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │       │   └── models/
│   │   │   │   │       │       └── config-params.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── error/
│   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │       ├── orders/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── detail/
│   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │       ├── products/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │       │   └── products.module.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── Landing/
│   │       ├── .browserslistrc
│   │       ├── .editorconfig
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── angular.json
│   │       ├── karma.conf.js
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── app-routing.module.ts
│   │       │   │   ├── app.component.scss
│   │       │   │   ├── app.component.ts
│   │       │   │   ├── app.module.ts
│   │       │   │   └── views/
│   │       │   │       ├── landing/
│   │       │   │       │   ├── landing.component.html
│   │       │   │       │   ├── landing.component.scss
│   │       │   │       │   └── landing.component.ts
│   │       │   │       └── register/
│   │       │   │           ├── register.component.html
│   │       │   │           ├── register.component.scss
│   │       │   │           └── register.component.ts
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   ├── custom-theme.scss
│   │       │   ├── environments/
│   │       │   │   ├── environment.prod.ts
│   │       │   │   └── environment.ts
│   │       │   ├── index.html
│   │       │   ├── main.ts
│   │       │   ├── polyfills.ts
│   │       │   ├── styles/
│   │       │   │   ├── _variables.scss
│   │       │   │   └── reset.scss
│   │       │   ├── styles.scss
│   │       │   └── test.ts
│   │       ├── tsconfig.app.json
│   │       ├── tsconfig.json
│   │       └── tsconfig.spec.json
│   ├── scripts/
│   │   ├── deploy-updates.sh
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   ├── shared_service_authorizer.py
│       │   └── tenant_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-provisioning.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── TenantPipeline/
│       │   ├── .gitignore
│       │   ├── .npmignore
│       │   ├── README.md
│       │   ├── bin/
│       │   │   └── pipeline.ts
│       │   ├── cdk.json
│       │   ├── jest.config.js
│       │   ├── lib/
│       │   │   └── serverless-saas-stack.ts
│       │   ├── package.json
│       │   ├── resources/
│       │   │   └── lambda-deploy-tenant-stack.py
│       │   ├── test/
│       │   │   └── pipeline.test.ts
│       │   └── tsconfig.json
│       ├── custom_resources/
│       │   ├── requirements.txt
│       │   ├── update_settings_table.py
│       │   ├── update_tenant_apigatewayurl.py
│       │   └── update_tenantstackmap_table.py
│       ├── layers/
│       │   ├── auth_manager.py
│       │   ├── logger.py
│       │   ├── metrics_manager.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── custom_resources.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── shared-samconfig.toml
│       ├── shared-template.yaml
│       ├── tenant-buildspec.yml
│       ├── tenant-samconfig.toml
│       └── tenant-template.yaml
├── Lab6/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Application/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── cypress/
│   │   │   │   ├── README.md
│   │   │   │   └── e2e/
│   │   │   │       └── 1-getting-started/
│   │   │   │           ├── basic-access.cy.js
│   │   │   │           └── product-testing.cy.js
│   │   │   ├── cypress.config.ts
│   │   │   ├── cypress.env.json.example
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │       │   └── models/
│   │   │   │   │       │       └── config-params.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── error/
│   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │       ├── orders/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── detail/
│   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │       ├── products/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │       │   └── products.module.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── Landing/
│   │       ├── .browserslistrc
│   │       ├── .editorconfig
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── angular.json
│   │       ├── karma.conf.js
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── app-routing.module.ts
│   │       │   │   ├── app.component.scss
│   │       │   │   ├── app.component.ts
│   │       │   │   ├── app.module.ts
│   │       │   │   └── views/
│   │       │   │       ├── landing/
│   │       │   │       │   ├── landing.component.html
│   │       │   │       │   ├── landing.component.scss
│   │       │   │       │   └── landing.component.ts
│   │       │   │       └── register/
│   │       │   │           ├── register.component.html
│   │       │   │           ├── register.component.scss
│   │       │   │           └── register.component.ts
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   ├── custom-theme.scss
│   │       │   ├── environments/
│   │       │   │   ├── environment.prod.ts
│   │       │   │   └── environment.ts
│   │       │   ├── index.html
│   │       │   ├── main.ts
│   │       │   ├── polyfills.ts
│   │       │   ├── styles/
│   │       │   │   ├── _variables.scss
│   │       │   │   └── reset.scss
│   │       │   ├── styles.scss
│   │       │   └── test.ts
│   │       ├── tsconfig.app.json
│   │       ├── tsconfig.json
│   │       └── tsconfig.spec.json
│   ├── scripts/
│   │   ├── deployment.sh
│   │   ├── geturl.sh
│   │   └── test-basic-tier-throttling.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   ├── shared_service_authorizer.py
│       │   └── tenant_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-provisioning.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── TenantPipeline/
│       │   ├── .gitignore
│       │   ├── .npmignore
│       │   ├── README.md
│       │   ├── bin/
│       │   │   └── pipeline.ts
│       │   ├── cdk.json
│       │   ├── jest.config.js
│       │   ├── lib/
│       │   │   └── serverless-saas-stack.ts
│       │   ├── package.json
│       │   ├── resources/
│       │   │   └── lambda-deploy-tenant-stack.py
│       │   ├── test/
│       │   │   └── pipeline.test.ts
│       │   └── tsconfig.json
│       ├── custom_resources/
│       │   ├── requirements.txt
│       │   ├── update_settings_table.py
│       │   ├── update_tenant_apigatewayurl.py
│       │   ├── update_tenantstackmap_table.py
│       │   └── update_usage_plan.py
│       ├── layers/
│       │   ├── auth_manager.py
│       │   ├── logger.py
│       │   ├── metrics_manager.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── custom_resources.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── shared-samconfig.toml
│       ├── shared-template.yaml
│       ├── tenant-buildspec.yml
│       ├── tenant-samconfig.toml
│       └── tenant-template.yaml
├── Lab7/
│   ├── .aws-sam/
│   │   ├── build/
│   │   │   ├── GetDynamoDBUsageAndCostByTenant/
│   │   │   │   ├── requirements.txt
│   │   │   │   └── tenant_usage_and_cost.py
│   │   │   ├── GetLambdaUsageAndCostByTenant/
│   │   │   │   ├── requirements.txt
│   │   │   │   └── tenant_usage_and_cost.py
│   │   │   └── template.yaml
│   │   └── build.toml
│   ├── SampleCUR/
│   │   ├── 20221011_211731_00058_ff5sr_094c8542-2cfd-459d-96e1-10e3bc2ac7a6
│   │   ├── 20221011_211731_00058_ff5sr_1ded6019-91c5-470a-9533-5a63ff447fa4
│   │   ├── 20221011_211731_00058_ff5sr_265b33b8-c229-4a42-9c51-e54380ec03b0
│   │   ├── 20221011_211731_00058_ff5sr_36154ed1-7420-43dc-9bce-e30ff784b7fc
│   │   ├── 20221011_211731_00058_ff5sr_4644e2bd-8b84-42df-bce7-35b29a0d3b83
│   │   ├── 20221011_211731_00058_ff5sr_47129e77-847c-420a-acac-3ce962bad5af
│   │   ├── 20221011_211731_00058_ff5sr_4f484d50-53e1-40f6-84d3-1495af1981e7
│   │   ├── 20221011_211731_00058_ff5sr_501fe43e-84a3-4665-8ae6-e81ac0a8c024
│   │   ├── 20221011_211731_00058_ff5sr_586d15f5-4ff9-4231-9693-d601f8a96386
│   │   ├── 20221011_211731_00058_ff5sr_5cf01031-5bec-496a-9003-354edff50dcc
│   │   ├── 20221011_211731_00058_ff5sr_74023afa-6ec8-4281-a5ce-b4771aac2ae0
│   │   ├── 20221011_211731_00058_ff5sr_7fb5dd51-6c56-41be-94fc-0cb6fc122cfd
│   │   ├── 20221011_211731_00058_ff5sr_93372514-9952-4af6-a6f3-396921248c28
│   │   ├── 20221011_211731_00058_ff5sr_952352a7-a59a-4f6c-b359-aa2251d1f6a8
│   │   ├── 20221011_211731_00058_ff5sr_9ab989ba-acce-479c-bc60-c33acffa4c79
│   │   ├── 20221011_211731_00058_ff5sr_9b9fe19e-b145-49d1-9aed-135fec199529
│   │   ├── 20221011_211731_00058_ff5sr_a35b0a43-ebb6-44e1-949b-14d3e0472842
│   │   ├── 20221011_211731_00058_ff5sr_a6fa2ec0-8151-41a2-b6ef-f0f630ff956f
│   │   ├── 20221011_211731_00058_ff5sr_aa65c209-65b9-4c95-873a-7c863ea5e0a7
│   │   ├── 20221011_211731_00058_ff5sr_b0cfe354-83a9-403b-9371-477dc4f4e8ef
│   │   ├── 20221011_211731_00058_ff5sr_b6f519bf-0afa-480a-b5ab-5d75bec1490d
│   │   ├── 20221011_211731_00058_ff5sr_c0ad9ac0-db23-4466-9eb2-d59b532bf15a
│   │   ├── 20221011_211731_00058_ff5sr_c3499311-c8db-4272-875a-280a7473d9ec
│   │   ├── 20221011_211731_00058_ff5sr_dc8883cc-c8fd-49e7-acd1-8d08867e157d
│   │   ├── 20221011_211731_00058_ff5sr_e02f4092-0266-4104-9978-d5bcb8138da3
│   │   ├── 20221011_211731_00058_ff5sr_e7dfb4a0-e8eb-438b-96c6-16023f5a131b
│   │   ├── 20221011_211731_00058_ff5sr_ebfd0670-22dd-40cb-a63d-61ebb593982a
│   │   ├── 20221011_211731_00058_ff5sr_ecb0667a-7aa5-4fd0-8e85-8c3a5701dd14
│   │   ├── 20221011_211731_00058_ff5sr_f8c1b718-c6dc-4ee0-874d-3d41f6b12732
│   │   └── 20221011_211731_00058_ff5sr_faaa1338-ae7a-4565-ab3c-3dd6b1d63837
│   ├── TenantUsageAndCost/
│   │   ├── requirements.txt
│   │   └── tenant_usage_and_cost.py
│   ├── deployment.sh
│   ├── lambdaoutput.json
│   ├── samconfig.toml
│   └── template.yaml
├── README.md
├── Solution/
│   ├── Lab1/
│   │   ├── client/
│   │   │   └── Application/
│   │   │       ├── .browserslistrc
│   │   │       ├── .editorconfig
│   │   │       ├── .gitignore
│   │   │       ├── README.md
│   │   │       ├── angular.json
│   │   │       ├── karma.conf.js
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── app/
│   │   │       │   │   ├── _nav.ts
│   │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │   ├── app.component.scss
│   │   │       │   │   ├── app.component.ts
│   │   │       │   │   ├── app.module.ts
│   │   │       │   │   ├── models/
│   │   │       │   │   │   ├── index.ts
│   │   │       │   │   │   └── interfaces.ts
│   │   │       │   │   ├── nav/
│   │   │       │   │   │   ├── nav.component.html
│   │   │       │   │   │   ├── nav.component.scss
│   │   │       │   │   │   └── nav.component.ts
│   │   │       │   │   └── views/
│   │   │       │   │       ├── dashboard/
│   │   │       │   │       │   ├── dashboard-routing.module.ts
│   │   │       │   │       │   ├── dashboard.component.html
│   │   │       │   │       │   ├── dashboard.component.scss
│   │   │       │   │       │   ├── dashboard.component.ts
│   │   │       │   │       │   └── dashboard.module.ts
│   │   │       │   │       ├── orders/
│   │   │       │   │       │   ├── create/
│   │   │       │   │       │   │   ├── create.component.html
│   │   │       │   │       │   │   ├── create.component.scss
│   │   │       │   │       │   │   └── create.component.ts
│   │   │       │   │       │   ├── detail/
│   │   │       │   │       │   │   ├── detail.component.html
│   │   │       │   │       │   │   ├── detail.component.scss
│   │   │       │   │       │   │   └── detail.component.ts
│   │   │       │   │       │   ├── list/
│   │   │       │   │       │   │   ├── list.component.html
│   │   │       │   │       │   │   ├── list.component.scss
│   │   │       │   │       │   │   └── list.component.ts
│   │   │       │   │       │   ├── models/
│   │   │       │   │       │   │   ├── order.interface.ts
│   │   │       │   │       │   │   └── orderproduct.interface.ts
│   │   │       │   │       │   ├── orders-routing.module.ts
│   │   │       │   │       │   ├── orders.module.ts
│   │   │       │   │       │   └── orders.service.ts
│   │   │       │   │       └── products/
│   │   │       │   │           ├── create/
│   │   │       │   │           │   ├── create.component.html
│   │   │       │   │           │   ├── create.component.scss
│   │   │       │   │           │   └── create.component.ts
│   │   │       │   │           ├── edit/
│   │   │       │   │           │   ├── edit.component.html
│   │   │       │   │           │   ├── edit.component.scss
│   │   │       │   │           │   └── edit.component.ts
│   │   │       │   │           ├── list/
│   │   │       │   │           │   ├── list.component.html
│   │   │       │   │           │   ├── list.component.scss
│   │   │       │   │           │   └── list.component.ts
│   │   │       │   │           ├── models/
│   │   │       │   │           │   └── product.interface.ts
│   │   │       │   │           ├── product.service.ts
│   │   │       │   │           ├── products-routing.module.ts
│   │   │       │   │           └── products.module.ts
│   │   │       │   ├── assets/
│   │   │       │   │   └── .gitkeep
│   │   │       │   ├── custom-theme.scss
│   │   │       │   ├── environments/
│   │   │       │   │   ├── environment.prod.ts
│   │   │       │   │   └── environment.ts
│   │   │       │   ├── index.html
│   │   │       │   ├── main.ts
│   │   │       │   ├── polyfills.ts
│   │   │       │   ├── styles/
│   │   │       │   │   ├── _variables.scss
│   │   │       │   │   └── reset.scss
│   │   │       │   ├── styles.scss
│   │   │       │   └── test.ts
│   │   │       ├── tsconfig.app.json
│   │   │       ├── tsconfig.json
│   │   │       └── tsconfig.spec.json
│   │   ├── scripts/
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── layers/
│   │       │   ├── logger.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── samconfig.toml
│   │       └── template.yaml
│   ├── Lab2/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── Landing/
│   │   │       ├── .browserslistrc
│   │   │       ├── .editorconfig
│   │   │       ├── .gitignore
│   │   │       ├── README.md
│   │   │       ├── angular.json
│   │   │       ├── karma.conf.js
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── app/
│   │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │   ├── app.component.scss
│   │   │       │   │   ├── app.component.ts
│   │   │       │   │   ├── app.module.ts
│   │   │       │   │   └── views/
│   │   │       │   │       ├── landing/
│   │   │       │   │       │   ├── landing.component.html
│   │   │       │   │       │   ├── landing.component.scss
│   │   │       │   │       │   └── landing.component.ts
│   │   │       │   │       └── register/
│   │   │       │   │           ├── register.component.html
│   │   │       │   │           ├── register.component.scss
│   │   │       │   │           └── register.component.ts
│   │   │       │   ├── assets/
│   │   │       │   │   └── .gitkeep
│   │   │       │   ├── custom-theme.scss
│   │   │       │   ├── environments/
│   │   │       │   │   ├── environment.prod.ts
│   │   │       │   │   └── environment.ts
│   │   │       │   ├── index.html
│   │   │       │   ├── main.ts
│   │   │       │   ├── polyfills.ts
│   │   │       │   ├── styles/
│   │   │       │   │   ├── _variables.scss
│   │   │       │   │   └── reset.scss
│   │   │       │   ├── styles.scss
│   │   │       │   └── test.ts
│   │   │       ├── tsconfig.app.json
│   │   │       ├── tsconfig.json
│   │   │       └── tsconfig.spec.json
│   │   ├── scripts/
│   │   │   ├── deploy-updates.sh
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   └── shared_service_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── layers/
│   │       │   ├── logger.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── samconfig.toml
│   │       └── template.yaml
│   ├── Lab3/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Application/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── cypress/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── e2e/
│   │   │   │   │       └── 1-getting-started/
│   │   │   │   │           ├── basic-access.cy.js
│   │   │   │   │           └── product-testing.cy.js
│   │   │   │   ├── cypress.config.ts
│   │   │   │   ├── cypress.env.json.example
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │   │       │   └── models/
│   │   │   │   │   │       │       └── config-params.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── error/
│   │   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │   │       ├── orders/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── detail/
│   │   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │   │       ├── products/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── edit/
│   │   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │   │       │   └── products.module.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Landing/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── landing/
│   │   │   │   │   │       │   ├── landing.component.html
│   │   │   │   │   │       │   ├── landing.component.scss
│   │   │   │   │   │       │   └── landing.component.ts
│   │   │   │   │   │       └── register/
│   │   │   │   │   │           ├── register.component.html
│   │   │   │   │   │           ├── register.component.scss
│   │   │   │   │   │           └── register.component.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── dummy.txt
│   │   ├── scripts/
│   │   │   ├── deploy-updates.sh
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   ├── shared_service_authorizer.py
│   │       │   └── tenant_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── layers/
│   │       │   ├── auth_manager.py
│   │       │   ├── logger.py
│   │       │   ├── metrics_manager.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── shared-samconfig.toml
│   │       ├── shared-template.yaml
│   │       ├── tenant-samconfig.toml
│   │       └── tenant-template.yaml
│   ├── Lab4/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Application/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── cypress/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── e2e/
│   │   │   │   │       └── 1-getting-started/
│   │   │   │   │           ├── basic-access.cy.js
│   │   │   │   │           └── product-testing.cy.js
│   │   │   │   ├── cypress.config.ts
│   │   │   │   ├── cypress.env.json.example
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │   │       │   └── models/
│   │   │   │   │   │       │       └── config-params.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── error/
│   │   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │   │       ├── orders/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── detail/
│   │   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │   │       ├── products/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── edit/
│   │   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │   │       │   └── products.module.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Landing/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── landing/
│   │   │   │   │   │       │   ├── landing.component.html
│   │   │   │   │   │       │   ├── landing.component.scss
│   │   │   │   │   │       │   └── landing.component.ts
│   │   │   │   │   │       └── register/
│   │   │   │   │   │           ├── register.component.html
│   │   │   │   │   │           ├── register.component.scss
│   │   │   │   │   │           └── register.component.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── dummy.txt
│   │   ├── scripts/
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   ├── shared_service_authorizer.py
│   │       │   └── tenant_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── layers/
│   │       │   ├── auth_manager.py
│   │       │   ├── logger.py
│   │       │   ├── metrics_manager.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── shared-samconfig.toml
│   │       ├── shared-template.yaml
│   │       ├── tenant-samconfig.toml
│   │       └── tenant-template.yaml
│   ├── Lab5/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Application/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── cypress/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── e2e/
│   │   │   │   │       └── 1-getting-started/
│   │   │   │   │           ├── basic-access.cy.js
│   │   │   │   │           └── product-testing.cy.js
│   │   │   │   ├── cypress.config.ts
│   │   │   │   ├── cypress.env.json.example
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │   │       │   └── models/
│   │   │   │   │   │       │       └── config-params.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── error/
│   │   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │   │       ├── orders/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── detail/
│   │   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │   │       ├── products/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── edit/
│   │   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │   │       │   └── products.module.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── Landing/
│   │   │       ├── .browserslistrc
│   │   │       ├── .editorconfig
│   │   │       ├── .gitignore
│   │   │       ├── README.md
│   │   │       ├── angular.json
│   │   │       ├── karma.conf.js
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── app/
│   │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │   ├── app.component.scss
│   │   │       │   │   ├── app.component.ts
│   │   │       │   │   ├── app.module.ts
│   │   │       │   │   └── views/
│   │   │       │   │       ├── landing/
│   │   │       │   │       │   ├── landing.component.html
│   │   │       │   │       │   ├── landing.component.scss
│   │   │       │   │       │   └── landing.component.ts
│   │   │       │   │       └── register/
│   │   │       │   │           ├── register.component.html
│   │   │       │   │           ├── register.component.scss
│   │   │       │   │           └── register.component.ts
│   │   │       │   ├── assets/
│   │   │       │   │   └── .gitkeep
│   │   │       │   ├── custom-theme.scss
│   │   │       │   ├── environments/
│   │   │       │   │   ├── environment.prod.ts
│   │   │       │   │   └── environment.ts
│   │   │       │   ├── index.html
│   │   │       │   ├── main.ts
│   │   │       │   ├── polyfills.ts
│   │   │       │   ├── styles/
│   │   │       │   │   ├── _variables.scss
│   │   │       │   │   └── reset.scss
│   │   │       │   ├── styles.scss
│   │   │       │   └── test.ts
│   │   │       ├── tsconfig.app.json
│   │   │       ├── tsconfig.json
│   │   │       └── tsconfig.spec.json
│   │   ├── scripts/
│   │   │   ├── deploy-updates.sh
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   ├── shared_service_authorizer.py
│   │       │   └── tenant_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── events/
│   │       │   │   ├── env.json
│   │       │   │   ├── tenant-registration.json
│   │       │   │   ├── update_users_apikey_by_tenant.json
│   │       │   │   └── user-management.json
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-provisioning.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── TenantPipeline/
│   │       │   ├── .gitignore
│   │       │   ├── .npmignore
│   │       │   ├── README.md
│   │       │   ├── bin/
│   │       │   │   └── pipeline.ts
│   │       │   ├── cdk.json
│   │       │   ├── jest.config.js
│   │       │   ├── lib/
│   │       │   │   └── serverless-saas-stack.ts
│   │       │   ├── package.json
│   │       │   ├── resources/
│   │       │   │   └── lambda-deploy-tenant-stack.py
│   │       │   ├── test/
│   │       │   │   └── pipeline.test.ts
│   │       │   └── tsconfig.json
│   │       ├── custom_resources/
│   │       │   ├── requirements.txt
│   │       │   ├── update_settings_table.py
│   │       │   ├── update_tenant_apigatewayurl.py
│   │       │   └── update_tenantstackmap_table.py
│   │       ├── layers/
│   │       │   ├── auth_manager.py
│   │       │   ├── logger.py
│   │       │   ├── metrics_manager.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── custom_resources.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── shared-samconfig.toml
│   │       ├── shared-template.yaml
│   │       ├── tenant-buildspec.yml
│   │       ├── tenant-samconfig.toml
│   │       └── tenant-template.yaml
│   ├── Lab6/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Application/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── cypress/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── e2e/
│   │   │   │   │       └── 1-getting-started/
│   │   │   │   │           ├── basic-access.cy.js
│   │   │   │   │           └── product-testing.cy.js
│   │   │   │   ├── cypress.config.ts
│   │   │   │   ├── cypress.env.json.example
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │   │       │   └── models/
│   │   │   │   │   │       │       └── config-params.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── error/
│   │   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │   │       ├── orders/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── detail/
│   │   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │   │       ├── products/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── edit/
│   │   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │   │       │   └── products.module.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── Landing/
│   │   │       ├── .browserslistrc
│   │   │       ├── .editorconfig
│   │   │       ├── .gitignore
│   │   │       ├── README.md
│   │   │       ├── angular.json
│   │   │       ├── karma.conf.js
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── app/
│   │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │   ├── app.component.scss
│   │   │       │   │   ├── app.component.ts
│   │   │       │   │   ├── app.module.ts
│   │   │       │   │   └── views/
│   │   │       │   │       ├── landing/
│   │   │       │   │       │   ├── landing.component.html
│   │   │       │   │       │   ├── landing.component.scss
│   │   │       │   │       │   └── landing.component.ts
│   │   │       │   │       └── register/
│   │   │       │   │           ├── register.component.html
│   │   │       │   │           ├── register.component.scss
│   │   │       │   │           └── register.component.ts
│   │   │       │   ├── assets/
│   │   │       │   │   └── .gitkeep
│   │   │       │   ├── custom-theme.scss
│   │   │       │   ├── environments/
│   │   │       │   │   ├── environment.prod.ts
│   │   │       │   │   └── environment.ts
│   │   │       │   ├── index.html
│   │   │       │   ├── main.ts
│   │   │       │   ├── polyfills.ts
│   │   │       │   ├── styles/
│   │   │       │   │   ├── _variables.scss
│   │   │       │   │   └── reset.scss
│   │   │       │   ├── styles.scss
│   │   │       │   └── test.ts
│   │   │       ├── tsconfig.app.json
│   │   │       ├── tsconfig.json
│   │   │       └── tsconfig.spec.json
│   │   ├── scripts/
│   │   │   ├── deployment.sh
│   │   │   ├── geturl.sh
│   │   │   └── test-basic-tier-throttling.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   ├── shared_service_authorizer.py
│   │       │   └── tenant_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── events/
│   │       │   │   ├── env.json
│   │       │   │   ├── tenant-registration.json
│   │       │   │   ├── update_users_apikey_by_tenant.json
│   │       │   │   └── user-management.json
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-provisioning.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── TenantPipeline/
│   │       │   ├── .gitignore
│   │       │   ├── .npmignore
│   │       │   ├── README.md
│   │       │   ├── bin/
│   │       │   │   └── pipeline.ts
│   │       │   ├── cdk.json
│   │       │   ├── jest.config.js
│   │       │   ├── lib/
│   │       │   │   └── serverless-saas-stack.ts
│   │       │   ├── package.json
│   │       │   ├── resources/
│   │       │   │   └── lambda-deploy-tenant-stack.py
│   │       │   ├── test/
│   │       │   │   └── pipeline.test.ts
│   │       │   └── tsconfig.json
│   │       ├── custom_resources/
│   │       │   ├── requirements.txt
│   │       │   ├── update_settings_table.py
│   │       │   ├── update_tenant_apigatewayurl.py
│   │       │   ├── update_tenantstackmap_table.py
│   │       │   └── update_usage_plan.py
│   │       ├── layers/
│   │       │   ├── auth_manager.py
│   │       │   ├── logger.py
│   │       │   ├── metrics_manager.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── custom_resources.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── shared-samconfig.toml
│   │       ├── shared-template.yaml
│   │       ├── tenant-buildspec.yml
│   │       ├── tenant-samconfig.toml
│   │       └── tenant-template.yaml
│   └── Lab7/
│       ├── .aws-sam/
│       │   ├── build/
│       │   │   ├── GetDynamoDBUsageAndCostByTenant/
│       │   │   │   ├── requirements.txt
│       │   │   │   └── tenant_usage_and_cost.py
│       │   │   ├── GetLambdaUsageAndCostByTenant/
│       │   │   │   ├── requirements.txt
│       │   │   │   └── tenant_usage_and_cost.py
│       │   │   └── template.yaml
│       │   └── build.toml
│       ├── SampleCUR/
│       │   ├── 20221011_211731_00058_ff5sr_094c8542-2cfd-459d-96e1-10e3bc2ac7a6
│       │   ├── 20221011_211731_00058_ff5sr_1ded6019-91c5-470a-9533-5a63ff447fa4
│       │   ├── 20221011_211731_00058_ff5sr_265b33b8-c229-4a42-9c51-e54380ec03b0
│       │   ├── 20221011_211731_00058_ff5sr_36154ed1-7420-43dc-9bce-e30ff784b7fc
│       │   ├── 20221011_211731_00058_ff5sr_4644e2bd-8b84-42df-bce7-35b29a0d3b83
│       │   ├── 20221011_211731_00058_ff5sr_47129e77-847c-420a-acac-3ce962bad5af
│       │   ├── 20221011_211731_00058_ff5sr_4f484d50-53e1-40f6-84d3-1495af1981e7
│       │   ├── 20221011_211731_00058_ff5sr_501fe43e-84a3-4665-8ae6-e81ac0a8c024
│       │   ├── 20221011_211731_00058_ff5sr_586d15f5-4ff9-4231-9693-d601f8a96386
│       │   ├── 20221011_211731_00058_ff5sr_5cf01031-5bec-496a-9003-354edff50dcc
│       │   ├── 20221011_211731_00058_ff5sr_74023afa-6ec8-4281-a5ce-b4771aac2ae0
│       │   ├── 20221011_211731_00058_ff5sr_7fb5dd51-6c56-41be-94fc-0cb6fc122cfd
│       │   ├── 20221011_211731_00058_ff5sr_93372514-9952-4af6-a6f3-396921248c28
│       │   ├── 20221011_211731_00058_ff5sr_952352a7-a59a-4f6c-b359-aa2251d1f6a8
│       │   ├── 20221011_211731_00058_ff5sr_9ab989ba-acce-479c-bc60-c33acffa4c79
│       │   ├── 20221011_211731_00058_ff5sr_9b9fe19e-b145-49d1-9aed-135fec199529
│       │   ├── 20221011_211731_00058_ff5sr_a35b0a43-ebb6-44e1-949b-14d3e0472842
│       │   ├── 20221011_211731_00058_ff5sr_a6fa2ec0-8151-41a2-b6ef-f0f630ff956f
│       │   ├── 20221011_211731_00058_ff5sr_aa65c209-65b9-4c95-873a-7c863ea5e0a7
│       │   ├── 20221011_211731_00058_ff5sr_b0cfe354-83a9-403b-9371-477dc4f4e8ef
│       │   ├── 20221011_211731_00058_ff5sr_b6f519bf-0afa-480a-b5ab-5d75bec1490d
│       │   ├── 20221011_211731_00058_ff5sr_c0ad9ac0-db23-4466-9eb2-d59b532bf15a
│       │   ├── 20221011_211731_00058_ff5sr_c3499311-c8db-4272-875a-280a7473d9ec
│       │   ├── 20221011_211731_00058_ff5sr_dc8883cc-c8fd-49e7-acd1-8d08867e157d
│       │   ├── 20221011_211731_00058_ff5sr_e02f4092-0266-4104-9978-d5bcb8138da3
│       │   ├── 20221011_211731_00058_ff5sr_e7dfb4a0-e8eb-438b-96c6-16023f5a131b
│       │   ├── 20221011_211731_00058_ff5sr_ebfd0670-22dd-40cb-a63d-61ebb593982a
│       │   ├── 20221011_211731_00058_ff5sr_ecb0667a-7aa5-4fd0-8e85-8c3a5701dd14
│       │   ├── 20221011_211731_00058_ff5sr_f8c1b718-c6dc-4ee0-874d-3d41f6b12732
│       │   └── 20221011_211731_00058_ff5sr_faaa1338-ae7a-4565-ab3c-3dd6b1d63837
│       ├── TenantUsageAndCost/
│       │   ├── requirements.txt
│       │   └── tenant_usage_and_cost.py
│       ├── deployment.sh
│       ├── lambdaoutput.json
│       ├── samconfig.toml
│       └── template.yaml
├── THIRD-PARTY-LICENSES.txt
├── event-engine-assets/
│   ├── initialize-module-sam-template.yaml
│   ├── lab1-module-sam-template.yaml
│   ├── pre-requisites-event-engine.sh
│   └── userinterface-module-sam-template.yaml
└── scripts/
    ├── cleanup.sh
    ├── create_tenants.sh
    ├── lab2_updates.py
    ├── lab3_updates.py
    ├── lab4_updates.py
    ├── lab5_updates.py
    ├── lab6_updates.py
    ├── replace_function.py
    ├── run_all_labs.sh
    └── run_workshop.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: CODE_OF_CONDUCT.md
================================================
## Code of Conduct
This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).
For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact
opensource-codeofconduct@amazon.com with any additional questions or comments.

================================================
FILE: CONTRIBUTING.md
================================================
# Contributing Guidelines

Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional
documentation, we greatly value feedback and contributions from our community.

Please read through this document before submitting any issues or pull requests to ensure we have all the necessary
information to effectively respond to your bug report or contribution.


## Reporting Bugs/Feature Requests

We welcome you to use the GitHub issue tracker to report bugs or suggest features.

When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already
reported the issue. Please try to include as much information as you can. Details like these are incredibly useful:

* A reproducible test case or series of steps
* The version of our code being used
* Any modifications you've made relevant to the bug
* Anything unusual about your environment or deployment


## Contributing via Pull Requests
Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that:

1. You are working against the latest source on the *main* branch.
2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already.
3. You open an issue to discuss any significant work - we would hate for your time to be wasted.

To send us a pull request, please:

1. Fork the repository.
2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change.
3. Ensure local tests pass.
4. Commit to your fork using clear commit messages.
5. Send us a pull request, answering any default questions in the pull request interface.
6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation.

GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and
[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).


## Finding contributions to work on
Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start.


## Code of Conduct
This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).
For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact
opensource-codeofconduct@amazon.com with any additional questions or comments.


## Security issue notifications
If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue.


## Licensing

See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution.

================================================
FILE: Cloud9Setup/.gitignore
================================================
.aws-sam/
.pytest_cache/
.DS_Store
.vscode/

================================================
FILE: Cloud9Setup/README.md
================================================
# Setup Cloud9
sam build -t prereq-sam-template.yaml --use-container
sam deploy




================================================
FILE: Cloud9Setup/increase-disk-size.sh
================================================
#!/bin/bash

# Specify the desired volume size in GiB as a command line argument. If not specified, default to 50 GiB.
SIZE=50

# Get the ID of the environment host Amazon EC2 instance.
INSTANCEID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/\(.*\)[a-z]/\1/')

# Get the ID of the Amazon EBS volume associated with the instance.
VOLUMEID=$(aws ec2 describe-instances \
  --instance-id $INSTANCEID \
  --query "Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId" \
  --output text \
  --region $REGION)

# Resize the EBS volume.
aws ec2 modify-volume --volume-id $VOLUMEID --size $SIZE

# Wait for the resize to finish.
while [ \
  "$(aws ec2 describe-volumes-modifications \
    --volume-id $VOLUMEID \
    --filters Name=modification-state,Values="optimizing","completed" \
    --query "length(VolumesModifications)"\
    --output text)" != "1" ]; do
    sleep 1
done

#Check if we're on an NVMe filesystem
if [[ -e "/dev/xvda" && $(readlink -f /dev/xvda) = "/dev/xvda" ]]
then
  # Rewrite the partition table so that the partition takes up all the space that it can.
  sudo growpart /dev/xvda 1

  # Expand the size of the file system.
  # Check if we're on AL2
  STR=$(cat /etc/os-release)
  SUB="VERSION_ID=\"2\""
  if [[ "$STR" == *"$SUB"* ]]
  then
    sudo xfs_growfs -d /
  else
    sudo resize2fs /dev/xvda1
  fi

else
  # Rewrite the partition table so that the partition takes up all the space that it can.
  sudo growpart /dev/nvme0n1 1

  # Expand the size of the file system.
  # Check if we're on AL2
  STR=$(cat /etc/os-release)
  SUB="VERSION_ID=\"2\""
  if [[ "$STR" == *"$SUB"* ]]
  then
    sudo xfs_growfs -d /
  else
    sudo resize2fs /dev/nvme0n1p1
  fi
fi

================================================
FILE: Cloud9Setup/pre-requisites-versions-check.sh
================================================
#!/bin/bash
SUMMARY="Make sure all the pre-requisites checks PASS"$'\n'
check_version() {
  retval=0  
  MIN_VERSION=$1
  CURRENT_VERSION=$2
  IFS='.' read -r -a minarr <<< "$MIN_VERSION"
  IFS='.' read -r -a currarr <<< "$CURRENT_VERSION"
  
  for ((i=0; i<${#minarr[@]}; i++));
  do
    #echo "${currarr[$i]}, ${minarr[$i]}"
    if [[ ${currarr[$i]} -gt ${minarr[$i]} ]]; then
        break
    elif [[ ${currarr[$i]} -lt ${minarr[$i]} ]]; then
        retval=1
        break
    else
        continue
    fi        
  done

  return $retval  
}

echo "Checking python version"
python3 --version
PYTHON_VERSION=$(python3 --version 2>&1 | cut -d'n' -f 2 | xargs)
PYTHON_MIN_VERSION=3.8.0
check_version $PYTHON_MIN_VERSION $PYTHON_VERSION
if [[ $? -eq 1 ]]; then
    echo "ACTION REQUIRED: Need to have python version greater than or equal to $PYTHON_MIN_VERSION"
    SUMMARY+="* ACTION REQUIRED: Need to have python version greater than or equal to $PYTHON_MIN_VERSION"$'\n'
else 
    SUMMARY+="* PASS : Python version $PYTHON_VERSION installed. The minimum required version $PYTHON_MIN_VERSION"$'\n'
fi
echo ""

echo "Checking aws cli version"
aws --version
if [[ $? -ne 0 ]]; then
     echo "ACTION REQUIRED: aws cli is missing, please install !!" 
     SUMMARY+="* ACTION REQUIRED: aws cli is missing, please install !!"$'\n'
else 
    AWS_VERSION=$(aws --version | cut -d'P' -f 1 | xargs)
    SUMMARY+="* PASS : $AWS_VERSION version installed"$'\n'
    jq --version
    if [[ $? -ne 0 ]]; then
        echo yes | sudo yum install jq
    fi    
    CLOUD9_INSTANCE=$(aws ec2 describe-instances --filters Name=instance-type,Values=t3.large | jq -r '.Reservations[0].Instances[0].InstanceId')
    if [ -z $CLOUD9_INSTANCE ]; then
        echo "ACTION REQUIRED: Looks like Cloud9 instance with t3.large instance type is missing. Please create one!!"
        SUMMARY+="* ACTION REQUIRED: Looks like Cloud9 instance with t3.large instance type is missing. Please create one!!"$'\n'
    else
        SUMMARY+="* PASS : Has required t3.large instance type"$'\n' 
        CLOUD9_INSTANCE_VOLUME_ID=$(aws ec2 describe-instances --filters Name=instance-type,Values=t3.large | jq -r '.Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId')
        VOLUME_SIZE=$(aws ec2 describe-volumes --volume-ids $CLOUD9_INSTANCE_VOLUME_ID | jq -r '.Volumes[0].Size')
        if [[ $VOLUME_SIZE -lt 50 ]]; then
            echo "ACTION REQUIRED: The volume size of cloud9 is less than 50GiB. Please update volume size to atleast 50GiB"
            SUMMARY+="* ACTION REQUIRED: The volume size of cloud9 is less than 50GiB. Please update volume size to atleast 50GiB"$'\n'
        else
            SUMMARY+="* PASS : Has minimum required 50GiB volume size"$'\n'
        fi
    fi
fi
echo ""

echo "Checking sam cli version"
sam --version
SAM_VERSION=$(sam --version | cut -d'n' -f 2 | xargs)
SAM_MIN_VERSION=1.53.0
check_version $SAM_MIN_VERSION $SAM_VERSION
if [[ $? -eq 1 ]]; then
    echo "ACTION REQUIRED: Need to have SAM version greater than or equal to $SAM_MIN_VERSION"
    SUMMARY+="* ACTION REQUIRED: Need to have SAM version greater than or equal to $SAM_MIN_VERSION"$'\n'
else
    SUMMARY+="* PASS : Sam cli version $SAM_VERSION installed. The minimum required version $SAM_MIN_VERSION"$'\n'
fi
echo ""

echo "Checking git-remote-codecommit version"
python3 -m pip show git-remote-codecommit
if [[ $? -ne 0 ]]; then
    echo "ACTION REQUIRED: git-remote-codecommit is missing, please install"
    SUMMARY+="* ACTION REQUIRED: git-remote-codecommit is missing, please install !!"$'\n'
else
    SUMMARY+="* PASS : Has git-remote-codecommit installed"$'\n'
fi
echo ""

echo "Checking node version"
node --version
NODE_VERSION=$(node --version | cut -d'v' -f 2)
NODE_MIN_VERSION=14.0.0
check_version $NODE_MIN_VERSION $NODE_VERSION 
if [[ $? -eq 1 ]]; then
    echo "ACTION REQUIRED: Need to have Node version greater than or equal to $NODE_MIN_VERSION"
    SUMMARY+="* ACTION REQUIRED: Need to have Node version greater than or equal to $NODE_MIN_VERSION"$'\n'
else
    SUMMARY+="* PASS : Node version $NODE_VERSION installed. The minimum required version $NODE_MIN_VERSION"$'\n'
fi
echo ""


echo "Checking cdk version"
cdk --version
CDK_VERSION=$(cdk --version | cut -d'(' -f 1| xargs)
CDK_MIN_VERSION=2.40.0
check_version $CDK_MIN_VERSION $CDK_VERSION
if [[ $? -eq 1 ]]; then
    echo "ACTION REQUIRED: Need to have CDK version greater than or equal to $CDK_MIN_VERSION"
    SUMMARY+="* ACTION REQUIRED: Need to have CDK version greater than or equal to $CDK_MIN_VERSION"$'\n'
else 
    SUMMARY+="* PASS : CDK version $CDK_VERSION installed. The minimum required version $CDK_MIN_VERSION"$'\n'
fi
echo ""

echo "***************SUMMARY****************"
echo "$SUMMARY"
echo "***************END OF SUMMARY*********"


================================================
FILE: Cloud9Setup/pre-requisites.sh
================================================
#!/bin/bash -x

#Installing NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | sudo -u ec2-user bash

. /home/ec2-user/.nvm/nvm.sh

#Install python3.8
sudo yum install -y amazon-linux-extras
sudo amazon-linux-extras enable python3.8
sudo yum install -y python3.8
sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
sudo alternatives --set python3 /usr/bin/python3.8

# Uninstall aws cli v1 and Install aws cli version-2.3.0
sudo pip uninstall awscli -y

echo "Installing aws cli version-2.3.0"
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.3.0.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
rm awscliv2.zip
rm -rf aws 

# Install sam cli version 1.64.0
echo "Installing sam cli version 1.64.0"
wget https://github.com/aws/aws-sam-cli/releases/download/v1.64.0/aws-sam-cli-linux-x86_64.zip
unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
sudo ./sam-installation/install
if [ $? -ne 0 ]; then
	echo "Sam cli is already present, so deleting existing version"
	sudo rm /usr/local/bin/sam
	sudo rm -rf /usr/local/aws-sam-cli
	echo "Now installing sam cli version 1.64.0"
	sudo ./sam-installation/install    
fi
rm aws-sam-cli-linux-x86_64.zip
rm -rf sam-installation

# Install git-remote-codecommit version 1.15.1
echo "Installing git-remote-codecommit version 1.15.1"
curl -O https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py --user
rm get-pip.py

python3 -m pip install git-remote-codecommit==1.15.1

# Install node v14.18.1
echo "Installing node v14.18.1"
nvm deactivate
nvm uninstall node
nvm install v14.18.1
nvm use v14.18.1
nvm alias default v14.18.1

# Install cdk cli version ^2.40.0
echo "Installing cdk cli version ^2.40.0"
npm uninstall -g aws-cdk
npm install -g aws-cdk@"^2.40.0"

#Install jq version 1.5
sudo yum -y install jq-1.5

#Install pylint version 2.11.1
python3 -m pip install pylint==2.11.1

python3 -m pip install boto3


================================================
FILE: Cloud9Setup/samconfig.toml
================================================
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "serverless-saas-init-environment"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-8tf6bmi4rdcx"
s3_prefix = "serverless-saas"
region = "us-west-2"
confirm_changeset = false
capabilities = "CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND"

================================================
FILE: LICENSE
================================================
Creative Commons Attribution-ShareAlike 4.0 International Public License

By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.

Section 1 – Definitions.
	
     a.	Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
	
     b.	Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
	
     c.	BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.
	
     d.	Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
	
     e.	Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
	
     f.	Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
	
     g.	License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike.
	
     h.	Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
	
     i.	Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
	
     j.	Licensor means the individual(s) or entity(ies) granting rights under this Public License.
	
     k.	Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
	
     l.	Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
	
     m.	You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.

Section 2 – Scope.
	
     a.	License grant.
	
          1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:

               A. reproduce and Share the Licensed Material, in whole or in part; and	

               B. produce, reproduce, and Share Adapted Material.
	
          2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
	
          3. Term. The term of this Public License is specified in Section 6(a).
	
          4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
	
          5. Downstream recipients.

               A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
	
               B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.
	
               C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
	
          6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
	
     b.	Other rights.
	
          1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
	
          2. Patent and trademark rights are not licensed under this Public License.
	
          3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.

Section 3 – License Conditions.

Your exercise of the Licensed Rights is expressly made subject to the following conditions.
	
     a.	Attribution.
	
          1. If You Share the Licensed Material (including in modified form), You must:

               A. retain the following if it is supplied by the Licensor with the Licensed Material:

                    i.	identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);

                    ii.	a copyright notice;

                    iii. a notice that refers to this Public License;

                    iv.	a notice that refers to the disclaimer of warranties;

                    v.	a URI or hyperlink to the Licensed Material to the extent reasonably practicable;

               B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and

               C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
	
          2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
	
          3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
	
     b.	ShareAlike.In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.
	
          1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License.
	
          2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.
	
          3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.

Section 4 – Sui Generis Database Rights.

Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
	
     a.	for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
	
     b.	if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and
	
     c.	You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.

Section 5 – Disclaimer of Warranties and Limitation of Liability.
	
     a.	Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
	
     b.	To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
	
     c.	The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.

Section 6 – Term and Termination.
	
     a.	This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
	
     b.	Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
	
          1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
	
          2. upon express reinstatement by the Licensor.
	
     c.	For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
	
     d.	For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
	
     e.	Sections 1, 5, 6, 7, and 8 survive termination of this Public License.

Section 7 – Other Terms and Conditions.
	
     a.	The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
	
     b.	Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.

Section 8 – Interpretation.
	
     a.	For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
	
     b.	To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
	
     c.	No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
	
     d.	Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.


================================================
FILE: LICENSE-SAMPLECODE
================================================
Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: LICENSE-SUMMARY
================================================
Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. 

The documentation is made available under the Creative Commons Attribution-ShareAlike 4.0 International License. See the LICENSE file.

The sample code within this documentation is made available under the MIT-0 license. See the LICENSE-SAMPLECODE file.


================================================
FILE: Lab1/client/Application/.browserslistrc
================================================
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries

# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support

# You can see what browsers were selected by your queries by running:
#   npx browserslist

last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR


================================================
FILE: Lab1/client/Application/.editorconfig
================================================
# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false


================================================
FILE: Lab1/client/Application/.gitignore
================================================
# See http://help.github.com/ignore-files/ for more about ignoring files.

# Compiled output
/dist
/tmp
/out-tsc
/bazel-out

# Node
/node_modules
npm-debug.log
yarn-error.log

# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*

# Miscellaneous
/.angular/cache
.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings

# System files
.DS_Store
Thumbs.db

#amplify-do-not-edit-begin
amplify/\#current-cloud-backend
amplify/.config/local-*
amplify/logs
amplify/mock-data
amplify/backend/amplify-meta.json
amplify/backend/.temp
build/
dist/
node_modules/
aws-exports.js
awsconfiguration.json
amplifyconfiguration.json
amplifyconfiguration.dart
amplify-build-config.json
amplify-gradle-config.json
amplifytools.xcconfig
.secret-*
**.sample
#amplify-do-not-edit-end

#cypress
cypress/videos/*
cypress.env.json

# ignore yarn.lock and package-lock.json files for now
yarn.lock
package-lock.json


================================================
FILE: Lab1/client/Application/README.md
================================================
# Application

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.0.5.

## Development server

Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.

## Code scaffolding

Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.

## Build

Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.

## Running unit tests

Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).

## Running end-to-end tests

Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.

## Further help

To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.


================================================
FILE: Lab1/client/Application/angular.json
================================================
{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "cli": {
    "packageManager": "yarn",
    "analytics": false
  },
  "newProjectRoot": "projects",
  "projects": {
    "application": {
      "projectType": "application",
      "schematics": {
        "@schematics/angular:component": {
          "style": "scss"
        }
      },
      "root": "",
      "sourceRoot": "src",
      "prefix": "app",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.app.json",
            "inlineStyleLanguage": "scss",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/custom-theme.scss",
              "src/styles.scss"
            ],
            "scripts": []
          },
          "configurations": {
            "production": {
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "2mb",
                  "maximumError": "2mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb",
                  "maximumError": "4kb"
                }
              ],
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "outputHashing": "all"
            },
            "development": {
              "buildOptimizer": false,
              "optimization": false,
              "vendorChunk": true,
              "extractLicenses": false,
              "sourceMap": true,
              "namedChunks": true
            }
          },
          "defaultConfiguration": "production"
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "configurations": {
            "production": {
              "browserTarget": "application:build:production"
            },
            "development": {
              "browserTarget": "application:build:development"
            }
          },
          "defaultConfiguration": "development"
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "application:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.spec.json",
            "karmaConfig": "karma.conf.js",
            "inlineStyleLanguage": "scss",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": []
          }
        }
      }
    }
  }
}


================================================
FILE: Lab1/client/Application/karma.conf.js
================================================
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      jasmine: {
        // you can add configuration options for Jasmine here
        // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
        // for example, you can disable the random execution with `random: false`
        // or set a specific seed with `seed: 4321`
      },
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    jasmineHtmlReporter: {
      suppressAll: true // removes the duplicated traces
    },
    coverageReporter: {
      dir: require('path').join(__dirname, './coverage/Application'),
      subdir: '.',
      reporters: [
        { type: 'html' },
        { type: 'text-summary' }
      ]
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false,
    restartOnFileChange: true
  });
};


================================================
FILE: Lab1/client/Application/package.json
================================================
{
  "name": "application",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "watch": "ng build --watch --configuration development",
    "test": "ng test",
    "e2e": "npx cypress run"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~14.0.0",
    "@angular/cdk": "~14.0.4",
    "@angular/common": "~14.0.0",
    "@angular/compiler": "~14.0.0",
    "@angular/core": "~14.0.0",
    "@angular/forms": "~14.0.0",
    "@angular/material": "~14.0.4",
    "@angular/platform-browser": "~14.0.0",
    "@angular/platform-browser-dynamic": "~14.0.0",
    "@angular/router": "~14.0.0",
    "bootstrap": "~5.2.0",
    "chart.js": "~3.8.0",
    "chartjs-plugin-datalabels": "~2.0.0",
    "ng2-charts": "~4.0.0",
    "rxjs": "~7.5.0",
    "tslib": "~2.3.0",
    "zone.js": "~0.11.4"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~14.1.0",
    "@angular/cli": "~14.0.5",
    "@angular/compiler-cli": "~14.0.0",
    "@types/jasmine": "~4.0.0",
    "cypress": "~10.3.1",
    "jasmine-core": "~4.1.0",
    "karma": "~6.3.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage": "~2.2.0",
    "karma-jasmine": "~5.0.0",
    "karma-jasmine-html-reporter": "~1.7.0",
    "typescript": "~4.7.2"
  }
}


================================================
FILE: Lab1/client/Application/src/app/_nav.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { INavData } from './models';

export const navItems: INavData[] = [
  {
    name: 'Products',
    url: '/products',
    icon: 'sell',
  },
  {
    name: 'Orders',
    url: '/orders',
    icon: 'shopping_cart',
  },
];


================================================
FILE: Lab1/client/Application/src/app/app-routing.module.ts
================================================
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { NavComponent } from './nav/nav.component';
export const routes: Routes = [
  {
    path: '',
    redirectTo: 'dashboard',
    pathMatch: 'full',
  },
  {
    path: '',
    component: NavComponent,
    data: {
      title: 'Home',
    },
    children: [
      {
        path: '',
        loadChildren: () =>
          import('./views/dashboard/dashboard.module').then(
            (m) => m.DashboardModule
          ),
      },
      {
        path: 'orders',
        loadChildren: () =>
          import('./views/orders/orders.module').then((m) => m.OrdersModule),
      },
      {
        path: 'products',
        loadChildren: () =>
          import('./views/products/products.module').then(
            (m) => m.ProductsModule
          ),
      },
    ],
  },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
})
export class AppRoutingModule {}


================================================
FILE: Lab1/client/Application/src/app/app.component.scss
================================================


================================================
FILE: Lab1/client/Application/src/app/app.component.ts
================================================
import { Component } from '@angular/core';
import { MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer } from '@angular/platform-browser';

@Component({
  selector: 'app-root',
  template: ` <router-outlet></router-outlet> `,
  styleUrls: ['./app.component.scss'],
})
export class AppComponent {
  constructor(
    private matIconRegistry: MatIconRegistry,
    private domSanitizer: DomSanitizer
  ) {
    this.matIconRegistry.addSvgIcon(
      'saas-commerce',
      this.domSanitizer.bypassSecurityTrustResourceUrl('./assets/logo.svg')
    );
  }
  title = 'application';
}


================================================
FILE: Lab1/client/Application/src/app/app.module.ts
================================================
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HttpClientModule } from '@angular/common/http';
import { LayoutModule } from '@angular/cdk/layout';
import { HashLocationStrategy, LocationStrategy } from '@angular/common';

import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatNativeDateModule } from '@angular/material/core';
import { MatIconModule } from '@angular/material/icon';
import { MatListModule } from '@angular/material/list';
import { MatMenuModule } from '@angular/material/menu';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatToolbarModule } from '@angular/material/toolbar';

import { FormsModule, ReactiveFormsModule } from '@angular/forms';

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { NavComponent } from './nav/nav.component';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatDialogModule } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatRadioModule } from '@angular/material/radio';
import { MatSelectModule } from '@angular/material/select';
import { MatTableModule } from '@angular/material/table';

@NgModule({
  declarations: [AppComponent, NavComponent],
  imports: [
    AppRoutingModule,
    BrowserAnimationsModule,
    BrowserModule,
    HttpClientModule,
    LayoutModule,
    MatButtonModule,
    MatCardModule,
    MatGridListModule,
    MatIconModule,
    MatListModule,
    MatMenuModule,
    MatNativeDateModule,
    MatProgressSpinnerModule,
    MatSidenavModule,
    MatToolbarModule,
    MatSnackBarModule,
    FormsModule,
    ReactiveFormsModule,
    MatButtonModule,
    MatCardModule,
    MatIconModule,
    MatDatepickerModule,
    MatDialogModule,
    MatFormFieldModule,
    MatInputModule,
    MatRadioModule,
    MatSelectModule,
    MatTableModule,
  ],
  providers: [
    HttpClientModule,
    {
      provide: LocationStrategy,
      useClass: HashLocationStrategy,
    },
  ],
  bootstrap: [AppComponent],
})
export class AppModule {}


================================================
FILE: Lab1/client/Application/src/app/models/index.ts
================================================
export * from './interfaces';


================================================
FILE: Lab1/client/Application/src/app/models/interfaces.ts
================================================
export interface INavData {
  name?: string;
  url?: string | any[];
  href?: string;
  icon?: string;
  title?: boolean;
  children?: INavData[];
  variant?: string;
  divider?: boolean;
  class?: string;
}


================================================
FILE: Lab1/client/Application/src/app/nav/nav.component.html
================================================
<mat-sidenav-container fullscreen>
  <mat-sidenav
    [mode]="'side'"
    #drawer
    class="sidenav"
    fixedInViewport
    [attr.role]="(isHandset$ | async) ? 'dialog' : 'navigation'"
    [mode]="(isHandset$ | async) ? 'over' : 'side'"
    [opened]="(isHandset$ | async) === false"
  >
    <div class="sidebar-icon-container">
      <mat-icon svgIcon="saas-commerce" class="logo"></mat-icon>
    </div>
    <mat-divider></mat-divider>
    <mat-nav-list>
      <mat-list-item *ngFor="let navItem of navItems">
        <mat-icon mat-list-icon class="nav-icon material-symbols-outlined">{{
          navItem.icon
        }}</mat-icon>
        <a mat-list-item routerLink="{{ navItem.url }}">{{ navItem.name }}</a>
      </mat-list-item>
    </mat-nav-list>
  </mat-sidenav>
  <div class="content" #main>
    <router-outlet></router-outlet>
  </div>
  <div class="footer" #footer>
    <div class="footer-text">
      <span>Serverless SaaS Workshop &copy; 2022 AWS</span>
      <span class="spacer"></span>
      <span>
        Powered by <a href="https://aws.amazon.com">SaaS Factory</a>
      </span>
    </div>
  </div>
</mat-sidenav-container>



================================================
FILE: Lab1/client/Application/src/app/nav/nav.component.scss
================================================
.sidenav {
  width: 200px;
  background-color: #2f353a;
}

.mat-list-item {
  color: whitesmoke;
}

.sidebar-icon-container {
  height: 64px;
  background-color: whitesmoke;
  display: flex;
  align-items: center;
  justify-content: center;
}

.spacer {
  flex: 1 1 auto;
}

.material-symbols-outlined {
  font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 48;
}

.logo {
  width: 100px;
  height: auto;
}

.nav-icon {
  color: #20a8d8;
}

.footer {
  position: fixed;
  bottom: 0;
  width: 100%;
  height: 40px;
  background-color: whitesmoke;
  color: #2d3337;
  // text-align: center;
  margin: 0px;
}

.footer-text {
  display: flex;
}

.content {
  position: absolute;
  width: 100%;
  height: 90%;
  max-height: 90%;
  overflow: auto;
  background-color: lightgray;
}


================================================
FILE: Lab1/client/Application/src/app/nav/nav.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { from, Observable, of } from 'rxjs';
import { filter, map, shareReplay } from 'rxjs/operators';
import {
  NavigationCancel,
  NavigationEnd,
  NavigationError,
  NavigationStart,
  Router,
} from '@angular/router';

import { navItems } from '../_nav';

@Component({
  selector: 'app-nav',
  templateUrl: './nav.component.html',
  styleUrls: ['./nav.component.scss'],
})
export class NavComponent implements OnInit {
  loading$: Observable<boolean> = of(false);
  public navItems = navItems;
  isHandset$: Observable<boolean> = this.breakpointObserver
    .observe(Breakpoints.Handset)
    .pipe(
      map((result) => result.matches),
      shareReplay()
    );

  constructor(
    private breakpointObserver: BreakpointObserver,
    private router: Router
  ) {
    // this.configSvc.loadConfigurations().subscribe((val) => console.log(val));
    this.loading$ = this.router.events.pipe(
      filter(
        (e) =>
          e instanceof NavigationStart ||
          e instanceof NavigationEnd ||
          e instanceof NavigationCancel ||
          e instanceof NavigationError
      ),
      map((e) => e instanceof NavigationStart)
    );
  }

  ngOnInit(): void {}
}


================================================
FILE: Lab1/client/Application/src/app/views/dashboard/dashboard-routing.module.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { DashboardComponent } from './dashboard.component';

const routes: Routes = [
  {
    path: '',
    component: DashboardComponent,
    data: {
      title: 'Dashboard',
    },
  },
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule],
})
export class DashboardRoutingModule {}


================================================
FILE: Lab1/client/Application/src/app/views/dashboard/dashboard.component.html
================================================
<div class="grid-container">
  <h1 class="mat-h1">Dashboard</h1>
  <mat-grid-list cols="2" rowHeight="350px">
    <mat-grid-tile
      *ngFor="let card of cards | async"
      [colspan]="card.cols"
      [rowspan]="card.rows"
    >
      <mat-card class="dashboard-card">
        <mat-card-header>
          <mat-card-title>
            {{ card.title }}
            <button
              mat-icon-button
              class="more-button"
              [matMenuTriggerFor]="menu"
              aria-label="Toggle menu"
            >
              <mat-icon>more_vert</mat-icon>
            </button>
            <mat-menu #menu="matMenu" xPosition="before">
              <button mat-menu-item>Expand</button>
              <button mat-menu-item>Remove</button>
            </mat-menu>
          </mat-card-title>
        </mat-card-header>
        <mat-card-content>
          <div class="chart-wrapper chart-container">
            <canvas
              baseChart
              [data]="barChartData"
              [options]="barChartOptions"
              [plugins]="barChartPlugins"
              [type]="barChartType"
            >
            </canvas>
          </div>
        </mat-card-content>
      </mat-card>
    </mat-grid-tile>
  </mat-grid-list>
</div>


================================================
FILE: Lab1/client/Application/src/app/views/dashboard/dashboard.component.scss
================================================
.grid-container {
  margin: 20px;
}

.dashboard-card {
  position: absolute;
  top: 15px;
  left: 15px;
  right: 15px;
  bottom: 15px;
}

.more-button {
  position: absolute;
  top: 5px;
  right: 10px;
  border: none;
}

.dashboard-card-content {
  text-align: center;
}


================================================
FILE: Lab1/client/Application/src/app/views/dashboard/dashboard.component.ts
================================================
import { Component, ViewChild } from '@angular/core';
import { map } from 'rxjs/operators';
import { Breakpoints, BreakpointObserver } from '@angular/cdk/layout';
import { ChartConfiguration, ChartData, ChartEvent, ChartType } from 'chart.js';
import { BaseChartDirective } from 'ng2-charts';

import DataLabelsPlugin from 'chartjs-plugin-datalabels';
@Component({
  selector: 'app-dashboard',
  templateUrl: './dashboard.component.html',
  styleUrls: ['./dashboard.component.scss'],
})
export class DashboardComponent {
  @ViewChild(BaseChartDirective) chart: BaseChartDirective | undefined;

  public barChartOptions: ChartConfiguration['options'] = {
    responsive: true,
    maintainAspectRatio: false,
    // We use these empty structures as placeholders for dynamic theming.
    scales: {
      x: {},
      y: {
        min: 10,
      },
    },
    plugins: {
      legend: {
        display: true,
      },
      datalabels: {
        anchor: 'end',
        align: 'end',
      },
    },
  };
  public barChartType: ChartType = 'bar';
  public barChartPlugins = [DataLabelsPlugin];

  public barChartData: ChartData<'bar'> = {
    labels: ['2006', '2007', '2008', '2009', '2010', '2011', '2012'],
    datasets: [
      { data: [65, 59, 80, 81, 56, 55, 40], label: 'Series A' },
      { data: [28, 48, 40, 19, 86, 27, 90], label: 'Series B' },
    ],
  };

  // events
  public chartClicked({
    event,
    active,
  }: {
    event?: ChartEvent;
    active?: {}[];
  }): void {}

  public chartHovered({
    event,
    active,
  }: {
    event?: ChartEvent;
    active?: {}[];
  }): void {}

  public randomize(): void {
    // Only Change 3 values
    this.barChartData.datasets[0].data = [
      Math.round(Math.random() * 100),
      59,
      80,
      Math.round(Math.random() * 100),
      56,
      Math.round(Math.random() * 100),
      40,
    ];

    this.chart?.update();
  }
  /** Based on the screen size, switch from standard to one column per row */
  cards = this.breakpointObserver.observe(Breakpoints.Handset).pipe(
    map(({ matches }) => {
      if (matches) {
        return [
          { title: 'Card 1', cols: 1, rows: 1 },
          { title: 'Card 2', cols: 1, rows: 1 },
          { title: 'Card 3', cols: 1, rows: 1 },
          { title: 'Card 4', cols: 1, rows: 1 },
        ];
      }

      return [
        { title: 'Card 1', cols: 2, rows: 1 },
        { title: 'Card 2', cols: 1, rows: 1 },
        { title: 'Card 3', cols: 1, rows: 2 },
        { title: 'Card 4', cols: 1, rows: 1 },
      ];
    })
  );

  constructor(private breakpointObserver: BreakpointObserver) {}
}


================================================
FILE: Lab1/client/Application/src/app/views/dashboard/dashboard.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DashboardComponent } from './dashboard.component';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatIconModule } from '@angular/material/icon';
import { MatListModule } from '@angular/material/list';
import { MatMenuModule } from '@angular/material/menu';

import { NgChartsModule } from 'ng2-charts';

import { DashboardRoutingModule } from './dashboard-routing.module';

@NgModule({
  declarations: [DashboardComponent],
  imports: [
    CommonModule,
    DashboardRoutingModule,
    MatButtonModule,
    MatCardModule,
    MatGridListModule,
    MatIconModule,
    MatListModule,
    MatMenuModule,
    NgChartsModule,
  ],
})
export class DashboardModule {}


================================================
FILE: Lab1/client/Application/src/app/views/orders/create/create.component.html
================================================
<div class="order-form container">
  <div class="row">
    <div class="col-md-6">
      <form [formGroup]="orderForm" (submit)="submit()">
        <mat-card class="card">
          <mat-card-title>Create new order</mat-card-title>
          <mat-card-content>
            <mat-form-field>
              <mat-label>Enter order name</mat-label>
              <input
                matInput
                placeholder="order name"
                formControlName="orderName"
                required
              />
              <mat-error *ngIf="name?.invalid">Name is required</mat-error>
            </mat-form-field>
            <div class="order-products">
              <div *ngFor="let op of orderProducts" class="row">
                <div class="col-6">{{ op.product.name }}</div>
                <div class="col-3">{{ op.product.price | currency }}</div>
                <div class="col-1">{{ op.quantity || 0 }}</div>
                <div class="col-1">
                  <button
                    mat-mini-fab
                    color="primary"
                    aria-label="Icon button with add icon"
                    (click)="add(op)"
                  >
                    <mat-icon>add</mat-icon>
                  </button>
                </div>
                <div class="col-1">
                  <button
                    mat-mini-fab
                    color="warn"
                    aria-label="Icon button with remove icon"
                    (click)="remove(op)"
                  >
                    <mat-icon>remove</mat-icon>
                  </button>
                </div>
              </div>
              <mat-card *ngIf="isLoadingProducts" style="display: flex; justify-content: center; align-items: center">
                <mat-progress-spinner
                  color="primary"
                  mode="indeterminate"
                  diameter="15"
                >
                </mat-progress-spinner>
              </mat-card>
        
            </div>
            <mat-card-footer>
              <div class="button-panel">
                <button
                  mat-raised-button
                  color="primary"
                  type="submit"
                  [disabled]="!orderForm.valid || !productQuantity"
                >
                  Submit
                </button>
                <button
                  mat-raised-button
                  color="warn"
                  [routerLink]="['/orders']"
                  type="button"

                >
                  Cancel
                </button>
              </div>
            </mat-card-footer>
          </mat-card-content>
        </mat-card>
      </form>
    </div>
  </div>
</div>


================================================
FILE: Lab1/client/Application/src/app/views/orders/create/create.component.scss
================================================
// .card {
//   margin: 20px;
//   display: flex;
//   flex-direction: column;
//   align-items: flex-start;
// }

.order-form {
  margin: 20px;
  display: flex;
  flex-direction: column;
}

.mat-card-title {
  display: flex;
  justify-content: center;
}

.button-panel {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 8px;
}

.row {
  width: 100%;
  align-items: center;
}

button {
  margin: 4px;
}


================================================
FILE: Lab1/client/Application/src/app/views/orders/create/create.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { Product } from '../../products/models/product.interface';
import { ProductService } from '../../products/product.service';
import { Order } from '../models/order.interface';
import { OrdersService } from '../orders.service';

interface LineItem {
  product: Product;
  quantity?: number;
}
@Component({
  selector: 'app-create',
  templateUrl: './create.component.html',
  styleUrls: ['./create.component.scss'],
})
export class CreateComponent implements OnInit {
  displayedColumns = [];
  orderForm: FormGroup;
  orderProducts: LineItem[] = [];
  isLoadingProducts: boolean = true;
  error = '';
  constructor(
    private fb: FormBuilder,
    private productSvc: ProductService,
    private orderSvc: OrdersService,
    private router: Router
  ) {
    this.orderForm = this.fb.group({
      name: ['', Validators.required],
    });
  }

  ngOnInit(): void {
    this.productSvc.fetch().subscribe((products) => {
      this.orderProducts = products.map((p) => ({ product: p }));
      this.isLoadingProducts = false;
    });
    this.orderForm = this.fb.group({
      orderName: ['', Validators.required],
    });
  }

  get name() {
    return this.orderForm.get('name');
  }

  get productQuantity() {
    return this.orderProducts
        .filter((p) => !!p.quantity).length > 0;
  }

  add(op: LineItem) {
    const orderProduct = this.orderProducts.find(
      (p) => p?.product.productId === op.product.productId
    );
    this.orderProducts = this.orderProducts.map((p) => {
      if (p.product?.productId === orderProduct?.product?.productId) {
        p = {
          ...orderProduct,
          quantity: orderProduct.quantity ? orderProduct.quantity + 1 : 1,
        };
      }
      return p;
    });
  }

  remove(op: LineItem) {
    const orderProduct = this.orderProducts.find(
      (p) => p?.product.productId === op.product.productId
    );
    this.orderProducts = this.orderProducts.map((p) => {
      if (p.product?.productId === orderProduct?.product?.productId) {
        p = {
          ...orderProduct,
          quantity:
            orderProduct.quantity && orderProduct.quantity > 1
              ? orderProduct.quantity - 1
              : undefined,
        };
      }
      return p;
    });
  }

  submit() {
    const val: Order = {
      ...this.orderForm?.value,
      orderProducts: this.orderProducts
        .filter((p) => !!p.quantity)
        .map((p) => ({
          productId: p.product.productId,
          price: p.product.price,
          quantity: p.quantity,
        })),
    };
    this.orderSvc.create(val).subscribe(() => this.router.navigate(['orders']));
  }
}


================================================
FILE: Lab1/client/Application/src/app/views/orders/detail/detail.component.html
================================================
<div class="container invoice">
  <div class="invoice-header">
    <div class="row">
      <div class="col-xs-8">
        <h1>Order Details <small>mostly made up</small></h1>
        <h5 class="text-muted">
          NO: {{ orderId$ | async }} | Date: {{ today() | date }}
        </h5>
      </div>
      <div class="col-xs-4">
        <div class="media">
          <div class="media-left">
            <img class="media-object logo" src="assets/logo.svg" />
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="invoice-body">
    <div class="row">
      <div class="card">
        <div class="card-header">
          <h3>Services / Products</h3>
        </div>
        <table class="table table-bordered table-responsive no-bottom-margin">
          <thead>
            <tr>
              <th>Item / Details</th>
              <th class="text-center colfix">Unit Cost</th>
              <th class="text-center colfix">Sum Cost</th>
              <th class="text-center colfix">Discount</th>
              <th class="text-center colfix">Tax</th>
              <th class="text-center colfix">Total</th>
            </tr>
          </thead>
          <tbody>
            <tr *ngFor="let op of orderProducts$ | async">
              <td class="nowrap">
                {{ op.productId }}
                <br />
              </td>
              <td class="text-right">
                <span class="mono">{{ op.price | currency }}</span>
                <br />
                <small class="text-muted">Before Tax</small>
              </td>
              <td class="text-right">
                <span class="mono">{{ sum(op) | currency }}</span>
                <br />
                <small class="text-muted">{{ op.quantity }} Units</small>
              </td>
              <td class="text-right">
                <span class="mono">$0.00</span>
                <br />
                <small class="text-muted">None</small>
              </td>
              <td class="text-right nowrap">
                <span class="mono">{{ tax(op) | currency }}</span>
                <br />
                <small class="text-muted">Sales Tax 8.9%</small>
              </td>
              <td class="text-right">
                <strong class="mono">{{ total(op) | currency }}</strong>
                <br />
              </td>
            </tr>
          </tbody>
        </table>
      </div>
      <div>
        <table
          *ngIf="order$ | async as order"
          class="table table-bordered table-condensed"
        >
          <thead>
            <tr>
              <td class="text-center col-xs-1">Sub Total</td>
              <td class="text-center col-xs-1">Discount</td>
              <td class="text-center col-xs-1">Total</td>
              <td class="text-center col-xs-1">Tax</td>
              <td class="text-center col-xs-1">Final</td>
            </tr>
          </thead>
          <tbody>
            <tr>
              <th class="text-center rowtotal mono">
                {{ subTotal(order) | currency }}
              </th>
              <th class="text-center rowtotal mono">-$0.00</th>
              <th class="text-center rowtotal mono">
                {{ subTotal(order) | currency }}
              </th>
              <th class="text-center rowtotal mono">
                {{ calcTax(order) | currency }}
              </th>
              <th class="text-center rowtotal mono">
                {{ final(order) | currency }}
              </th>
            </tr>
          </tbody>
        </table>
      </div>
    </div>
    <div class="row">
      <div class="col-xs-7">
        <div class="card">
          <div class="card-body">
            <i>Comments / Notes</i>
            <hr style="margin: 3px 0 5px" />
            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Odit
            repudiandae numquam sit facere blanditiis, quasi distinctio ipsam?
            Libero odit ex expedita, facere sunt, possimus consectetur dolore,
            nobis iure amet vero.
          </div>
        </div>
      </div>
    </div>
    <div class="invoice-footer">
      Thank you for choosing the Serverless SaaS Reference Architecture.
      <br />
      We hope to see you again soon
      <br />
      <strong>AWS</strong>
    </div>
  </div>
</div>


================================================
FILE: Lab1/client/Application/src/app/views/orders/detail/detail.component.scss
================================================
/*
 * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this
 * software and associated documentation files (the "Software"), to deal in the Software
 * without restriction, including without limitation the rights to use, copy, modify,
 * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
.no-bottom-margin {
  margin-bottom: 0;
}

.nowrap {
  white-space: nowrap;
}

.invoice {
  font-family: Arial, Helvetica, sans-serif;
  width: 970px !important;
  margin: 50px auto;
  .invoice-header {
    padding: 25px 25px 15px;
    h1 {
      margin: 0;
    }
    .media {
      .media-body {
        font-size: 0.9em;
        margin: 0;
      }
    }
  }
  .invoice-body {
    border-radius: 10px;
    padding: 25px;
    background: #fff;
  }
  .invoice-footer {
    padding: 15px;
    font-size: 0.9em;
    text-align: center;
    color: #999;
  }
}
.logo {
  max-height: 70px;
  border-radius: 10px;
}
.dl-horizontal {
  margin: 0;
  dt {
    float: left;
    width: 80px;
    overflow: hidden;
    clear: left;
    text-align: right;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  dd {
    margin-left: 90px;
  }
}
.rowamount {
  padding-top: 15px !important;
}
.rowtotal {
  font-size: 1.3em;
}
.colfix {
  width: 12%;
}
.mono {
  font-family: monospace;
}


================================================
FILE: Lab1/client/Application/src/app/views/orders/detail/detail.component.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Observable } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
import { Order } from '../models/order.interface';
import { OrderProduct } from '../models/orderproduct.interface';
import { OrdersService } from '../orders.service';
@Component({
  selector: 'app-detail',
  templateUrl: './detail.component.html',
  styleUrls: ['./detail.component.scss'],
})
export class DetailComponent implements OnInit {
  orderId$: Observable<string> | undefined;
  order$: Observable<Order> | undefined;
  orderProducts$: Observable<OrderProduct[]> | undefined;
  taxRate = 0.0899;
  constructor(private route: ActivatedRoute, private orderSvc: OrdersService) {}

  ngOnInit(): void {
    this.orderId$ = this.route.params.pipe(map((o) => o['orderId']));
    this.order$ = this.orderId$.pipe(switchMap((o) => this.orderSvc.get(o)));
    this.orderProducts$ = this.order$.pipe(map((o) => o.orderProducts));
  }

  today() {
    return new Date();
  }

  sum(op: OrderProduct) {
    return op.price * op.quantity;
  }

  tax(op: OrderProduct) {
    return this.sum(op) * this.taxRate;
  }

  total(op: OrderProduct) {
    return this.sum(op) + this.tax(op);
  }

  subTotal(order: Order) {
    return order.orderProducts
      .map((op) => op.price * op.quantity)
      .reduce((acc, curr) => acc + curr);
  }

  calcTax(order: Order) {
    return this.subTotal(order) * this.taxRate;
  }

  final(order: Order) {
    return this.subTotal(order) + this.calcTax(order);
  }
}


================================================
FILE: Lab1/client/Application/src/app/views/orders/list/list.component.html
================================================
<div class="order-list">
  <h2>Order List</h2>
  <div class="row">
    <div class="col-md-6">
      <table mat-table [dataSource]="orderData" class="mat-elevation-z1">
        <!-- Name Column -->
        <ng-container matColumnDef="name">
          <th mat-header-cell *matHeaderCellDef>Name</th>
          <td mat-cell *matCellDef="let element">
            <a class="link" routerLink="/orders/detail/{{ element.orderId }}">
              {{ element.orderName }}
            </a>
          </td>
        </ng-container>

        <ng-container matColumnDef="lineItems">
          <th mat-header-cell *matHeaderCellDef>Line Items</th>
          <td mat-cell *matCellDef="let element">
            {{ element.orderProducts?.length }}
          </td>
        </ng-container>

        <ng-container matColumnDef="total">
          <th mat-header-cell *matHeaderCellDef>Total</th>
          <td mat-cell *matCellDef="let element">
            {{ sum(element) | currency }}
          </td>
        </ng-container>

        <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
      </table>
      <mat-card *ngIf="isLoading" style="display: flex; justify-content: center; align-items: center">
        <mat-progress-spinner
          color="primary"
          mode="indeterminate"
          diameter="15"
        >
        </mat-progress-spinner>
      </mat-card>
      <div class="button-panel">
        <button
          routerLink="/orders/create"
          routerLinkActive="router-link-active"
          mat-raised-button
          color="primary"
        >
          Create Order
        </button>
      </div>
    </div>
  </div>
</div>


================================================
FILE: Lab1/client/Application/src/app/views/orders/list/list.component.scss
================================================
.order-list {
  margin: 20px;
}
table {
  width: 100%;
}

.button-panel {
  margin-top: 20px;
}


================================================
FILE: Lab1/client/Application/src/app/views/orders/list/list.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Order } from '../models/order.interface';
import { OrdersService } from '../orders.service';

@Component({
  selector: 'app-list',
  templateUrl: './list.component.html',
  styleUrls: ['./list.component.scss'],
})
export class ListComponent implements OnInit {
  displayedColumns: string[] = ['name', 'lineItems', 'total'];
  orderData: Order[] = [];
  isLoading: boolean = true;
  constructor(private orderSvc: OrdersService, private router: Router) {}

  ngOnInit(): void {
    this.orderSvc.fetch().subscribe((data) => {
      this.isLoading = false;
      this.orderData = data;
    });
  }

  sum(order: Order): number {
    return order.orderProducts
      .map((p) => p.price * p.quantity)
      .reduce((acc, curr) => acc + curr);
  }
}


================================================
FILE: Lab1/client/Application/src/app/views/orders/models/order.interface.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { OrderProduct } from './orderproduct.interface';

export interface Order {
  key: string;
  orderId: string;
  orderName: string;
  orderProducts: OrderProduct[];
}


================================================
FILE: Lab1/client/Application/src/app/views/orders/models/orderproduct.interface.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
export interface OrderProduct {
  productId: string;
  price: number;
  quantity: number;
}


================================================
FILE: Lab1/client/Application/src/app/views/orders/orders-routing.module.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { CreateComponent } from './create/create.component';
import { DetailComponent } from './detail/detail.component';
import { ListComponent } from './list/list.component';

const routes: Routes = [
  {
    path: '',
    redirectTo: 'list',
    pathMatch: 'full',
  },
  {
    path: 'list',
    data: {
      title: 'All Orders',
    },
    component: ListComponent,
  },
  {
    path: 'create',
    data: {
      title: 'Create Order',
    },
    component: CreateComponent,
  },
  {
    path: 'detail/:orderId',
    data: {
      title: 'View Order Detail',
    },
    component: DetailComponent,
  },
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule],
})
export class OrdersRoutingModule {}


================================================
FILE: Lab1/client/Application/src/app/views/orders/orders.module.ts
================================================
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';

import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatDialogModule } from '@angular/material/dialog';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';

import {
  MatFormFieldModule,
  MAT_FORM_FIELD_DEFAULT_OPTIONS,
} from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatRadioModule } from '@angular/material/radio';
import { MatSelectModule } from '@angular/material/select';
import { MatTableModule } from '@angular/material/table';

import { CreateComponent } from './create/create.component';
import { DetailComponent } from './detail/detail.component';
import { ListComponent } from './list/list.component';
import { OrdersRoutingModule } from './orders-routing.module';

@NgModule({
  declarations: [CreateComponent, ListComponent, DetailComponent],
  imports: [
    CommonModule,
    OrdersRoutingModule,
    ReactiveFormsModule,
    MatButtonModule,
    MatCardModule,
    MatDatepickerModule,
    MatDialogModule,
    MatFormFieldModule,
    MatIconModule,
    MatInputModule,
    MatRadioModule,
    MatSelectModule,
    MatTableModule,
    MatProgressSpinnerModule,
  ],
  providers: [
    {
      provide: MAT_FORM_FIELD_DEFAULT_OPTIONS,
      useValue: { appearance: 'outline' },
    },
  ],
})
export class OrdersModule {}


================================================
FILE: Lab1/client/Application/src/app/views/orders/orders.service.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { environment } from 'src/environments/environment';
import { Order } from './models/order.interface';

@Injectable({
  providedIn: 'root',
})
export class OrdersService {
  orders: Order[] = [];
  baseUrl = environment.apiGatewayUrl;
  constructor(private http: HttpClient) {}

  fetch(): Observable<Order[]> {
    return this.http.get<Order[]>(`${this.baseUrl}/orders`);
  }

  get(orderId: string): Observable<Order> {
    const url = `${this.baseUrl}/order/${orderId}`;
    return this.http.get<Order>(url);
  }

  create(order: Order): Observable<Order> {
    return this.http.post<Order>(`${this.baseUrl}/order`, order);
  }
}


================================================
FILE: Lab1/client/Application/src/app/views/products/create/create.component.html
================================================
<div class="product-form">
  <form [formGroup]="productForm" (submit)="submit()">
    <mat-card class="card">
      <mat-card-title>Create new Product</mat-card-title>
      <mat-card-content>
        <mat-form-field>
          <mat-label>Enter product name</mat-label>
          <input
            matInput
            placeholder="Product name"
            formControlName="name"
            required
          />
          <mat-error *ngIf="name?.invalid">Name is required</mat-error>
        </mat-form-field>
        <mat-form-field>
          <mat-label>Enter product price</mat-label>
          <input
            type="number"
            matInput
            placeholder="Product price"
            formControlName="price"
            required
          />
          <mat-error *ngIf="price?.invalid">Price is required</mat-error>
        </mat-form-field>
        <mat-form-field>
          <mat-label>SKU</mat-label>
          <input
            matInput
            type="text"
            formControlName="sku"
            placeholder="Enter product sku"
          />
        </mat-form-field>
        <mat-form-field>
          <mat-label>Category</mat-label>
          <mat-select
            formControlName="category"
            required
          >
            <mat-option *ngFor="let category of categories" [value]="category">
              {{category}}
            </mat-option>
          </mat-select>
        </mat-form-field>
        <mat-card-footer>
          <div class="button-panel">
            <button
              mat-raised-button
              color="primary"
              (click)="(submit)"
              [disabled]="!productForm.valid"
            >
              Submit
            </button>
            <button mat-raised-button color="warn" (click)="cancel()">
              Cancel
            </button>
          </div>
        </mat-card-footer>
      </mat-card-content>
    </mat-card>
  </form>
</div>


================================================
FILE: Lab1/client/Application/src/app/views/products/create/create.component.scss
================================================
.card {
  margin: 20px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

.product-form {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

.mat-form-field {
  display: flex;
}

.button-panel {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 8px;
}

button {
  margin: 4px;
}


================================================
FILE: Lab1/client/Application/src/app/views/products/create/create.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Router } from '@angular/router';

import { ProductService } from '../product.service';

@Component({
  selector: 'app-create',
  templateUrl: './create.component.html',
  styleUrls: ['./create.component.scss'],
})
export class CreateComponent implements OnInit {
  productForm: FormGroup;
  categories: string[] = ['category1', 'category2', 'category3', 'category4'];
  constructor(
    private fb: FormBuilder,
    private productSvc: ProductService,
    private router: Router
  ) {
    this.productForm = this.fb.group({});
  }

  ngOnInit(): void {
    this.productForm = this.fb.group({
      name: ['', Validators.required],
      price: ['', Validators.required],
      sku: '',
      category: '',
    });
  }

  get name() {
    return this.productForm.get('name');
  }

  get price() {
    return this.productForm.get('price');
  }

  submit() {
    this.productSvc.post(this.productForm.value).subscribe({
      next: () => this.router.navigate(['products']),
      error: (err) => {
        alert(err.message);
        console.error(err);
      },
    });
  }

  cancel() {
    this.router.navigate(['products']);
  }
}


================================================
FILE: Lab1/client/Application/src/app/views/products/edit/edit.component.html
================================================
<div class="product-form">
  <form [formGroup]="productForm" (submit)="submit()">
    <mat-card class="card">
      <mat-card-title>Edit Product</mat-card-title>
      <mat-card-content>
        <mat-form-field>
          <mat-label>Product ID</mat-label>
          <input
            matInput
            value="{{ productId$ | async }}"
            [readonly]="true"
          />
        </mat-form-field>
        <mat-form-field>
          <mat-label>Enter product name</mat-label>
          <input
            matInput
            placeholder="Product name"
            formControlName="name"
            required
          />
          <mat-error *ngIf="name?.invalid">Name is required</mat-error>
        </mat-form-field>
        <mat-form-field>
          <mat-label>Enter product price</mat-label>
          <input
            type="number"
            matInput
            placeholder="Product price"
            formControlName="price"
            required
          />
          <mat-error *ngIf="price?.invalid">Price is required</mat-error>
        </mat-form-field>
        <mat-form-field>
          <mat-label>SKU</mat-label>
          <input
            matInput
            type="text"
            formControlName="sku"
            placeholder="Enter product sku"
          />
        </mat-form-field>
        <mat-form-field>
          <mat-label>Category</mat-label>
          <mat-select formControlName="category" required>
            <mat-option *ngFor="let category of categories" [value]="category">
              {{ category }}
            </mat-option>
          </mat-select>
        </mat-form-field>
        <mat-card-footer>
          <div class="button-panel">
            <button
              mat-raised-button
              color="primary"
              (click)="(submit)"
              [disabled]="!productForm.valid"
            >
              Submit
            </button>
            <button mat-raised-button color="warn" (click)="cancel()">
              Cancel
            </button>
          </div>
        </mat-card-footer>
      </mat-card-content>
    </mat-card>
  </form>
</div>


================================================
FILE: Lab1/client/Application/src/app/views/products/edit/edit.component.scss
================================================
.card {
  margin: 20px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

.product-form {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

.mat-form-field {
  display: flex;
}

.button-panel {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 8px;
}

button {
  margin: 4px;
}


================================================
FILE: Lab1/client/Application/src/app/views/products/edit/edit.component.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { Observable, of } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
import { Product } from '../models/product.interface';
import { ProductService } from '../product.service';

@Component({
  selector: 'app-edit',
  templateUrl: './edit.component.html',
  styleUrls: ['./edit.component.scss'],
})
export class EditComponent implements OnInit {
  productForm: FormGroup;
  categories: string[] = ['category1', 'category2', 'category3', 'category4'];
  product$: Observable<Product | undefined> | undefined;
  productId$: Observable<string> | undefined;
  productName$: Observable<string | undefined> | undefined;

  constructor(
    private fb: FormBuilder,
    private productSvc: ProductService,
    private router: Router,
    private route: ActivatedRoute
  ) {
    this.productForm = this.fb.group({});
  }

  ngOnInit(): void {
    this.productForm = this.fb.group({
      shardId: [],
      productId: [],
      name: ['', Validators.required],
      price: ['', Validators.required],
      sku: '',
      category: '',
    });

    this.productId$ = this.route.params.pipe(map((p) => p['productId']));
    this.product$ = this.productId$.pipe(
      switchMap((p) => this.productSvc.get(p))
    );
    this.productName$ = this.product$.pipe(map((p) => p?.name));

    this.product$.subscribe((val) => {
      this.productForm?.patchValue({
        ...val,
      });
    });
  }

  get name() {
    return this.productForm?.get('name');
  }

  get price() {
    return this.productForm?.get('price');
  }

  submit() {
    this.productSvc.put(this.productForm?.value).subscribe({
      next: () => this.router.navigate(['products']),
      error: (err) => console.error(err),
    });
  }

  delete() {
    this.productSvc.delete(this.productForm?.value).subscribe({
      next: () => this.router.navigate(['products']),
      error: (err) => {
        alert(err);
        console.error(err);
      },
    });
  }

  cancel() {
    this.router.navigate(['products']);
  }
}


================================================
FILE: Lab1/client/Application/src/app/views/products/list/list.component.html
================================================
<div class="product-list">
  <h2>Product List</h2>
  <div class="row">
    <div class="col-md-6">
      <table mat-table [dataSource]="productData" class="mat-elevation-z1">
        <!-- Name Column -->
        <ng-container matColumnDef="name">
          <th mat-header-cell *matHeaderCellDef>Name</th>
          <td mat-cell *matCellDef="let element">
            <a class="link" routerLink="/products/edit/{{ element.productId }}">
              {{ element.name }}
            </a>
          </td>
        </ng-container>

        <!-- Price Column -->
        <ng-container matColumnDef="price">
          <th mat-header-cell *matHeaderCellDef>Price</th>
          <td mat-cell *matCellDef="let element">
            {{ element.price | currency }}
          </td>
        </ng-container>

        <!-- Description Column -->
        <ng-container matColumnDef="sku">
          <th mat-header-cell *matHeaderCellDef>SKU</th>
          <td mat-cell *matCellDef="let element">{{ element.sku }}</td>
        </ng-container>

        <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
      </table>
      <mat-card *ngIf="isLoading" style="display: flex; justify-content: center; align-items: center">
        <mat-progress-spinner
          color="primary"
          mode="indeterminate"
          diameter="15"
        >
        </mat-progress-spinner>
      </mat-card>
      <div class="button-panel">
        <button (click)="onCreate()" mat-raised-button color="primary">
          Create Product
        </button>
      </div>
    </div>
  </div>
</div>


================================================
FILE: Lab1/client/Application/src/app/views/products/list/list.component.scss
================================================
.product-list {
  margin: 20px;
}
table {
  width: 100%;
}

.button-panel {
  margin-top: 20px;
}


================================================
FILE: Lab1/client/Application/src/app/views/products/list/list.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { Product } from '../models/product.interface';
import { ProductService } from '../product.service';

@Component({
  selector: 'app-list',
  templateUrl: './list.component.html',
  styleUrls: ['./list.component.scss'],
})
export class ListComponent implements OnInit {
  productData: Product[] = [];
  isLoading: boolean = true;
  displayedColumns: string[] = ['name', 'price', 'sku'];

  constructor(private productSvc: ProductService, private router: Router) {}

  ngOnInit(): void {
    this.productSvc.fetch().subscribe((data) => {
      this.productData = data;
      this.isLoading = false;
    });
  }

  onEdit(product: Product) {
    this.router.navigate(['products', 'edit', product.productId]);
    return false;
  }

  onRemove(product: Product) {
    this.productSvc.delete(product);
    this.isLoading = true;
    this.productSvc.fetch().subscribe((data) => {
      this.productData = data;
      this.isLoading = false;
    });
  }

  onCreate() {
    this.router.navigate(['products', 'create']);
  }
}


================================================
FILE: Lab1/client/Application/src/app/views/products/models/product.interface.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
export interface Product {
  key: string;
  shardId: string;
  productId: string;
  name: string;
  price: number;
  sku: string;
  category: string;
  pictureUrl?: string;
}


================================================
FILE: Lab1/client/Application/src/app/views/products/product.service.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { environment } from 'src/environments/environment';
import { Product } from './models/product.interface';

@Injectable({
  providedIn: 'root',
})
export class ProductService {
  constructor(private http: HttpClient) {}
  baseUrl = environment.apiGatewayUrl;

  fetch(): Observable<Product[]> {
    return this.http.get<Product[]>(`${this.baseUrl}/products`);
  }

  get(productId: string): Observable<Product> {
    const url = `${this.baseUrl}/product/${productId}`;
    return this.http.get<Product>(url);
  }

  delete(product: Product) {
    const url = `${this.baseUrl}/product/${product.productId}`;
    return this.http.delete<Product>(url);
  }

  put(product: Product) {
    const url = `${this.baseUrl}/product/${product.productId}`;
    return this.http.put<Product>(url, product);
  }

  post(product: Product) {
    return this.http.post<Product>(`${this.baseUrl}/product`, product);
  }
}


================================================
FILE: Lab1/client/Application/src/app/views/products/products-routing.module.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { CreateComponent } from './create/create.component';
import { EditComponent } from './edit/edit.component';
import { ListComponent } from './list/list.component';

const routes: Routes = [
  {
    path: '',
    redirectTo: 'list',
    pathMatch: 'prefix',
  },
  {
    path: 'list',
    data: {
      title: 'Product List',
    },
    component: ListComponent,
  },
  {
    path: 'create',
    data: {
      title: 'Create new Product',
    },
    component: CreateComponent,
  },
  {
    path: 'edit/:productId',
    data: {
      title: 'Edit Product',
    },
    component: EditComponent,
  },
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule],
})
export class ProductsRoutingModule {}


================================================
FILE: Lab1/client/Application/src/app/views/products/products.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { MatCardModule } from '@angular/material/card';
import { MatDatepickerModule } from '@angular/material/datepicker';
import {
  MatFormFieldModule,
  MAT_FORM_FIELD_DEFAULT_OPTIONS,
} from '@angular/material/form-field';
import { MatButtonModule } from '@angular/material/button';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { MatRadioModule } from '@angular/material/radio';
import { MatDialogModule } from '@angular/material/dialog';
import { MatTableModule } from '@angular/material/table';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';

import { ProductsRoutingModule } from './products-routing.module';
import { CreateComponent } from './create/create.component';
import { EditComponent } from './edit/edit.component';
import { ListComponent } from './list/list.component';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';

@NgModule({
  declarations: [CreateComponent, EditComponent, ListComponent],
  imports: [
    CommonModule,
    ReactiveFormsModule,
    ProductsRoutingModule,
    MatButtonModule,
    MatCardModule,
    MatDatepickerModule,
    MatDialogModule,
    MatFormFieldModule,
    MatInputModule,
    MatRadioModule,
    MatSelectModule,
    MatTableModule,
    MatProgressSpinnerModule,
  ],
  providers: [
    {
      provide: MAT_FORM_FIELD_DEFAULT_OPTIONS,
      useValue: { appearance: 'outline' },
    },
  ],
})
export class ProductsModule {}


================================================
FILE: Lab1/client/Application/src/assets/.gitkeep
================================================


================================================
FILE: Lab1/client/Application/src/custom-theme.scss
================================================

// Custom Theming for Angular Material
// For more information: https://material.angular.io/guide/theming
@use '@angular/material' as mat;
// Plus imports for other components in your app.

// Include the common styles for Angular Material. We include this here so that you only
// have to load a single css file for Angular Material in your app.
// Be sure that you only ever include this mixin once!
@include mat.core();

// Define the palettes for your theme using the Material Design palettes available in palette.scss
// (imported above). For each palette, you can optionally specify a default, lighter, and darker
// hue. Available color palettes: https://material.io/design/color/
$dashboard-primary: mat.define-palette(mat.$indigo-palette);
$dashboard-accent: mat.define-palette(mat.$pink-palette, A200, A100, A400);

// The warn palette is optional (defaults to red).
$dashboard-warn: mat.define-palette(mat.$red-palette);

// Create the theme object. A theme consists of configurations for individual
// theming systems such as "color" or "typography".
$dashboard-theme: mat.define-light-theme((
  color: (
    primary: $dashboard-primary,
    accent: $dashboard-accent,
    warn: $dashboard-warn,
  )
));

// Include theme styles for core and each component used in your app.
// Alternatively, you can import and @include the theme mixins for each component
// that you are using.
@include mat.all-component-themes($dashboard-theme);


html, body { height: 100%; }
body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; }


================================================
FILE: Lab1/client/Application/src/environments/environment.prod.ts
================================================
export const environment = {
  production: true,
  apiGatewayUrl: 'https://0grqqki7qk.execute-api.us-west-2.amazonaws.com/prod',
};


================================================
FILE: Lab1/client/Application/src/environments/environment.ts
================================================
export const environment = {
  production: false,
  apiGatewayUrl: 'https://0grqqki7qk.execute-api.us-west-2.amazonaws.com/prod',
};


================================================
FILE: Lab1/client/Application/src/index.html
================================================
<!DOCTYPE html>
<html lang="en">
  <head>
    <!-- https://github.com/aws/aws-amplify/issues/678 fix: -->
    <script>
      if (global === undefined) {
        var global = window;
      }
    </script>
    <!-- https://github.com/aws/aws-amplify/issues/678 fix end-->
    <meta charset="utf-8" />
    <title>Application</title>
    <base href="./" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="icon" type="image/x-icon" href="favicon.ico" />
    <link rel="preconnect" href="https://fonts.gstatic.com" />
    <link
      href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap"
      rel="stylesheet"
    />
    <link
      href="https://fonts.googleapis.com/icon?family=Material+Icons"
      rel="stylesheet"
    />
  </head>
  <body class="mat-typography">
    <app-root></app-root>
  </body>
</html>


================================================
FILE: Lab1/client/Application/src/main.ts
================================================
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

platformBrowserDynamic()
  .bootstrapModule(AppModule)
  .catch((err) => console.error(err));


================================================
FILE: Lab1/client/Application/src/polyfills.ts
================================================
/**
 * This file includes polyfills needed by Angular and is loaded before the app.
 * You can add your own extra polyfills to this file.
 *
 * This file is divided into 2 sections:
 *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
 *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
 *      file.
 *
 * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
 * automatically update themselves. This includes recent versions of Safari, Chrome (including
 * Opera), Edge on the desktop, and iOS and Chrome on mobile.
 *
 * Learn more in https://angular.io/guide/browser-support
 */

/***************************************************************************************************
 * BROWSER POLYFILLS
 */

/**
 * By default, zone.js will patch all possible macroTask and DomEvents
 * user can disable parts of macroTask/DomEvents patch by setting following flags
 * because those flags need to be set before `zone.js` being loaded, and webpack
 * will put import in the top of bundle, so user need to create a separate file
 * in this directory (for example: zone-flags.ts), and put the following flags
 * into that file, and then add the following code before importing zone.js.
 * import './zone-flags';
 *
 * The flags allowed in zone-flags.ts are listed here.
 *
 * The following flags will work for all browsers.
 *
 * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
 * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
 * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
 *
 *  in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
 *  with the following flag, it will bypass `zone.js` patch for IE/Edge
 *
 *  (window as any).__Zone_enable_cross_context_check = true;
 *
 */

/***************************************************************************************************
 * Zone JS is required by default for Angular itself.
 */
import 'zone.js';  // Included with Angular CLI.


/***************************************************************************************************
 * APPLICATION IMPORTS
 */


================================================
FILE: Lab1/client/Application/src/styles/_variables.scss
================================================
$link-color: #673ab7; // 1
$label-margin-bottom: 0; // 2
$grid-breakpoints: (
  xs: 0,
  // handset portrait (small, medium, large) | handset landscape (small)
  sm: 600px,
  // handset landscape (medium, large) | tablet portrait (small, large)
  md: 960px,
  // tablet landscape (small, large)
  lg: 1280px,
  // laptops and desktops
  xl: 1600px // large desktops,
);

$container-max-widths: (
  sm: 600px,
  md: 960px,
  lg: 1280px,
  xl: 1600px,
);


================================================
FILE: Lab1/client/Application/src/styles/reset.scss
================================================
a {
  &.mat-button,
  &.mat-raised-button,
  &.mat-fab,
  &.mat-mini-fab,
  &.mat-list-item {
    &:hover {
      color: currentColor;
    }
  }
}


================================================
FILE: Lab1/client/Application/src/styles.scss
================================================
/* You can add global styles to this file, and also import other style files */
@import url("https://fonts.googleapis.com/icon?family=Material+Symbols|Material+Symbols+Outlined");

@import "~bootstrap/scss/functions";
@import "styles/variables";

// Import functions, variables, and mixins needed by other Bootstrap files
@import "~bootstrap/scss/variables";
@import "~bootstrap/scss/maps";
@import "~bootstrap/scss/mixins";

// Import Bootstrap Reboot
@import "~bootstrap/scss/root"; // Contains :root CSS variables used by other Bootstrap files
@import "~bootstrap/scss/reboot";

@import "~bootstrap/scss/containers"; // Add .container and .container-fluid classes
@import "~bootstrap/scss/grid"; // Add the grid system

@import "~bootstrap/scss/utilities"; // Configures the utility classes that should be generated
@import "~bootstrap/scss/utilities/api"; // Generates the actual utility classes

@import "styles/reset";

.chart-container canvas {
    max-height: 250px;
    width: auto;
}

.chart-container {
    height: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
}


================================================
FILE: Lab1/client/Application/src/test.ts
================================================
// This file is required by karma.conf.js and loads recursively all the .spec and framework files

import 'zone.js/testing';
import { getTestBed } from '@angular/core/testing';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';

declare const require: {
  context(path: string, deep?: boolean, filter?: RegExp): {
    <T>(id: string): T;
    keys(): string[];
  };
};

// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting(),
);

// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().forEach(context);


================================================
FILE: Lab1/client/Application/tsconfig.app.json
================================================
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/app",
    "types": []
  },
  "files": [
    "src/main.ts",
    "src/polyfills.ts"
  ],
  "include": [
    "src/**/*.d.ts"
  ]
}


================================================
FILE: Lab1/client/Application/tsconfig.json
================================================
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "sourceMap": true,
    "declaration": false,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "moduleResolution": "node",
    "importHelpers": true,
    "target": "es2020",
    "module": "es2020",
    "strictPropertyInitialization": false,
    "lib": ["es2020", "dom"]
  },
  "angularCompilerOptions": {
    "enableI18nLegacyMessageIdFormat": false,
    "strictInjectionParameters": true,
    "strictInputAccessModifiers": true,
    "strictTemplates": true,
    "skipLibCheck": true
  }
}


================================================
FILE: Lab1/client/Application/tsconfig.spec.json
================================================
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/spec",
    "types": [
      "jasmine"
    ]
  },
  "files": [
    "src/test.ts",
    "src/polyfills.ts"
  ],
  "include": [
    "src/**/*.spec.ts",
    "src/**/*.d.ts"
  ]
}


================================================
FILE: Lab1/scripts/deployment.sh
================================================
#!/bin/bash

if [[ "$#" -eq 0 ]]; then
  echo "Invalid parameters"
  echo "Command to deploy client code: deployment.sh -c --stack-name <CloudFormation stack name>"
  echo "Command to deploy server code: deployment.sh -s --stack-name <CloudFormation stack name>"
  echo "Command to deploy server & client code: deployment.sh -s -c --stack-name <CloudFormation stack name>"
  exit 1
fi

while [[ "$#" -gt 0 ]]; do
  case $1 in
  -s) server=1 ;;
  -c) client=1 ;;
  --stack-name)
    stackname=$2
    shift
    ;;
  *)
    echo "Unknown parameter passed: $1"
    exit 1
    ;;
  esac
  shift
done

if [[ -z "$stackname" ]]; then
  echo "Please provide CloudFormation stack name as parameter"
  echo "Note: Invoke script without parameters to know the list of script parameters"
  exit 1
fi

if [[ $server -eq 1 ]]; then
  echo "Server code is getting deployed"
  cd ../server || exit # stop execution if cd fails
  REGION=$(aws configure get region)

  DEFAULT_SAM_S3_BUCKET=$(grep s3_bucket samconfig.toml | cut -d'=' -f2 | cut -d \" -f2)
  echo "aws s3 ls s3://$DEFAULT_SAM_S3_BUCKET"

  if ! aws s3 ls "s3://${DEFAULT_SAM_S3_BUCKET}"; then
    echo "S3 Bucket: $DEFAULT_SAM_S3_BUCKET specified in samconfig.toml is not readable.
      So creating a new S3 bucket and will update samconfig.toml with new bucket name."

    UUID=$(uuidgen | awk '{print tolower($0)}')
    SAM_S3_BUCKET=sam-bootstrap-bucket-$UUID
    aws s3 mb "s3://${SAM_S3_BUCKET}" --region "$REGION"
    aws s3api put-bucket-encryption \
      --bucket "$SAM_S3_BUCKET" \
      --server-side-encryption-configuration '{"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]}'
    if [[ $? -ne 0 ]]; then
      exit 1
    fi
    # Updating samconfig.toml with new bucket name
    ex -sc '%s/s3_bucket = .*/s3_bucket = \"'$SAM_S3_BUCKET'\"/|x' samconfig.toml
  fi

  echo "Validating server code using pylint"
  python3 -m pylint -E -d E0401 $(find . -iname "*.py" -not -path "./.aws-sam/*")
  if [[ $? -ne 0 ]]; then
    echo "****ERROR: Please fix above code errors and then rerun script!!****"
    exit 1
  fi

  sam build -t template.yaml --use-container
  sam deploy --config-file samconfig.toml --region="$REGION" --stack-name="$stackname"
  cd ../scripts || exit # stop execution if cd fails
fi

if [[ $client -eq 1 ]]; then
  echo "Client code is getting deployed"
  APP_SITE_BUCKET=$(aws cloudformation describe-stacks --stack-name "$stackname" --query "Stacks[0].Outputs[?OutputKey=='AppBucket'].OutputValue" --output text)
  APP_SITE_URL=$(aws cloudformation describe-stacks --stack-name "$stackname" --query "Stacks[0].Outputs[?OutputKey=='ApplicationSite'].OutputValue" --output text)
  APP_APIGATEWAYURL=$(aws cloudformation describe-stacks --stack-name "$stackname" --query "Stacks[0].Outputs[?OutputKey=='APIGatewayURL'].OutputValue" --output text)

  # Configuring application UI

  echo "aws s3 ls s3://${APP_SITE_BUCKET}"
  if ! aws s3 ls "s3://${APP_SITE_BUCKET}"; then
    echo "Error! S3 Bucket: $APP_SITE_BUCKET not readable"
    exit 1
  fi

  cd ../client/Application || exit # stop execution if cd fails

  echo "Configuring environment for App Client"

  cat <<EoF >./src/environments/environment.prod.ts
export const environment = {
  production: true,
  apiGatewayUrl: '$APP_APIGATEWAYURL'
};
EoF

  cat <<EoF >./src/environments/environment.ts
export const environment = {
  production: true,
  apiGatewayUrl: '$APP_APIGATEWAYURL'
};
EoF

  npm install && npm run build

  echo "aws s3 sync --delete --cache-control no-store dist s3://${APP_SITE_BUCKET}"
  if ! aws s3 sync --delete --cache-control no-store dist "s3://${APP_SITE_BUCKET}"; then
    exit 1
  fi

  echo "Completed configuring environment for App Client"

  echo "Application site URL: https://${APP_SITE_URL}"
fi


================================================
FILE: Lab1/scripts/geturl.sh
================================================
#!/bin/bash
stackname="serverless-saas-workshop-lab1"

APP_SITE_URL=$(aws cloudformation describe-stacks --stack-name "$stackname" --query "Stacks[0].Outputs[?OutputKey=='ApplicationSite'].OutputValue" --output text)
echo "Application site URL: https://${APP_SITE_URL}"


================================================
FILE: Lab1/server/.gitignore
================================================
.aws-sam/
.pytest_cache/
.DS_Store
.vscode/

================================================
FILE: Lab1/server/OrderService/order_models.py
================================================
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

class Order:
    key=''
    def __init__(self, orderId, orderName, orderProducts):
        self.orderId = orderId
        self.orderName = orderName
        self.orderProducts = orderProducts

class  OrderProduct:

    def __init__(self, productId, price, quantity):
        self.productId = productId
        self.price = price
        self.quantity = quantity





================================================
FILE: Lab1/server/OrderService/order_service.py
================================================
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

import json
import utils
import logger
import order_service_dal
from decimal import Decimal
from types import SimpleNamespace
from aws_lambda_powertools import Tracer

def get_order(event, context):
    logger.info("Request received to get a order")
    params = event['pathParameters']
    orderId = params['id']
    order = order_service_dal.get_order(event, orderId)

    logger.info("Request completed to get a order")
    
    return utils.generate_response(order)
    
def create_order(event, context):  
    logger.info("Request received to create a order")
    payload = json.loads(event['body'], object_hook=lambda d: SimpleNamespace(**d), parse_float=Decimal)
    order = order_service_dal.create_order(event, payload)
    logger.info("Request completed to create a order")
    return utils.generate_response(order)
    
def update_order(event, context):    
    logger.info("Request received to update a order")
    payload = json.loads(event['body'], object_hook=lambda d: SimpleNamespace(**d), parse_float=Decimal)
    params = event['pathParameters']
    orderId = params['id']
    order = order_service_dal.update_order(event, payload, orderId)
    logger.info("Request completed to update a order")     
    return utils.generate_response(order)

def delete_order(event, context):
    logger.info("Request received to delete a order")
    params = event['pathParameters']
    orderId = params['id']
    response = order_service_dal.delete_order(event, orderId)
    logger.info("Request completed to delete a order")
    return utils.create_success_response("Successfully deleted the order")

def get_orders(event, context):
    logger.info("Request received to get all orders")
    response = order_service_dal.get_orders(event)
    logger.info("Request completed to get all orders")
    return utils.generate_response(response)

  

================================================
FILE: Lab1/server/OrderService/order_service_dal.py
================================================
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

import os
import boto3
from botocore.exceptions import ClientError
import uuid
from order_models import Order
import json
import utils
from types import SimpleNamespace
import logger
import random

table_name = os.environ['ORDER_TABLE_NAME']
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(table_name)

def get_order(event, orderId):
    
    try:
        response = table.get_item(Key={'orderId': orderId})
        item = response['Item']
        order = Order(item['orderId'], item['orderName'], item['orderProducts'])

    except ClientError as e:
        logger.error(e.response['Error']['Message'])
        raise Exception('Error getting a order', e)
    else:
        return order

def delete_order(event, orderId):
    
    try:
        response = table.delete_item(Key={'orderId': orderId})
    except ClientError as e:
        logger.error(e.response['Error']['Message'])
        raise Exception('Error deleting a order', e)
    else:
        logger.info("DeleteItem succeeded:")
        return response


def create_order(event, payload):
    
    order = Order(str(uuid.uuid4()), payload.orderName, payload.orderProducts)

    try:
        response = table.put_item(Item={
        'orderId': order.orderId, 
        'orderName': order.orderName,
        'orderProducts': get_order_products_dict(order.orderProducts)
        })
    except ClientError as e:
        logger.error(e.response['Error']['Message'])
        raise Exception('Error adding a order', e)
    else:
        logger.info("PutItem succeeded:")
        return order

def update_order(event, payload, orderId):
    
    try:
        order = Order(orderId,payload.orderName, payload.orderProducts)
        response = table.update_item(Key={'orderId': order.orderId},
        UpdateExpression="set orderName=:orderName, "
        +"orderProducts=:orderProducts",
        ExpressionAttributeValues={
            ':orderName': order.orderName,
            ':orderProducts': get_order_products_dict(order.orderProducts)
        },
        ReturnValues="UPDATED_NEW")
    except ClientError as e:
        logger.error(e.response['Error']['Message'])
        raise Exception('Error updating a order', e)
    else:
        logger.info("UpdateItem succeeded:")
        return order

def get_orders(event):
    orders = []

    try:
        response = table.scan()    
        if (len(response['Items']) > 0):
            for item in response['Items']:
                order = Order(item['orderId'], item['orderName'], item['orderProducts'])
                orders.append(order)
    except ClientError as e:
        logger.error("Error getting all orders")
        raise Exception('Error getting all orders', e) 
    else:
        logger.info("Get orders succeeded")
        return orders


def get_order_products_dict(orderProducts):
    orderProductList = []
    for i in range(len(orderProducts)):
        product = orderProducts[i]
        orderProductList.append(vars(product))
    return orderProductList    

  



================================================
FILE: Lab1/server/OrderService/requirements.txt
================================================
aws-lambda-powertools[Tracer,Logger,Metrics]
jsonpickle
aws_requests_auth

================================================
FILE: Lab1/server/ProductService/product_models.py
================================================
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

class Product:
    key =''
    def __init__(self, productId, sku, name, price, category):
        self.productId = productId
        self.sku = sku
        self.name = name
        self.price = price
        self.category = category

class Category:
    def __init__(self, id, name):
        self.id = id
        self.name = name
                

        

               

        


================================================
FILE: Lab1/server/ProductService/product_service.py
================================================
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

import json
import utils
import logger
import product_service_dal
from decimal import Decimal
from types import SimpleNamespace

def get_product(event, context):
    logger.info("Request received to get a product")
    params = event['pathParameters']
    productId = params['id']
    product = product_service_dal.get_product(event, productId)
    logger.info("Request completed to get a product")    
    return utils.generate_response(product)
    
def create_product(event, context):    
    logger.info("Request received to create a product")
    payload = json.loads(event['body'], object_hook=lambda d: SimpleNamespace(**d), parse_float=Decimal)
    logger.info(payload)
    product = product_service_dal.create_product(event, payload)
    logger.info("Request completed to create a product")
    return utils.generate_response(product)
    
def update_product(event, context):
    logger.info("Request received to update a product")
    payload = json.loads(event['body'], object_hook=lambda d: SimpleNamespace(**d), parse_float=Decimal)
    params = event['pathParameters']
    key = params['id']
    product = product_service_dal.update_product(event, payload, key)
    logger.info("Request completed to update a product") 
    return utils.generate_response(product)

def delete_product(event, context):
    logger.info("Request received to delete a product")
    params = event['pathParameters']
    key = params['id']
    response = product_service_dal.delete_product(event, key)
    logger.info("Request completed to delete a product")
    return utils.create_success_response("Successfully deleted the product")

def get_products(event, context):
    logger.info("Request received to get all products")
    response = product_service_dal.get_products(event)
    logger.info("Request completed to get all products")
    return utils.generate_response(response)

  

================================================
FILE: Lab1/server/ProductService/product_service_dal.py
================================================
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

import os
import boto3
from botocore.exceptions import ClientError
import uuid
import logger

from product_models import Product
from types import SimpleNamespace
from boto3.dynamodb.conditions import Key


table_name = os.environ['PRODUCT_TABLE_NAME']
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(table_name)

def get_product(event, productId):
    try:
        response = table.get_item(Key={'productId': productId})
        item = response['Item']
        product = Product(item['productId'], item['sku'], item['name'], item['price'], item['category'])
    except ClientError as e:
        logger.error(e.response['Error']['Message'])
        raise Exception('Error getting a product', e)
    else:
        logger.info("GetItem succeeded:"+ str(product))
        return product

def delete_product(event, productId):
    try:
        response = table.delete_item(Key={'productId': productId})
    except ClientError as e:
        logger.error(e.response['Error']['Message'])
        raise Exception('Error deleting a product', e)
    else:
        logger.info("DeleteItem succeeded:")
        return response


def create_product(event, payload):
    product = Product(str(uuid.uuid4()), payload.sku,payload.name, payload.price, payload.category)
    
    try:
        response = table.put_item(
            Item=
                {
                    'productId': product.productId,
                    'sku': product.sku,
                    'name': product.name,
                    'price': product.price,
                    'category': product.category
                }
        )
    except ClientError as e:
        logger.error(e.response['Error']['Message'])
        raise Exception('Error adding a product', e)
    else:
        logger.info("PutItem succeeded:")
        return product

def update_product(event, payload, productId):
    try:
        product = Product(productId,payload.sku, payload.name, payload.price, payload.category)

        response = table.update_item(Key={'productId': product.productId},
        UpdateExpression="set sku=:sku, #n=:productName, price=:price, category=:category",
        ExpressionAttributeNames= {'#n':'name'},
        ExpressionAttributeValues={
            ':sku': product.sku,
            ':productName': product.name,
            ':price': product.price,
            ':category': product.category
        },
        ReturnValues="UPDATED_NEW")
    except ClientError as e:
        logger.error(e.response['Error']['Message'])
        raise Exception('Error updating a product', e)
    else:
        logger.info("UpdateItem succeeded:")
        return product        

def get_products(event):    
    products =[]
    try:
        response = table.scan()    
        if (len(response['Items']) > 0):
            for item in response['Items']:
                product = Product(item['productId'], item['sku'], item['name'], item['price'], item['category'])
                products.append(product)
                    
    except ClientError as e:
        logger.error(e.response['Error']['Message'])
        raise Exception('Error getting all products', e)
    else:
        logger.info("Get products succeeded")
        return products





================================================
FILE: Lab1/server/ProductService/requirements.txt
================================================
requests
pytest-mock
aws-lambda-powertools[Tracer,Logger,Metrics]
jsonpickle
aws_requests_auth

================================================
FILE: Lab1/server/README.md
================================================
if using EE
sam build --use-container && sam package  --output-template-file packaged.yaml --s3-bucket aws-sam-cli-managed-default-samclisourcebucket-8tf6bmi4rdcx --region us-west-2
sam deploy --template-file packaged.yaml --config-file samconfig.toml


Normally
sam build -t template.yaml --use-container
sam deploy --config-file samconfig.toml



================================================
FILE: Lab1/server/layers/logger.py
================================================
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

from aws_lambda_powertools import Logger
logger = Logger()

"""Log info messages
"""
def info(log_message):
    logger.info (log_message)

"""Log error messages
"""
def error(log_message):
    logger.error (log_message)


================================================
FILE: Lab1/server/layers/requirements.txt
================================================
aws-lambda-powertools[Tracer,Logger,Metrics]
simplejson
jsonpickle


================================================
FILE: Lab1/server/layers/utils.py
================================================
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

import json
import jsonpickle
import simplejson

import boto3
from enum import Enum

class StatusCodes(Enum):
    SUCCESS    = 200
    UN_AUTHORIZED  = 401
    NOT_FOUND = 404
    
def create_success_response(message):
    return {
        "statusCode": StatusCodes.SUCCESS.value,
        "headers": {
            "Access-Control-Allow-Headers" : "Content-Type, Origin, X-Requested-With, Accept, Authorization, Access-Control-Allow-Methods, Access-Control-Allow-Headers, Access-Control-Allow-Origin",
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET,PUT"
        },
        "body": json.dumps({
            "message": message
        }),
    }

def generate_response(inputObject):
    return {
        "statusCode": 200,
        "headers": {
            "Access-Control-Allow-Headers" : "Content-Type, Origin, X-Requested-With, Accept, Authorization, Access-Control-Allow-Methods, Access-Control-Allow-Headers, Access-Control-Allow-Origin",
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET,PUT"
        },
        "body": encode_to_json_object(inputObject),
    }

def  encode_to_json_object(inputObject):
    jsonpickle.set_encoder_options('simplejson', use_decimal=True, sort_keys=True)
    jsonpickle.set_preferred_backend('simplejson')
    return jsonpickle.encode(inputObject, unpicklable=False, use_decimal=True)







================================================
FILE: Lab1/server/samconfig.toml
================================================
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "serverless-saas-lab1"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-8tf6bmi4rdcx"
s3_prefix = "serverless-saas-lab1"
region = "us-west-2"
confirm_changeset = false
capabilities = "CAPABILITY_NAMED_IAM"
cached="true"
parallel="true"

================================================
FILE: Lab1/server/template.yaml
================================================
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  Lab1 - Basic Serverless Application

Globals:
  Function:
    Timeout: 29
    Layers:
      - !Sub "arn:aws:lambda:${AWS::Region}:580247275435:layer:LambdaInsightsExtension:14"
    Environment:
        Variables:
          LOG_LEVEL: DEBUG                   

Parameters:
  StageName:
    Type: String
    Default: "prod"
    Description: "Stage Name for the api"
    
Resources: 
  ServerlessSaaSLayers:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: serverless-saas-workshoplab1
      Description: Utilities for project
      ContentUri: layers/
      CompatibleRuntimes:
        - python3.9          
      LicenseInfo: 'MIT'
      RetentionPolicy: Retain      
    Metadata:
      BuildMethod: python3.9   
  
  ProductTable:
    Type: AWS::DynamoDB::Table
    Properties: 
      AttributeDefinitions:
        - AttributeName: productId
          AttributeType: S          
      KeySchema:
        - AttributeName: productId
          KeyType: HASH  
      BillingMode: PAY_PER_REQUEST 
      TableName: Product-Lab1

  OrderTable:
    Type: AWS::DynamoDB::Table
    Properties: 
      AttributeDefinitions:
        - AttributeName: orderId
          AttributeType: S          
      KeySchema:
        - AttributeName: orderId
          KeyType: HASH  
      BillingMode: PAY_PER_REQUEST
      TableName: Order-Lab1

  ProductFunctionExecutionRole:
    Type: AWS::IAM::Role     
    Properties:
      RoleName: product-function-execution-role-lab1
      Path: '/'
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy    
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole        
        - arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess
      Policies:
        - PolicyName: product-function-policy-lab1
          PolicyDocument:
            Version: 2012-10-17
            Statement:              
              - Effect: Allow
                Action:
                  - dynamodb:GetItem
                  - dynamodb:UpdateItem
                  - dynamodb:PutItem
                  - dynamodb:DeleteItem
                  - dynamodb:Query
                  - dynamodb:Scan
                Resource:
                  - !GetAtt ProductTable.Arn
             
  GetProductFunction:
    Type: AWS::Serverless::Function 
    DependsOn: ProductFunctionExecutionRole 
    Properties:
      CodeUri: ProductService/
      Handler: product_service.get_product
      Runtime: python3.9  
      Tracing: Active
      Role: !GetAtt ProductFunctionExecutionRole.Arn
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "ProductService"
          PRODUCT_TABLE_NAME: !Ref ProductTable      
  
  
  GetProductsFunction:
    Type: AWS::Serverless::Function 
    DependsOn: ProductFunctionExecutionRole 
    Properties:
      CodeUri: ProductService/
      Handler: product_service.get_products
      Runtime: python3.9  
      Tracing: Active
      Role: !GetAtt ProductFunctionExecutionRole.Arn
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "ProductService"
          PRODUCT_TABLE_NAME: !Ref ProductTable      
  
  CreateProductFunction:
    Type: AWS::Serverless::Function
    DependsOn: ProductFunctionExecutionRole 
    Properties:
      CodeUri: ProductService/
      Handler: product_service.create_product
      Runtime: python3.9  
      Tracing: Active 
      Role: !GetAtt ProductFunctionExecutionRole.Arn 
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "ProductService"
          PRODUCT_TABLE_NAME: !Ref ProductTable
      
  UpdateProductFunction:
    Type: AWS::Serverless::Function
    DependsOn: ProductFunctionExecutionRole 
    Properties:
      CodeUri: ProductService/
      Handler: product_service.update_product
      Runtime: python3.9 
      Tracing: Active
      Role: !GetAtt ProductFunctionExecutionRole.Arn 
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "ProductService"
          PRODUCT_TABLE_NAME: !Ref ProductTable
  
  DeleteProductFunction:
    Type: AWS::Serverless::Function
    DependsOn: ProductFunctionExecutionRole 
    Properties:
      CodeUri: ProductService/
      Handler: product_service.delete_product
      Runtime: python3.9 
      Tracing: Active
      Role: !GetAtt ProductFunctionExecutionRole.Arn 
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "ProductService"
          PRODUCT_TABLE_NAME: !Ref ProductTable
          
  OrderFunctionExecutionRole:
    Type: AWS::IAM::Role     
    Properties:
      RoleName: order-function-execution-role-lab1
      Path: '/'
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy    
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole       
        - arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess 
      Policies:
        - PolicyName: order-function-policy-lab1
          PolicyDocument:
            Version: 2012-10-17
            Statement:              
              - Effect: Allow
                Action:
                  - dynamodb:GetItem
                  - dynamodb:UpdateItem
                  - dynamodb:PutItem
                  - dynamodb:DeleteItem
                  - dynamodb:Query
                  - dynamodb:Scan
                Resource:
                  - !GetAtt OrderTable.Arn
                
  GetOrdersFunction:
    Type: AWS::Serverless::Function 
    DependsOn: OrderFunctionExecutionRole 
    Properties:
      CodeUri: OrderService/
      Handler: order_service.get_orders
      Runtime: python3.9  
      Tracing: Active
      Role: !GetAtt OrderFunctionExecutionRole.Arn
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "OrderService"
          ORDER_TABLE_NAME: !Ref OrderTable
  
  GetOrderFunction:
    Type: AWS::Serverless::Function 
    DependsOn: OrderFunctionExecutionRole 
    Properties:
      CodeUri: OrderService/
      Handler: order_service.get_order
      Runtime: python3.9  
      Tracing: Active
      Role: !GetAtt OrderFunctionExecutionRole.Arn
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "OrderService"
          ORDER_TABLE_NAME: !Ref OrderTable
      
  CreateOrderFunction:
    Type: AWS::Serverless::Function
    DependsOn: OrderFunctionExecutionRole 
    Properties:
      CodeUri: OrderService/
      Handler: order_service.create_order
      Runtime: python3.9  
      Tracing: Active 
      Role: !GetAtt OrderFunctionExecutionRole.Arn 
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "OrderService"
          ORDER_TABLE_NAME: !Ref OrderTable
      
  UpdateOrderFunction:
    Type: AWS::Serverless::Function
    DependsOn: OrderFunctionExecutionRole 
    Properties:
      CodeUri: OrderService/
      Handler: order_service.update_order
      Runtime: python3.9 
      Tracing: Active
      Role: !GetAtt OrderFunctionExecutionRole.Arn 
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "OrderService"
          ORDER_TABLE_NAME: !Ref OrderTable
      
  DeleteOrderFunction:
    Type: AWS::Serverless::Function
    DependsOn: OrderFunctionExecutionRole 
    Properties:
      CodeUri: OrderService/
      Handler: order_service.delete_order
      Runtime: python3.9 
      Tracing: Active
      Role: !GetAtt OrderFunctionExecutionRole.Arn 
      Layers: 
        - !Ref ServerlessSaaSLayers
      Environment:
        Variables:
          POWERTOOLS_SERVICE_NAME: "OrderService"
          ORDER_TABLE_NAME: !Ref OrderTable
      
  ApiGatewayAccessLogs:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: /aws/api-gateway/access-logs-serverless-saas-workshop-lab1-api
      RetentionInDays: 30
  ApiGatewayApi:
    Type: AWS::Serverless::Api
    Properties:
      MethodSettings:
        - DataTraceEnabled: False
          LoggingLevel: INFO
          MetricsEnabled: True
          ResourcePath: '/*' 
          HttpMethod: '*' 
      AccessLogSetting:
        DestinationArn: !GetAtt ApiGatewayAccessLogs.Arn
        Format: '{ "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", "caller":"$context.identity.caller", "user":"$context.identity.user","requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod","resourcePath":"$context.resourcePath", "status":"$context.status","protocol":"$context.protocol", "responseLength":"$context.responseLength" }'
      TracingEnabled: True
      DefinitionBody:
        openapi: 3.0.1
        info:
          title: 'serverless-saas-workshop-lab1'
        basePath: !Join ['', ['/', !Ref StageName]]
        schemes:
          - https
        paths:
          /order/{id}:
            get:
              summary: Returns a order
              description: Return a order by a order id.
              produces:
                - application/json
              parameters:
                - name: id
                  in: path
                  required: true
                  type: string
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt GetOrderFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy 
            put:              
              produces:
                - application/json
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt UpdateOrderFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy     
            delete:
              summary: Deletes a order
              description: Deletes a order by a order id.
              produces:
                - application/json
              parameters:
                - name: id
                  in: path
                  required: true
                  type: string
              responses: {}              
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt DeleteOrderFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy
            options:
              consumes:
                - application/json
              produces:
                - application/json
              responses:
                '200':
                  description: 200 response
                  schema:
                    $ref: "#/definitions/Empty"
                  headers:
                    Access-Control-Allow-Origin:
                      type: string
                    Access-Control-Allow-Methods:
                      type: string
                    Access-Control-Allow-Headers:
                      type: string
              x-amazon-apigateway-integration:
                responses:
                  default:
                    statusCode: 200
                    responseParameters:
                      method.response.header.Access-Control-Allow-Methods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
                      method.response.header.Access-Control-Allow-Headers: "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
                      method.response.header.Access-Control-Allow-Origin:  "'*'"
                passthroughBehavior: when_no_match
                requestTemplates:
                  application/json: "{\"statusCode\": 200}"
                type: mock      
          /orders:
            get:
              summary: Returns all orders
              description: Returns all orders.
              produces:
                - application/json
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt GetOrdersFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy
            options:
              consumes:
                - application/json
              produces:
                - application/json
              responses:
                '200':
                  description: 200 response
                  schema:
                    $ref: "#/definitions/Empty"
                  headers:
                    Access-Control-Allow-Origin:
                      type: string
                    Access-Control-Allow-Methods:
                      type: string
                    Access-Control-Allow-Headers:
                      type: string
              x-amazon-apigateway-integration:
                responses:
                  default:
                    statusCode: 200
                    responseParameters:
                      method.response.header.Access-Control-Allow-Methods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
                      method.response.header.Access-Control-Allow-Headers: "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
                      method.response.header.Access-Control-Allow-Origin:  "'*'"
                passthroughBehavior: when_no_match
                requestTemplates:
                  application/json: "{\"statusCode\": 200}"
                type: mock                              
          /order:
            post:              
              produces:
                - application/json
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt CreateOrderFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy
            options:
              consumes:
                - application/json
              produces:
                - application/json
              responses:
                '200':
                  description: 200 response
                  schema:
                    $ref: "#/definitions/Empty"
                  headers:
                    Access-Control-Allow-Origin:
                      type: string
                    Access-Control-Allow-Methods:
                      type: string
                    Access-Control-Allow-Headers:
                      type: string
              x-amazon-apigateway-integration:
                responses:
                  default:
                    statusCode: 200
                    responseParameters:
                      method.response.header.Access-Control-Allow-Methods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
                      method.response.header.Access-Control-Allow-Headers: "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
                      method.response.header.Access-Control-Allow-Origin:  "'*'"
                passthroughBehavior: when_no_match
                requestTemplates:
                  application/json: "{\"statusCode\": 200}"
                type: mock     
          /product/{id}:
            get:
              summary: Returns a product
              description: Return a product by a product id.
              produces:
                - application/json
              parameters:
                - name: id
                  in: path
                  required: true
                  type: string
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt GetProductFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy 
            put:              
              produces:
                - application/json
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt UpdateProductFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy     
            delete:
              summary: Deletes a product
              description: Deletes a product by a product id.
              produces:
                - application/json
              parameters:
                - name: id
                  in: path
                  required: true
                  type: string
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt DeleteProductFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy 
            options:
              consumes:
                - application/json
              produces:
                - application/json
              responses:
                '200':
                  description: 200 response
                  schema:
                    $ref: "#/definitions/Empty"
                  headers:
                    Access-Control-Allow-Origin:
                      type: string
                    Access-Control-Allow-Methods:
                      type: string
                    Access-Control-Allow-Headers:
                      type: string
              x-amazon-apigateway-integration:
                responses:
                  default:
                    statusCode: 200
                    responseParameters:
                      method.response.header.Access-Control-Allow-Methods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
                      method.response.header.Access-Control-Allow-Headers: "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
                      method.response.header.Access-Control-Allow-Origin:  "'*'"
                passthroughBehavior: when_no_match
                requestTemplates:
                  application/json: "{\"statusCode\": 200}"
                type: mock      
          /products:
            get:
              summary: Returns all products
              description: Returns all products.
              produces:
                - application/json
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt GetProductsFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy  
            options:
              consumes:
                - application/json
              produces:
                - application/json
              responses:
                '200':
                  description: 200 response
                  schema:
                    $ref: "#/definitions/Empty"
                  headers:
                    Access-Control-Allow-Origin:
                      type: string
                    Access-Control-Allow-Methods:
                      type: string
                    Access-Control-Allow-Headers:
                      type: string
              x-amazon-apigateway-integration:
                responses:
                  default:
                    statusCode: 200
                    responseParameters:
                      method.response.header.Access-Control-Allow-Methods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
                      method.response.header.Access-Control-Allow-Headers: "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
                      method.response.header.Access-Control-Allow-Origin:  "'*'"
                passthroughBehavior: when_no_match
                requestTemplates:
                  application/json: "{\"statusCode\": 200}"
                type: mock                           
          /product:
            post:              
              produces:
                - application/json
              responses: {}
              x-amazon-apigateway-integration:
                uri: !Join
                  - ''
                  - - !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
                    -  !GetAtt CreateProductFunction.Arn
                    - /invocations
                httpMethod: POST
                type: aws_proxy   
            options:
              consumes:
                - application/json
              produces:
                - application/json
              responses:
                '200':
                  description: 200 response
                  schema:
                    $ref: "#/definitions/Empty"
                  headers:
                    Access-Control-Allow-Origin:
                      type: string
                    Access-Control-Allow-Methods:
                      type: string
                    Access-Control-Allow-Headers:
                      type: string
              x-amazon-apigateway-integration:
                responses:
                  default:
                    statusCode: 200
                    responseParameters:
                      method.response.header.Access-Control-Allow-Methods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
                      method.response.header.Access-Control-Allow-Headers: "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
                      method.response.header.Access-Control-Allow-Origin:  "'*'"
                passthroughBehavior: when_no_match
                requestTemplates:
                  application/json: "{\"statusCode\": 200}"
                type: mock                                            
      StageName: !Ref StageName            
  
  GetProductsLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt GetProductsFunction.Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ] 
      
  GetProductLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 
        - GetProductFunction
        - Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ]  
  CreateProductLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 
        - CreateProductFunction
        - Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ]    
  UpdateProductLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 
        - UpdateProductFunction
        - Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ]         
  DeleteProductLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 
        - DeleteProductFunction
        - Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ]  
  
  GetOrdersLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 
        - GetOrdersFunction
        - Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ]      

  GetOrderLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 
        - GetOrderFunction
        - Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ]  
  CreateOrderLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 
        - CreateOrderFunction
        - Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ]    
  UpdateOrderLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 
        - UpdateOrderFunction
        - Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ]         
  DeleteOrderLambdaApiGatewayExecutionPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 
        - DeleteOrderFunction
        - Arn
      Principal: apigateway.amazonaws.com
      SourceArn: !Join [
        "", [
          "arn:aws:execute-api:", 
          {"Ref": "AWS::Region"}, ":", 
          {"Ref": "AWS::AccountId"}, ":", 
          !Ref ApiGatewayApi, "/*/*/*"
          ]
        ]            
  CloudFrontOriginAccessIdentity:
    Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
    Properties:
      CloudFrontOriginAccessIdentityConfig:
        Comment: "Origin Access Identity for CloudFront Distribution"
  AppBucket:
    Type: AWS::S3::Bucket
    DeletionPolicy : Retain
    Properties:
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: 'AES256'
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
  AppSiteReadPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref AppBucket
      PolicyDocument:
        Statement:
        - Action: 's3:GetObject'
          Effect: Allow
          Resource: !Sub 'arn:aws:s3:::${AppBucket}/*'
          Principal:
            CanonicalUser: !GetAtt CloudFrontOriginAccessIdentity.S3CanonicalUserId
  ApplicationSite:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        CustomErrorResponses:
        # Needed to support angular routing
        - ErrorCode: 403 
          ResponseCode: 200
          ResponsePagePath: '/index.html'
        - ErrorCode: 404
          ResponseCode: 200
          ResponsePagePath: '/index.html'
        DefaultCacheBehavior:
          AllowedMethods:
            - DELETE
            - GET
            - HEAD
            - OPTIONS
            - PATCH
            - POST
            - PUT
          Compress: true
          DefaultTTL: 3600 # in seconds
          ForwardedValues:
            Cookies:
              Forward: none
            QueryString: false
          MaxTTL: 86400 # in seconds
          MinTTL: 60 # in seconds
          TargetOriginId: lab1-tenantapp-s3origin
          ViewerProtocolPolicy: 'allow-all'
        DefaultRootObject: 'index.html'
        Enabled: true
        HttpVersion: http2
        Origins:
        - DomainName: !GetAtt 'AppBucket.RegionalDomainName'
          Id: lab1-tenantapp-s3origin
          S3OriginConfig:
            OriginAccessIdentity: !Join ["", ["origin-access-identity/cloudfront/", !Ref CloudFrontOriginAccessIdentity]] 
        PriceClass: 'PriceClass_All'         
Outputs:
  APIGatewayURL:
    Description: "API Gateway endpoint URL for API"
    Value: !Join ['', [!Sub "https://${ApiGatewayApi}.execute-api.${AWS::Region}.amazonaws.com/", !Ref StageName]]
  ApplicationSite:
    Description: The name of the CloudFront url for Tenant Management site
    Value: !GetAtt ApplicationSite.DomainName  
  AppBucket:
    Description: The name of the bucket for uploading the Tenant Management site to
    Value: !Ref AppBucket  

================================================
FILE: Lab2/client/Admin/.browserslistrc
================================================
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries

# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support

# You can see what browsers were selected by your queries by running:
#   npx browserslist

last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR


================================================
FILE: Lab2/client/Admin/.editorconfig
================================================
# Editor configuration, see https://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.ts]
quote_type = single

[*.md]
max_line_length = off
trim_trailing_whitespace = false


================================================
FILE: Lab2/client/Admin/.gitignore
================================================
# See http://help.github.com/ignore-files/ for more about ignoring files.

# Compiled output
/dist
/tmp
/out-tsc
/bazel-out

# Node
/node_modules
npm-debug.log
yarn-error.log

# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*

# Miscellaneous
/.angular/cache
.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings

# System files
.DS_Store
Thumbs.db

#amplify-do-not-edit-begin
amplify/\#current-cloud-backend
amplify/.config/local-*
amplify/logs
amplify/mock-data
amplify/backend/amplify-meta.json
amplify/backend/.temp
build/
dist/
node_modules/
aws-exports.js
awsconfiguration.json
amplifyconfiguration.json
amplifyconfiguration.dart
amplify-build-config.json
amplify-gradle-config.json
amplifytools.xcconfig
.secret-*
**.sample
#amplify-do-not-edit-end

# ignore yarn.lock and package-lock.json files for now
yarn.lock
package-lock.json


================================================
FILE: Lab2/client/Admin/README.md
================================================
# Admin

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.0.5.

## Development server

Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.

## Code scaffolding

Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.

## Build

Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.

## Running unit tests

Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).

## Running end-to-end tests

Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.

## Further help

To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.


================================================
FILE: Lab2/client/Admin/angular.json
================================================
{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "cli": {
    "packageManager": "yarn",
    "analytics": false
  },
  "newProjectRoot": "projects",
  "projects": {
    "admin": {
      "projectType": "application",
      "schematics": {
        "@schematics/angular:component": {
          "style": "scss"
        }
      },
      "root": "",
      "sourceRoot": "src",
      "prefix": "app",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.app.json",
            "inlineStyleLanguage": "scss",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/custom-theme.scss",
              "src/styles.scss"
            ],
            "scripts": []
          },
          "configurations": {
            "production": {
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "10mb",
                  "maximumError": "10mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb",
                  "maximumError": "4kb"
                }
              ],
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "outputHashing": "all"
            },
            "development": {
              "buildOptimizer": false,
              "optimization": false,
              "vendorChunk": true,
              "extractLicenses": false,
              "sourceMap": true,
              "namedChunks": true
            }
          },
          "defaultConfiguration": "production"
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "configurations": {
            "production": {
              "browserTarget": "admin:build:production"
            },
            "development": {
              "browserTarget": "admin:build:development"
            }
          },
          "defaultConfiguration": "development"
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "admin:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.spec.json",
            "karmaConfig": "karma.conf.js",
            "inlineStyleLanguage": "scss",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": []
          }
        }
      }
    }
  }
}


================================================
FILE: Lab2/client/Admin/karma.conf.js
================================================
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      jasmine: {
        // you can add configuration options for Jasmine here
        // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
        // for example, you can disable the random execution with `random: false`
        // or set a specific seed with `seed: 4321`
      },
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    jasmineHtmlReporter: {
      suppressAll: true // removes the duplicated traces
    },
    coverageReporter: {
      dir: require('path').join(__dirname, './coverage/dashboard'),
      subdir: '.',
      reporters: [
        { type: 'html' },
        { type: 'text-summary' }
      ]
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false,
    restartOnFileChange: true
  });
};


================================================
FILE: Lab2/client/Admin/package.json
================================================
{
  "name": "admin",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "watch": "ng build --watch --configuration development",
    "test": "ng test"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~14.0.0",
    "@angular/cdk": "~14.0.4",
    "@angular/common": "~14.0.0",
    "@angular/compiler": "~14.0.0",
    "@angular/core": "~14.0.0",
    "@angular/flex-layout": "~14.0.0-beta.40",
    "@angular/forms": "~14.0.0",
    "@angular/material": "~14.0.4",
    "@angular/platform-browser": "~14.0.0",
    "@angular/platform-browser-dynamic": "~14.0.0",
    "@angular/router": "~14.0.0",
    "@aws-amplify/ui-angular": "~2.4.14",
    "aws-amplify": "~4.3.27",
    "bootstrap": "~5.1.3",
    "chart.js": "~3.8.0",
    "chartjs-plugin-datalabels": "~2.0.0",
    "ng2-charts": "~4.0.0",
    "rxjs": "~7.5.0",
    "tslib": "~2.3.0",
    "zone.js": "~0.11.4"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~14.1.0",
    "@angular/cli": "~14.0.5",
    "@angular/compiler-cli": "~14.0.0",
    "@types/jasmine": "~4.0.0",
    "jasmine-core": "~4.1.0",
    "karma": "~6.3.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage": "~2.2.0",
    "karma-jasmine": "~5.0.0",
    "karma-jasmine-html-reporter": "~1.7.0",
    "typescript": "~4.7.2"
  }
}


================================================
FILE: Lab2/client/Admin/src/app/_nav.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { INavData } from './models';

export const navItems: INavData[] = [
  {
    name: 'Dashboard',
    url: '/dashboard',
    icon: 'insights',
  },
  {
    name: 'Tenants',
    url: '/tenants',
    icon: 'groups',
  },
  {
    name: 'Users',
    url: '/users',
    icon: 'supervisor_account',
  },
];


================================================
FILE: Lab2/client/Admin/src/app/app-routing.module.ts
================================================
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { NavComponent } from './nav/nav.component';
import { AuthComponent } from './views/auth/auth.component';

export const routes: Routes = [
  {
    path: '',
    redirectTo: 'dashboard',
    pathMatch: 'full',
  },
  {
    path: '',
    component: NavComponent,
    data: {
      title: 'Home',
    },
    children: [
      {
        path: 'auth/info',
        component: AuthComponent,
      },
      {
        path: 'dashboard',
        loadChildren: () =>
          import('./views/dashboard/dashboard.module').then(
            (m) => m.DashboardModule
          ),
      },
      {
        path: 'tenants',
        loadChildren: () =>
          import('./views/tenants/tenants.module').then((m) => m.TenantsModule),
      },
      {
        path: 'users',
        loadChildren: () =>
          import('./views/users/users.module').then((m) => m.UsersModule),
      },
    ],
  },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
})
export class AppRoutingModule {}


================================================
FILE: Lab2/client/Admin/src/app/app.component.scss
================================================


================================================
FILE: Lab2/client/Admin/src/app/app.component.ts
================================================
import { Component } from '@angular/core';
import { MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer } from '@angular/platform-browser';

@Component({
  selector: 'app-root',
  template: ` <amplify-authenticator [hideSignUp]="true">
    <ng-template
      amplifySlot="authenticated"
      let-user="user"
      let-signOut="signOut"
    >
      <router-outlet></router-outlet>
    </ng-template>
  </amplify-authenticator>`,
  styleUrls: ['./app.component.scss'],
})
export class AppComponent {
  constructor(
    private matIconRegistry: MatIconRegistry,
    private domSanitizer: DomSanitizer
  ) {
    this.matIconRegistry.addSvgIcon(
      'saas-commerce',
      this.domSanitizer.bypassSecurityTrustResourceUrl('./assets/logo.svg')
    );
  }
  title = 'dashboard';
}


================================================
FILE: Lab2/client/Admin/src/app/app.module.ts
================================================
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HttpClientModule } from '@angular/common/http';
import { LayoutModule } from '@angular/cdk/layout';
import { HashLocationStrategy, LocationStrategy } from '@angular/common';
import { HttpInterceptorProviders } from './interceptors';

import { AmplifyAuthenticatorModule } from '@aws-amplify/ui-angular';

import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatNativeDateModule } from '@angular/material/core';
import { MatIconModule } from '@angular/material/icon';
import { MatListModule } from '@angular/material/list';
import { MatMenuModule } from '@angular/material/menu';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatToolbarModule } from '@angular/material/toolbar';

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { NavComponent } from './nav/nav.component';
import { AuthComponent } from './views/auth/auth.component';

@NgModule({
  declarations: [AppComponent, NavComponent, AuthComponent],
  imports: [
    AmplifyAuthenticatorModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    BrowserModule,
    HttpClientModule,
    LayoutModule,
    MatButtonModule,
    MatCardModule,
    MatGridListModule,
    MatIconModule,
    MatListModule,
    MatMenuModule,
    MatNativeDateModule,
    MatProgressSpinnerModule,
    MatSidenavModule,
    MatToolbarModule,
  ],
  providers: [
    HttpClientModule,
    {
      provide: LocationStrategy,
      useClass: HashLocationStrategy,
    },
    HttpClientModule,
    HttpInterceptorProviders,
  ],
  bootstrap: [AppComponent],
})
export class AppModule {}


================================================
FILE: Lab2/client/Admin/src/app/interceptors/auth.interceptor.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { Injectable } from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor,
} from '@angular/common/http';
import { from, Observable } from 'rxjs';
import { Auth } from 'aws-amplify';
import { filter, map, switchMap } from 'rxjs/operators';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor() {}
  idToken = '';

  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    if (req.url.includes('tenant/init')) {
      return next.handle(req);
    }

    const s = Auth.currentSession().catch((err) => console.log(err));
    const session$ = from(s);

    return session$.pipe(
      filter((sesh) => !!sesh),
      map((sesh) => (!!sesh ? sesh.getIdToken().getJwtToken() : '')),
      switchMap((tok) => {
        req = req.clone({
          headers: req.headers.set('Authorization', 'Bearer ' + tok),
        });
        return next.handle(req);
      })
    );
  }
}


================================================
FILE: Lab2/client/Admin/src/app/interceptors/index.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { HTTP_INTERCEPTORS } from '@angular/common/http';

import { AuthInterceptor } from './auth.interceptor';

/** Http interceptor providers in outside-in order */
export const HttpInterceptorProviders = [
  { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },
];


================================================
FILE: Lab2/client/Admin/src/app/models/index.ts
================================================
export * from './interfaces';


================================================
FILE: Lab2/client/Admin/src/app/models/interfaces.ts
================================================
export interface INavData {
  name?: string;
  url?: string | any[];
  href?: string;
  icon?: string;
  title?: boolean;
  children?: INavData[];
  variant?: string;
  divider?: boolean;
  class?: string;
}


================================================
FILE: Lab2/client/Admin/src/app/nav/nav.component.css
================================================
.sidenav-container {
  height: 100%;
}

.sidenav-content-container {
  background-color: lightgray;
}

.sidenav {
  width: 200px;
  background-color: #2f353a;
}

.mat-list-item {
  color: whitesmoke;
}

.mat-toolbar.mat-primary {
  position: sticky;
  top: 0;
  z-index: 1;
}

.spacer {
  flex: 1 1 auto;
}

.material-symbols-outlined {
  font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 48;
}

.logo {
  width: 100px;
  height: auto;
}

.nav-icon {
  color: #20a8d8;
}

.spinner-container {
  height: 80%;
  display: flex;
  justify-content: center;
  align-items: center;
  box-sizing: border-box;
}


================================================
FILE: Lab2/client/Admin/src/app/nav/nav.component.html
================================================
<mat-sidenav-container class="sidenav-container">
  <mat-sidenav
    #drawer
    class="sidenav"
    fixedInViewport
    [attr.role]="(isHandset$ | async) ? 'dialog' : 'navigation'"
    [mode]="(isHandset$ | async) ? 'over' : 'side'"
    [opened]="(isHandset$ | async) === false"
  >
    <mat-toolbar
      ><mat-icon svgIcon="saas-commerce" class="logo"></mat-icon
    ></mat-toolbar>
    <mat-nav-list>
      <mat-list-item *ngFor="let navItem of navItems">
        <mat-icon mat-list-icon class="nav-icon material-symbols-outlined">{{
          navItem.icon
        }}</mat-icon>
        <a mat-list-item routerLink="{{ navItem.url }}">{{ navItem.name }}</a>
      </mat-list-item>
    </mat-nav-list>
  </mat-sidenav>
  <mat-sidenav-content class="sidenav-content-container">
    <mat-toolbar>
      <button
        type="button"
        aria-label="Toggle sidenav"
        mat-icon-button
        (click)="drawer.toggle()"
      >
        <mat-icon aria-label="Side nav toggle icon">menu</mat-icon>
      </button>
      <span class="spacer"></span>
      <button
        mat-icon-button
        aria-label="account circle with outlined person icon"
        [matMenuTriggerFor]="useroptions"
      >
        <mat-icon class="material-symbols-outlined">person_filled</mat-icon>
      </button>
    </mat-toolbar>
    <mat-menu #useroptions="matMenu">
      <ng-template #loggedOut>
        <button mat-menu-item>
          <mat-icon class="material-symbols-outlined">lock_open</mat-icon>
          <span>Login</span>
        </button>
      </ng-template>
      <span style="margin: 8px">{{ username$ | async }}</span>
      <mat-divider></mat-divider>
      <button mat-menu-item>
        <mat-icon class="material-symbols-outlined">face</mat-icon>
        <span>Profile</span>
      </button>
      <button routerLink="/auth/info" mat-menu-item>
        <mat-icon class="material-symbols-outlined">construction</mat-icon>
        <span>Auth Debug</span>
      </button>
    </mat-menu>
    <div class="spinner-container" *ngIf="loading$ | async">
      <mat-spinner></mat-spinner>
    </div>
    <router-outlet></router-outlet>
  </mat-sidenav-content>
</mat-sidenav-container>


================================================
FILE: Lab2/client/Admin/src/app/nav/nav.component.spec.ts
================================================
import { LayoutModule } from '@angular/cdk/layout';
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatListModule } from '@angular/material/list';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatToolbarModule } from '@angular/material/toolbar';

import { NavComponent } from './nav.component';

describe('NavComponent', () => {
  let component: NavComponent;
  let fixture: ComponentFixture<NavComponent>;

  beforeEach(waitForAsync(() => {
    TestBed.configureTestingModule({
      declarations: [NavComponent],
      imports: [
        NoopAnimationsModule,
        LayoutModule,
        MatButtonModule,
        MatIconModule,
        MatListModule,
        MatSidenavModule,
        MatToolbarModule,
      ]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(NavComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should compile', () => {
    expect(component).toBeTruthy();
  });
});


================================================
FILE: Lab2/client/Admin/src/app/nav/nav.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
import { from, Observable, of } from 'rxjs';
import { filter, map, shareReplay } from 'rxjs/operators';
import {
  NavigationCancel,
  NavigationEnd,
  NavigationError,
  NavigationStart,
  Router,
} from '@angular/router';

import { AuthenticatorService } from '@aws-amplify/ui-angular';
import { Auth } from 'aws-amplify';
import { navItems } from '../_nav';

@Component({
  selector: 'app-nav',
  templateUrl: './nav.component.html',
  styleUrls: ['./nav.component.css'],
})
export class NavComponent implements OnInit {
  tenantName = '';
  loading$: Observable<boolean> = of(false);
  isAuthenticated$: Observable<Boolean> | undefined;
  username$: Observable<string> | undefined;
  companyName$: Observable<string> | undefined;
  public navItems = navItems;
  isHandset$: Observable<boolean> = this.breakpointObserver
    .observe(Breakpoints.Handset)
    .pipe(
      map((result) => result.matches),
      shareReplay()
    );

  constructor(
    private breakpointObserver: BreakpointObserver,
    private router: Router
  ) {
    this.loading$ = this.router.events.pipe(
      filter(
        (e) =>
          e instanceof NavigationStart ||
          e instanceof NavigationEnd ||
          e instanceof NavigationCancel ||
          e instanceof NavigationError
      ),
      map((e) => e instanceof NavigationStart)
    );
  }

  ngOnInit(): void {
    try {
      const s = Auth.currentSession().catch((err) => err);
      const session$ = from(s);
      this.isAuthenticated$ = session$.pipe(
        filter((sesh) => !!sesh),
        map((sesh) => sesh && sesh.isValid())
      );
      const token$ = session$.pipe(map((sesh) => sesh && sesh.getIdToken()));
      this.username$ = token$.pipe(
        map((t) => t && t.payload['cognito:username'])
      );
      this.companyName$ = token$.pipe(
        map((t) => t.payload['custom:company-name'])
      );
    } catch (err) {
      console.error('Unable to get current session.');
    }
  }
}


================================================
FILE: Lab2/client/Admin/src/app/views/auth/auth.component.html
================================================
<div *ngIf="isAuthenticated$ | async as isAuthenticated">
  <div class="animated fadeIn">
    <div class="row">
      <div class="col-md-6">
        <button type="button" class="btn btn-primary" (click)="logout()">
          Logout
        </button>
      </div>
    </div>
    <div class="row mt-4">
      <div class="col-sm-6">
        <mat-card class="card">
          <mat-card-header class="card-header">Access Token</mat-card-header>
          <div class="card-body">
            <pre>
              <code spellcheck="false">
                {{accessToken$ | async}}
              </code>
            </pre>
          </div>
        </mat-card>
      </div>
      <div class="col-sm-6">
        <mat-card class="card">
          <mat-card-header class="card-header">ID Token</mat-card-header>
          <div class="card-body">
            <pre>
              <code spellcheck="false">
                {{idToken$ | async}}
              </code>
            </pre>
          </div>
        </mat-card>
      </div>
    </div>
  </div>

  <hr />

  <br />
  <br />
  <mat-card class="card">
    <mat-card-header><h2>User Data</h2></mat-card-header>
    Is Authenticated: {{ isAuthenticated$ | async }}
    <pre>{{ session$ | async | json }}</pre>
  </mat-card>
  <br />
</div>


================================================
FILE: Lab2/client/Admin/src/app/views/auth/auth.component.scss
================================================
/*
 * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this
 * software and associated documentation files (the "Software"), to deal in the Software
 * without restriction, including without limitation the rights to use, copy, modify,
 * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
pre,
code {
  font-family: monospace, monospace;
}
pre {
  white-space: pre-wrap; /* css-3 */
  white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
  white-space: -pre-wrap; /* Opera 4-6 */
  white-space: -o-pre-wrap; /* Opera 7 */
  word-wrap: break-word; /* Internet Explorer 5.5+ */
  overflow: auto;
}

.card {
  margin: 20px;
}

.card-header {
  justify-content: center;
  font-size: larger;
  font-weight: bold;
}


================================================
FILE: Lab2/client/Admin/src/app/views/auth/auth.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { from, Observable, pipe } from 'rxjs';
import { Auth } from 'aws-amplify';
import { CognitoUserSession } from 'amazon-cognito-identity-js';
import { map } from 'rxjs/operators';

@Component({
  templateUrl: './auth.component.html',
  styleUrls: ['./auth.component.scss'],
})
export class AuthComponent implements OnInit {
  session$: Observable<CognitoUserSession> | undefined;
  userData$: Observable<any> | undefined;
  isAuthenticated$: Observable<boolean> | undefined;
  checkSessionChanged$: Observable<boolean> | undefined;
  idToken$: Observable<string> | undefined;
  accessToken$: Observable<string> | undefined;
  checkSessionChanged: any;

  constructor() {}

  ngOnInit(): void {
    this.session$ = from(Auth.currentSession());
    this.accessToken$ = this.session$.pipe(
      map((sesh) => sesh.getAccessToken().getJwtToken())
    );
    this.idToken$ = this.session$.pipe(
      map((sesh) => sesh.getIdToken().getJwtToken())
    );
    this.isAuthenticated$ = this.session$.pipe(map((sesh) => sesh.isValid()));
  }

  async logout() {
    await Auth.signOut({ global: true });
  }
}


================================================
FILE: Lab2/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { DashboardComponent } from './dashboard.component';

const routes: Routes = [
  {
    path: '',
    component: DashboardComponent,
    data: {
      title: 'Dashboard',
    },
  },
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule],
})
export class DashboardRoutingModule {}


================================================
FILE: Lab2/client/Admin/src/app/views/dashboard/dashboard.component.html
================================================
<!--/.row-->
<mat-card class="card">
  <mat-card-header class="card-body">
    <div class="col-sm-5">
      <h4 class="card-title mb-0">Traffic</h4>
      <div class="small text-muted">December 2020</div>
    </div>
  </mat-card-header>
  <mat-card-content class="chart-wrapper">
    <canvas
      baseChart
      [type]="lineChartType"
      [datasets]="lineChartData"
      [labels]="lineChartLabels"
      [options]="lineChartOptions"
      [legend]="lineChartLegend"
    ></canvas>
  </mat-card-content>
</mat-card>


================================================
FILE: Lab2/client/Admin/src/app/views/dashboard/dashboard.component.scss
================================================
.grid-container {
  margin: 20px;
}

.dashboard-card {
  position: absolute;
  top: 15px;
  left: 15px;
  right: 15px;
  bottom: 15px;
}

.more-button {
  position: absolute;
  top: 5px;
  right: 10px;
  border: none;
}

.dashboard-card-content {
  text-align: center;
}

.chart-wrapper {
  padding-right: 20px;
  position: relative;
  margin: auto;
  height: 80vh;
  width: 80vw;
}


================================================
FILE: Lab2/client/Admin/src/app/views/dashboard/dashboard.component.ts
================================================
/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: MIT-0
 */
import { Component, OnInit } from '@angular/core';
import { ChartConfiguration, ChartType } from 'chart.js';
import { TenantsService } from '../tenants/tenants.service';

interface DataSet {
  label: string;
  data: number[];
}
interface ChartData {
  tenantId: string;
  dataSet: DataSet[];
  totalOrders: number;
}

@Component({
  templateUrl: 'dashboard.component.html',
  styleUrls: ['./dashboard.component.scss'],
  selector: 'app-dashboard',
})
export class DashboardComponent implements OnInit {
  constructor(private tenantSvc: TenantsService) {}

  data: ChartData[] = [];

  // lineChart
  public lineChartElements = 27;
  public lineChartData1: Array<number> = [];
  public lineChartData2: Array<number> = [];
  public lineChartData3: Array<number> = [];

  public lineChartData: Array<any> = [
    {
      data: this.lineChartData1,
      label: 'Current',
      backgroundColor: 'rgba(148,159,177,0.2)',
      borderColor: 'rgba(148,159,177,1)',
      pointBackgroundColor: 'rgba(148,159,177,1)',
      pointBorderColor: '#fff',
      pointHoverBackgroundColor: '#fff',
      pointHoverBorderColor: 'rgba(148,159,177,0.8)',
      fill: 'origin',
    },
    {
      data: this.lineChartData2,
      label: 'Previous',
      backgroundColor: 'rgba(77,83,96,0.2)',
      borderColor: 'rgba(77,83,96,1)',
      pointBackgroundColor: 'rgba(77,83,96,1)',
      pointBorderColor: '#fff',
      pointHoverBackgroundColor: '#fff',
      pointHoverBorderColor: 'rgba(77,83,96,1)',
      fill: 'origin',
    },
    {
      data: this.lineChartData3,
      label: 'BEP',
      backgroundColor: 'rgba(255,0,0,0.3)',
      borderColor: 'red',
      pointBackgroundColor: 'rgba(148,159,177,1)',
      pointBorderColor: '#fff',
      pointHoverBackgroundColor: '#fff',
      pointHoverBorderColor: 'rgba(148,159,177,0.8)',
      fill: 'origin',
    },
  ];

  public lineChartLegend = false;
  /* tslint:disable:max-line-length */
  public lineChartLabels: Array<any> = [
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
    'Sunday',
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
    'Sunday',
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
    'Sunday',
    'Monday',
    'Thursday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
    'Sunday',
  ];
  /* tslint:enable:max-line-length */

  public lineChartType: ChartType = 'line';

  public lineChartOptions: ChartConfiguration['options'] = {
    maintainAspectRatio: false,
    elements: {
      line: {
        tension: 0.5,
      },
    },
    scales: {
      // We use this empty structure as a placeholder for dynamic theming.
      x: {},
      'y-axis-0': {
        position: 'left',
      },
      'y-axis-1': {
        position: 'right',
        grid: {
          color: 'rgba(80,80,80,0.3)',
        },
        ticks: {
          color: '#808080',
        },
      },
    },
  };

  public random(min: number, max: number) {
    return Math.floor(Math.random() * (max - min + 1) + min);
  }

  ngOnInit(): void {
    for (let i = 0; i <= this.lineChartElements; i++) {
      this.lineChartData1.push(this.random(50, 200));
      this.lineChartData2.push(this.random(80, 100));
      this.lineChartData3.push(65);
    }
  }
}


================================================
FILE: Lab2/client/Admin/src/app/views/dashboard/dashboard.module.ts
================================================
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DashboardComponent } from './dashboard.component';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatIconModule } from '@angular/material/icon';
import { MatListModule } from '@angular/material/list';
import { MatMenuModule } from '@angular/material/menu';

import { NgChartsModule } from 'ng2-charts';

import { DashboardRoutingModule } from './dashboard-routing.module';

@NgModule({
  declarations: [DashboardComponent],
  imports: [
    CommonModule,
    DashboardRoutingModule,
    MatButtonModule,
    MatCardModule,
    MatGridListModule,
    MatIconModule,
    MatListModule,
    MatMenuModule,
    NgChartsModule,
  ],
})
export class DashboardModule {}


================================================
FILE: Lab2/client/Admin/src/app/views/tenants/create/create.component.html
================================================
<div fxLayout="column" class="tenant-form">
  <form [formGroup]="tenantForm" (submit)="submit()">
    <mat-card class="card">
      <mat-card-title>Provision tenant</mat-card-title>
      <mat-card-content>
        <mat-form-field>
          <mat-label>Name</mat-label>
          <input
            matInput
            placeholder="tenant1"
            formControlName="tenantName"
            required
          />
        </mat-form-field>
        <mat-form-field>
          <mat-label>Email</mat-label>
          <input
            matInput
            placeholder="jsmith@example.com"
            formControlName="tenantEmail"
            required
          />
        </mat-form-field>
        <mat-form-field>
          <mat-label>Phone</mat-label>
          <input
            matInput
            placeholder="1234567890"
            formControlName="tenantPhone"
          />
        </mat-form-field>
        <mat-form-field>
          <mat-label>Address</mat-label>
          <input
            matInput
            placeholder=""
            formControlName="tenantAddress"
          />
        </mat-form-field>
        <mat-form-field appearance="fill">
          <mat-label>Plan</mat-label>
          <select matNativeControl required formControlName="tenantTier">
            <option>Select one...</option>
            <option value="Basic">Basic</option>
            <option value="Standard">Standard</option>
            <option value="Premium">Premium</option>
            <option value="Platinum">Platinum</option>
          </select>
        </mat-form-field>
        <mat-card-footer>
          <div class="button-panel">
            <button
              mat-raised-button
              color="primary"
              (click)="(submit)"
              [disabled]="!tenantForm.valid"
              type="submit"
              *ngIf="!submitting"
            >
              Submit
            </button>
            <button mat-raised-button color="warn" [routerLink]="['/tenants']" type="button" *ngIf="!submitting">
              Cancel
            </button>
            <mat-card *ngIf="submitting" style="display: flex; justify-content: center; align-items: center">
              <mat-progress-spinner
                color="primary"
                mode="indeterminate"
                diameter="15"
                >
              </mat-progress-spinner>
            </mat-card>
          </div>
        </mat-card-footer>
      </mat-card-content>
    </mat-card>
  </form>
</div>


================================================
FILE: Lab2/client/Admin/src/app/views/tenants/create/create.component.scss
================================================
.card {
  margin: 20px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  width: fit-content;
}

.product-form {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

.mat-form-field {
  display: flex;
}

.button-panel {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 8px;
}

button {
  margin: 4px;
}


================================================
FILE: Lab2/client/Admin/src/app/views/tenants/create/create.component.ts
================================================
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { TenantsService } from '../tenants.service';
import { MatSnackBar } from '@angular/material/snack-bar';

@Component({
  selector: 'app-create',
  templateUrl: './create.component.html',
  styleUrls: ['./create.component.scss'],
})
export class CreateComponent implements OnInit {
  submitting = false;
  tenantForm: FormGroup = this.fb.group({
    tenantName: [null, [Validators.required]],
    tenantEmail: [null, [Validators.email, Validators.required]],
    tenantTier: [null, [Validators.required]],
    tenantPhone: [null],
    tenantAddress: [null],
  });

  constructor(
    private fb: FormBuilder,
    private tenantSvc: TenantsService,
    private router: Router,
    private _snackBar: MatSnackBar
  ) {}

  ngOnInit(): void {}

  openErrorMessageSnackBar(errorMessage: string) {
    this._snackBar.open(errorMessage, 'Dismiss', {
      duration: 4 * 1000, // seconds
    });
  }

  submit() {
    this.submitting = true;
    const user = {
      ...this.tenantForm.value,
    };

    this.tenantSvc.post(this.tenantForm.value).subscribe({
      next: () => {
        this.submitting = false;
        this.openErrorMessageSnackBar('Successfully created new tenant!');
        this.router.navigate(['tenants']);
      },
      error: (err) => {
        this.submitting = false;
        this.openErrorMessageSnackBar('An unexpected error occurred!');
        console.error(err);
      },
    });
  }
}


================================================
FILE: Lab2/client/Admin/src/app/views/tenants/list/list.component.html
================================================
<div class="tenant-list">
  <mat-card class="card">
    <mat-card-content>
      <mat-card-title>
        Tenant L
Download .txt
gitextract_xdujmuk7/

├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cloud9Setup/
│   ├── .gitignore
│   ├── README.md
│   ├── increase-disk-size.sh
│   ├── pre-requisites-versions-check.sh
│   ├── pre-requisites.sh
│   └── samconfig.toml
├── LICENSE
├── LICENSE-SAMPLECODE
├── LICENSE-SUMMARY
├── Lab1/
│   ├── client/
│   │   └── Application/
│   │       ├── .browserslistrc
│   │       ├── .editorconfig
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── angular.json
│   │       ├── karma.conf.js
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── _nav.ts
│   │       │   │   ├── app-routing.module.ts
│   │       │   │   ├── app.component.scss
│   │       │   │   ├── app.component.ts
│   │       │   │   ├── app.module.ts
│   │       │   │   ├── models/
│   │       │   │   │   ├── index.ts
│   │       │   │   │   └── interfaces.ts
│   │       │   │   ├── nav/
│   │       │   │   │   ├── nav.component.html
│   │       │   │   │   ├── nav.component.scss
│   │       │   │   │   └── nav.component.ts
│   │       │   │   └── views/
│   │       │   │       ├── dashboard/
│   │       │   │       │   ├── dashboard-routing.module.ts
│   │       │   │       │   ├── dashboard.component.html
│   │       │   │       │   ├── dashboard.component.scss
│   │       │   │       │   ├── dashboard.component.ts
│   │       │   │       │   └── dashboard.module.ts
│   │       │   │       ├── orders/
│   │       │   │       │   ├── create/
│   │       │   │       │   │   ├── create.component.html
│   │       │   │       │   │   ├── create.component.scss
│   │       │   │       │   │   └── create.component.ts
│   │       │   │       │   ├── detail/
│   │       │   │       │   │   ├── detail.component.html
│   │       │   │       │   │   ├── detail.component.scss
│   │       │   │       │   │   └── detail.component.ts
│   │       │   │       │   ├── list/
│   │       │   │       │   │   ├── list.component.html
│   │       │   │       │   │   ├── list.component.scss
│   │       │   │       │   │   └── list.component.ts
│   │       │   │       │   ├── models/
│   │       │   │       │   │   ├── order.interface.ts
│   │       │   │       │   │   └── orderproduct.interface.ts
│   │       │   │       │   ├── orders-routing.module.ts
│   │       │   │       │   ├── orders.module.ts
│   │       │   │       │   └── orders.service.ts
│   │       │   │       └── products/
│   │       │   │           ├── create/
│   │       │   │           │   ├── create.component.html
│   │       │   │           │   ├── create.component.scss
│   │       │   │           │   └── create.component.ts
│   │       │   │           ├── edit/
│   │       │   │           │   ├── edit.component.html
│   │       │   │           │   ├── edit.component.scss
│   │       │   │           │   └── edit.component.ts
│   │       │   │           ├── list/
│   │       │   │           │   ├── list.component.html
│   │       │   │           │   ├── list.component.scss
│   │       │   │           │   └── list.component.ts
│   │       │   │           ├── models/
│   │       │   │           │   └── product.interface.ts
│   │       │   │           ├── product.service.ts
│   │       │   │           ├── products-routing.module.ts
│   │       │   │           └── products.module.ts
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   ├── custom-theme.scss
│   │       │   ├── environments/
│   │       │   │   ├── environment.prod.ts
│   │       │   │   └── environment.ts
│   │       │   ├── index.html
│   │       │   ├── main.ts
│   │       │   ├── polyfills.ts
│   │       │   ├── styles/
│   │       │   │   ├── _variables.scss
│   │       │   │   └── reset.scss
│   │       │   ├── styles.scss
│   │       │   └── test.ts
│   │       ├── tsconfig.app.json
│   │       ├── tsconfig.json
│   │       └── tsconfig.spec.json
│   ├── scripts/
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── layers/
│       │   ├── logger.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── samconfig.toml
│       └── template.yaml
├── Lab2/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── Landing/
│   │       ├── .browserslistrc
│   │       ├── .editorconfig
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── angular.json
│   │       ├── karma.conf.js
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── app-routing.module.ts
│   │       │   │   ├── app.component.scss
│   │       │   │   ├── app.component.ts
│   │       │   │   ├── app.module.ts
│   │       │   │   └── views/
│   │       │   │       ├── landing/
│   │       │   │       │   ├── landing.component.html
│   │       │   │       │   ├── landing.component.scss
│   │       │   │       │   └── landing.component.ts
│   │       │   │       └── register/
│   │       │   │           ├── register.component.html
│   │       │   │           ├── register.component.scss
│   │       │   │           └── register.component.ts
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   ├── custom-theme.scss
│   │       │   ├── environments/
│   │       │   │   ├── environment.prod.ts
│   │       │   │   └── environment.ts
│   │       │   ├── index.html
│   │       │   ├── main.ts
│   │       │   ├── polyfills.ts
│   │       │   ├── styles/
│   │       │   │   ├── _variables.scss
│   │       │   │   └── reset.scss
│   │       │   ├── styles.scss
│   │       │   └── test.ts
│   │       ├── tsconfig.app.json
│   │       ├── tsconfig.json
│   │       └── tsconfig.spec.json
│   ├── scripts/
│   │   ├── deploy-updates.sh
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   └── shared_service_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── layers/
│       │   ├── logger.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── samconfig.toml
│       └── template.yaml
├── Lab3/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Application/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── cypress/
│   │   │   │   ├── README.md
│   │   │   │   └── e2e/
│   │   │   │       └── 1-getting-started/
│   │   │   │           ├── basic-access.cy.js
│   │   │   │           └── product-testing.cy.js
│   │   │   ├── cypress.config.ts
│   │   │   ├── cypress.env.json.example
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │       │   └── models/
│   │   │   │   │       │       └── config-params.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── error/
│   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │       ├── orders/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── detail/
│   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │       ├── products/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │       │   └── products.module.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Landing/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── landing/
│   │   │   │   │       │   ├── landing.component.html
│   │   │   │   │       │   ├── landing.component.scss
│   │   │   │   │       │   └── landing.component.ts
│   │   │   │   │       └── register/
│   │   │   │   │           ├── register.component.html
│   │   │   │   │           ├── register.component.scss
│   │   │   │   │           └── register.component.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── dummy.txt
│   ├── scripts/
│   │   ├── deploy-updates.sh
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   ├── shared_service_authorizer.py
│       │   └── tenant_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── layers/
│       │   ├── auth_manager.py
│       │   ├── logger.py
│       │   ├── metrics_manager.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── shared-samconfig.toml
│       ├── shared-template.yaml
│       ├── tenant-samconfig.toml
│       └── tenant-template.yaml
├── Lab4/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Application/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── cypress/
│   │   │   │   ├── README.md
│   │   │   │   └── e2e/
│   │   │   │       └── 1-getting-started/
│   │   │   │           ├── basic-access.cy.js
│   │   │   │           └── product-testing.cy.js
│   │   │   ├── cypress.config.ts
│   │   │   ├── cypress.env.json.example
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │       │   └── models/
│   │   │   │   │       │       └── config-params.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── error/
│   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │       ├── orders/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── detail/
│   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │       ├── products/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │       │   └── products.module.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Landing/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── landing/
│   │   │   │   │       │   ├── landing.component.html
│   │   │   │   │       │   ├── landing.component.scss
│   │   │   │   │       │   └── landing.component.ts
│   │   │   │   │       └── register/
│   │   │   │   │           ├── register.component.html
│   │   │   │   │           ├── register.component.scss
│   │   │   │   │           └── register.component.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── dummy.txt
│   ├── scripts/
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   ├── shared_service_authorizer.py
│       │   └── tenant_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── layers/
│       │   ├── auth_manager.py
│       │   ├── logger.py
│       │   ├── metrics_manager.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── shared-samconfig.toml
│       ├── shared-template.yaml
│       ├── tenant-samconfig.toml
│       └── tenant-template.yaml
├── Lab5/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Application/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── cypress/
│   │   │   │   ├── README.md
│   │   │   │   └── e2e/
│   │   │   │       └── 1-getting-started/
│   │   │   │           ├── basic-access.cy.js
│   │   │   │           └── product-testing.cy.js
│   │   │   ├── cypress.config.ts
│   │   │   ├── cypress.env.json.example
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │       │   └── models/
│   │   │   │   │       │       └── config-params.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── error/
│   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │       ├── orders/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── detail/
│   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │       ├── products/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │       │   └── products.module.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── Landing/
│   │       ├── .browserslistrc
│   │       ├── .editorconfig
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── angular.json
│   │       ├── karma.conf.js
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── app-routing.module.ts
│   │       │   │   ├── app.component.scss
│   │       │   │   ├── app.component.ts
│   │       │   │   ├── app.module.ts
│   │       │   │   └── views/
│   │       │   │       ├── landing/
│   │       │   │       │   ├── landing.component.html
│   │       │   │       │   ├── landing.component.scss
│   │       │   │       │   └── landing.component.ts
│   │       │   │       └── register/
│   │       │   │           ├── register.component.html
│   │       │   │           ├── register.component.scss
│   │       │   │           └── register.component.ts
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   ├── custom-theme.scss
│   │       │   ├── environments/
│   │       │   │   ├── environment.prod.ts
│   │       │   │   └── environment.ts
│   │       │   ├── index.html
│   │       │   ├── main.ts
│   │       │   ├── polyfills.ts
│   │       │   ├── styles/
│   │       │   │   ├── _variables.scss
│   │       │   │   └── reset.scss
│   │       │   ├── styles.scss
│   │       │   └── test.ts
│   │       ├── tsconfig.app.json
│   │       ├── tsconfig.json
│   │       └── tsconfig.spec.json
│   ├── scripts/
│   │   ├── deploy-updates.sh
│   │   ├── deployment.sh
│   │   └── geturl.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   ├── shared_service_authorizer.py
│       │   └── tenant_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-provisioning.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── TenantPipeline/
│       │   ├── .gitignore
│       │   ├── .npmignore
│       │   ├── README.md
│       │   ├── bin/
│       │   │   └── pipeline.ts
│       │   ├── cdk.json
│       │   ├── jest.config.js
│       │   ├── lib/
│       │   │   └── serverless-saas-stack.ts
│       │   ├── package.json
│       │   ├── resources/
│       │   │   └── lambda-deploy-tenant-stack.py
│       │   ├── test/
│       │   │   └── pipeline.test.ts
│       │   └── tsconfig.json
│       ├── custom_resources/
│       │   ├── requirements.txt
│       │   ├── update_settings_table.py
│       │   ├── update_tenant_apigatewayurl.py
│       │   └── update_tenantstackmap_table.py
│       ├── layers/
│       │   ├── auth_manager.py
│       │   ├── logger.py
│       │   ├── metrics_manager.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── custom_resources.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── shared-samconfig.toml
│       ├── shared-template.yaml
│       ├── tenant-buildspec.yml
│       ├── tenant-samconfig.toml
│       └── tenant-template.yaml
├── Lab6/
│   ├── client/
│   │   ├── Admin/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── tenants/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── aws-exports.ts
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   ├── Application/
│   │   │   ├── .browserslistrc
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── angular.json
│   │   │   ├── cypress/
│   │   │   │   ├── README.md
│   │   │   │   └── e2e/
│   │   │   │       └── 1-getting-started/
│   │   │   │           ├── basic-access.cy.js
│   │   │   │           └── product-testing.cy.js
│   │   │   ├── cypress.config.ts
│   │   │   ├── cypress.env.json.example
│   │   │   ├── karma.conf.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── app/
│   │   │   │   │   ├── _nav.ts
│   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   ├── app.component.scss
│   │   │   │   │   ├── app.component.ts
│   │   │   │   │   ├── app.module.ts
│   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── models/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   ├── nav/
│   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   └── views/
│   │   │   │   │       ├── auth/
│   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │       │   └── models/
│   │   │   │   │       │       └── config-params.ts
│   │   │   │   │       ├── dashboard/
│   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │       ├── error/
│   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │       ├── orders/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── detail/
│   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │       ├── products/
│   │   │   │   │       │   ├── create/
│   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │       │   ├── list/
│   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │       │   ├── models/
│   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │       │   └── products.module.ts
│   │   │   │   │       └── users/
│   │   │   │   │           ├── create/
│   │   │   │   │           │   ├── create.component.html
│   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │           │   └── create.component.ts
│   │   │   │   │           ├── list/
│   │   │   │   │           │   ├── list.component.html
│   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │           │   └── list.component.ts
│   │   │   │   │           ├── models/
│   │   │   │   │           │   └── user.ts
│   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │           ├── users.module.ts
│   │   │   │   │           └── users.service.ts
│   │   │   │   ├── assets/
│   │   │   │   │   └── .gitkeep
│   │   │   │   ├── custom-theme.scss
│   │   │   │   ├── environments/
│   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   └── environment.ts
│   │   │   │   ├── index.html
│   │   │   │   ├── main.ts
│   │   │   │   ├── polyfills.ts
│   │   │   │   ├── styles/
│   │   │   │   │   ├── _variables.scss
│   │   │   │   │   └── reset.scss
│   │   │   │   ├── styles.scss
│   │   │   │   └── test.ts
│   │   │   ├── tsconfig.app.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.spec.json
│   │   └── Landing/
│   │       ├── .browserslistrc
│   │       ├── .editorconfig
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── angular.json
│   │       ├── karma.conf.js
│   │       ├── package.json
│   │       ├── src/
│   │       │   ├── app/
│   │       │   │   ├── app-routing.module.ts
│   │       │   │   ├── app.component.scss
│   │       │   │   ├── app.component.ts
│   │       │   │   ├── app.module.ts
│   │       │   │   └── views/
│   │       │   │       ├── landing/
│   │       │   │       │   ├── landing.component.html
│   │       │   │       │   ├── landing.component.scss
│   │       │   │       │   └── landing.component.ts
│   │       │   │       └── register/
│   │       │   │           ├── register.component.html
│   │       │   │           ├── register.component.scss
│   │       │   │           └── register.component.ts
│   │       │   ├── assets/
│   │       │   │   └── .gitkeep
│   │       │   ├── custom-theme.scss
│   │       │   ├── environments/
│   │       │   │   ├── environment.prod.ts
│   │       │   │   └── environment.ts
│   │       │   ├── index.html
│   │       │   ├── main.ts
│   │       │   ├── polyfills.ts
│   │       │   ├── styles/
│   │       │   │   ├── _variables.scss
│   │       │   │   └── reset.scss
│   │       │   ├── styles.scss
│   │       │   └── test.ts
│   │       ├── tsconfig.app.json
│   │       ├── tsconfig.json
│   │       └── tsconfig.spec.json
│   ├── scripts/
│   │   ├── deployment.sh
│   │   ├── geturl.sh
│   │   └── test-basic-tier-throttling.sh
│   └── server/
│       ├── .gitignore
│       ├── OrderService/
│       │   ├── order_models.py
│       │   ├── order_service.py
│       │   ├── order_service_dal.py
│       │   └── requirements.txt
│       ├── ProductService/
│       │   ├── product_models.py
│       │   ├── product_service.py
│       │   ├── product_service_dal.py
│       │   └── requirements.txt
│       ├── README.md
│       ├── Resources/
│       │   ├── requirements.txt
│       │   ├── shared_service_authorizer.py
│       │   └── tenant_authorizer.py
│       ├── TenantManagementService/
│       │   ├── requirements.txt
│       │   ├── tenant-management.py
│       │   ├── tenant-provisioning.py
│       │   ├── tenant-registration.py
│       │   └── user-management.py
│       ├── TenantPipeline/
│       │   ├── .gitignore
│       │   ├── .npmignore
│       │   ├── README.md
│       │   ├── bin/
│       │   │   └── pipeline.ts
│       │   ├── cdk.json
│       │   ├── jest.config.js
│       │   ├── lib/
│       │   │   └── serverless-saas-stack.ts
│       │   ├── package.json
│       │   ├── resources/
│       │   │   └── lambda-deploy-tenant-stack.py
│       │   ├── test/
│       │   │   └── pipeline.test.ts
│       │   └── tsconfig.json
│       ├── custom_resources/
│       │   ├── requirements.txt
│       │   ├── update_settings_table.py
│       │   ├── update_tenant_apigatewayurl.py
│       │   ├── update_tenantstackmap_table.py
│       │   └── update_usage_plan.py
│       ├── layers/
│       │   ├── auth_manager.py
│       │   ├── logger.py
│       │   ├── metrics_manager.py
│       │   ├── requirements.txt
│       │   └── utils.py
│       ├── nested_templates/
│       │   ├── apigateway.yaml
│       │   ├── apigateway_lambdapermissions.yaml
│       │   ├── cognito.yaml
│       │   ├── custom_resources.yaml
│       │   ├── lambdafunctions.yaml
│       │   ├── tables.yaml
│       │   └── userinterface.yaml
│       ├── shared-samconfig.toml
│       ├── shared-template.yaml
│       ├── tenant-buildspec.yml
│       ├── tenant-samconfig.toml
│       └── tenant-template.yaml
├── Lab7/
│   ├── .aws-sam/
│   │   ├── build/
│   │   │   ├── GetDynamoDBUsageAndCostByTenant/
│   │   │   │   ├── requirements.txt
│   │   │   │   └── tenant_usage_and_cost.py
│   │   │   ├── GetLambdaUsageAndCostByTenant/
│   │   │   │   ├── requirements.txt
│   │   │   │   └── tenant_usage_and_cost.py
│   │   │   └── template.yaml
│   │   └── build.toml
│   ├── SampleCUR/
│   │   ├── 20221011_211731_00058_ff5sr_094c8542-2cfd-459d-96e1-10e3bc2ac7a6
│   │   ├── 20221011_211731_00058_ff5sr_1ded6019-91c5-470a-9533-5a63ff447fa4
│   │   ├── 20221011_211731_00058_ff5sr_265b33b8-c229-4a42-9c51-e54380ec03b0
│   │   ├── 20221011_211731_00058_ff5sr_36154ed1-7420-43dc-9bce-e30ff784b7fc
│   │   ├── 20221011_211731_00058_ff5sr_4644e2bd-8b84-42df-bce7-35b29a0d3b83
│   │   ├── 20221011_211731_00058_ff5sr_47129e77-847c-420a-acac-3ce962bad5af
│   │   ├── 20221011_211731_00058_ff5sr_4f484d50-53e1-40f6-84d3-1495af1981e7
│   │   ├── 20221011_211731_00058_ff5sr_501fe43e-84a3-4665-8ae6-e81ac0a8c024
│   │   ├── 20221011_211731_00058_ff5sr_586d15f5-4ff9-4231-9693-d601f8a96386
│   │   ├── 20221011_211731_00058_ff5sr_5cf01031-5bec-496a-9003-354edff50dcc
│   │   ├── 20221011_211731_00058_ff5sr_74023afa-6ec8-4281-a5ce-b4771aac2ae0
│   │   ├── 20221011_211731_00058_ff5sr_7fb5dd51-6c56-41be-94fc-0cb6fc122cfd
│   │   ├── 20221011_211731_00058_ff5sr_93372514-9952-4af6-a6f3-396921248c28
│   │   ├── 20221011_211731_00058_ff5sr_952352a7-a59a-4f6c-b359-aa2251d1f6a8
│   │   ├── 20221011_211731_00058_ff5sr_9ab989ba-acce-479c-bc60-c33acffa4c79
│   │   ├── 20221011_211731_00058_ff5sr_9b9fe19e-b145-49d1-9aed-135fec199529
│   │   ├── 20221011_211731_00058_ff5sr_a35b0a43-ebb6-44e1-949b-14d3e0472842
│   │   ├── 20221011_211731_00058_ff5sr_a6fa2ec0-8151-41a2-b6ef-f0f630ff956f
│   │   ├── 20221011_211731_00058_ff5sr_aa65c209-65b9-4c95-873a-7c863ea5e0a7
│   │   ├── 20221011_211731_00058_ff5sr_b0cfe354-83a9-403b-9371-477dc4f4e8ef
│   │   ├── 20221011_211731_00058_ff5sr_b6f519bf-0afa-480a-b5ab-5d75bec1490d
│   │   ├── 20221011_211731_00058_ff5sr_c0ad9ac0-db23-4466-9eb2-d59b532bf15a
│   │   ├── 20221011_211731_00058_ff5sr_c3499311-c8db-4272-875a-280a7473d9ec
│   │   ├── 20221011_211731_00058_ff5sr_dc8883cc-c8fd-49e7-acd1-8d08867e157d
│   │   ├── 20221011_211731_00058_ff5sr_e02f4092-0266-4104-9978-d5bcb8138da3
│   │   ├── 20221011_211731_00058_ff5sr_e7dfb4a0-e8eb-438b-96c6-16023f5a131b
│   │   ├── 20221011_211731_00058_ff5sr_ebfd0670-22dd-40cb-a63d-61ebb593982a
│   │   ├── 20221011_211731_00058_ff5sr_ecb0667a-7aa5-4fd0-8e85-8c3a5701dd14
│   │   ├── 20221011_211731_00058_ff5sr_f8c1b718-c6dc-4ee0-874d-3d41f6b12732
│   │   └── 20221011_211731_00058_ff5sr_faaa1338-ae7a-4565-ab3c-3dd6b1d63837
│   ├── TenantUsageAndCost/
│   │   ├── requirements.txt
│   │   └── tenant_usage_and_cost.py
│   ├── deployment.sh
│   ├── lambdaoutput.json
│   ├── samconfig.toml
│   └── template.yaml
├── README.md
├── Solution/
│   ├── Lab1/
│   │   ├── client/
│   │   │   └── Application/
│   │   │       ├── .browserslistrc
│   │   │       ├── .editorconfig
│   │   │       ├── .gitignore
│   │   │       ├── README.md
│   │   │       ├── angular.json
│   │   │       ├── karma.conf.js
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── app/
│   │   │       │   │   ├── _nav.ts
│   │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │   ├── app.component.scss
│   │   │       │   │   ├── app.component.ts
│   │   │       │   │   ├── app.module.ts
│   │   │       │   │   ├── models/
│   │   │       │   │   │   ├── index.ts
│   │   │       │   │   │   └── interfaces.ts
│   │   │       │   │   ├── nav/
│   │   │       │   │   │   ├── nav.component.html
│   │   │       │   │   │   ├── nav.component.scss
│   │   │       │   │   │   └── nav.component.ts
│   │   │       │   │   └── views/
│   │   │       │   │       ├── dashboard/
│   │   │       │   │       │   ├── dashboard-routing.module.ts
│   │   │       │   │       │   ├── dashboard.component.html
│   │   │       │   │       │   ├── dashboard.component.scss
│   │   │       │   │       │   ├── dashboard.component.ts
│   │   │       │   │       │   └── dashboard.module.ts
│   │   │       │   │       ├── orders/
│   │   │       │   │       │   ├── create/
│   │   │       │   │       │   │   ├── create.component.html
│   │   │       │   │       │   │   ├── create.component.scss
│   │   │       │   │       │   │   └── create.component.ts
│   │   │       │   │       │   ├── detail/
│   │   │       │   │       │   │   ├── detail.component.html
│   │   │       │   │       │   │   ├── detail.component.scss
│   │   │       │   │       │   │   └── detail.component.ts
│   │   │       │   │       │   ├── list/
│   │   │       │   │       │   │   ├── list.component.html
│   │   │       │   │       │   │   ├── list.component.scss
│   │   │       │   │       │   │   └── list.component.ts
│   │   │       │   │       │   ├── models/
│   │   │       │   │       │   │   ├── order.interface.ts
│   │   │       │   │       │   │   └── orderproduct.interface.ts
│   │   │       │   │       │   ├── orders-routing.module.ts
│   │   │       │   │       │   ├── orders.module.ts
│   │   │       │   │       │   └── orders.service.ts
│   │   │       │   │       └── products/
│   │   │       │   │           ├── create/
│   │   │       │   │           │   ├── create.component.html
│   │   │       │   │           │   ├── create.component.scss
│   │   │       │   │           │   └── create.component.ts
│   │   │       │   │           ├── edit/
│   │   │       │   │           │   ├── edit.component.html
│   │   │       │   │           │   ├── edit.component.scss
│   │   │       │   │           │   └── edit.component.ts
│   │   │       │   │           ├── list/
│   │   │       │   │           │   ├── list.component.html
│   │   │       │   │           │   ├── list.component.scss
│   │   │       │   │           │   └── list.component.ts
│   │   │       │   │           ├── models/
│   │   │       │   │           │   └── product.interface.ts
│   │   │       │   │           ├── product.service.ts
│   │   │       │   │           ├── products-routing.module.ts
│   │   │       │   │           └── products.module.ts
│   │   │       │   ├── assets/
│   │   │       │   │   └── .gitkeep
│   │   │       │   ├── custom-theme.scss
│   │   │       │   ├── environments/
│   │   │       │   │   ├── environment.prod.ts
│   │   │       │   │   └── environment.ts
│   │   │       │   ├── index.html
│   │   │       │   ├── main.ts
│   │   │       │   ├── polyfills.ts
│   │   │       │   ├── styles/
│   │   │       │   │   ├── _variables.scss
│   │   │       │   │   └── reset.scss
│   │   │       │   ├── styles.scss
│   │   │       │   └── test.ts
│   │   │       ├── tsconfig.app.json
│   │   │       ├── tsconfig.json
│   │   │       └── tsconfig.spec.json
│   │   ├── scripts/
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── layers/
│   │       │   ├── logger.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── samconfig.toml
│   │       └── template.yaml
│   ├── Lab2/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── Landing/
│   │   │       ├── .browserslistrc
│   │   │       ├── .editorconfig
│   │   │       ├── .gitignore
│   │   │       ├── README.md
│   │   │       ├── angular.json
│   │   │       ├── karma.conf.js
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── app/
│   │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │   ├── app.component.scss
│   │   │       │   │   ├── app.component.ts
│   │   │       │   │   ├── app.module.ts
│   │   │       │   │   └── views/
│   │   │       │   │       ├── landing/
│   │   │       │   │       │   ├── landing.component.html
│   │   │       │   │       │   ├── landing.component.scss
│   │   │       │   │       │   └── landing.component.ts
│   │   │       │   │       └── register/
│   │   │       │   │           ├── register.component.html
│   │   │       │   │           ├── register.component.scss
│   │   │       │   │           └── register.component.ts
│   │   │       │   ├── assets/
│   │   │       │   │   └── .gitkeep
│   │   │       │   ├── custom-theme.scss
│   │   │       │   ├── environments/
│   │   │       │   │   ├── environment.prod.ts
│   │   │       │   │   └── environment.ts
│   │   │       │   ├── index.html
│   │   │       │   ├── main.ts
│   │   │       │   ├── polyfills.ts
│   │   │       │   ├── styles/
│   │   │       │   │   ├── _variables.scss
│   │   │       │   │   └── reset.scss
│   │   │       │   ├── styles.scss
│   │   │       │   └── test.ts
│   │   │       ├── tsconfig.app.json
│   │   │       ├── tsconfig.json
│   │   │       └── tsconfig.spec.json
│   │   ├── scripts/
│   │   │   ├── deploy-updates.sh
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   └── shared_service_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── layers/
│   │       │   ├── logger.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── samconfig.toml
│   │       └── template.yaml
│   ├── Lab3/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Application/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── cypress/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── e2e/
│   │   │   │   │       └── 1-getting-started/
│   │   │   │   │           ├── basic-access.cy.js
│   │   │   │   │           └── product-testing.cy.js
│   │   │   │   ├── cypress.config.ts
│   │   │   │   ├── cypress.env.json.example
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │   │       │   └── models/
│   │   │   │   │   │       │       └── config-params.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── error/
│   │   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │   │       ├── orders/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── detail/
│   │   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │   │       ├── products/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── edit/
│   │   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │   │       │   └── products.module.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Landing/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── landing/
│   │   │   │   │   │       │   ├── landing.component.html
│   │   │   │   │   │       │   ├── landing.component.scss
│   │   │   │   │   │       │   └── landing.component.ts
│   │   │   │   │   │       └── register/
│   │   │   │   │   │           ├── register.component.html
│   │   │   │   │   │           ├── register.component.scss
│   │   │   │   │   │           └── register.component.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── dummy.txt
│   │   ├── scripts/
│   │   │   ├── deploy-updates.sh
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   ├── shared_service_authorizer.py
│   │       │   └── tenant_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── layers/
│   │       │   ├── auth_manager.py
│   │       │   ├── logger.py
│   │       │   ├── metrics_manager.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── shared-samconfig.toml
│   │       ├── shared-template.yaml
│   │       ├── tenant-samconfig.toml
│   │       └── tenant-template.yaml
│   ├── Lab4/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Application/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── cypress/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── e2e/
│   │   │   │   │       └── 1-getting-started/
│   │   │   │   │           ├── basic-access.cy.js
│   │   │   │   │           └── product-testing.cy.js
│   │   │   │   ├── cypress.config.ts
│   │   │   │   ├── cypress.env.json.example
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │   │       │   └── models/
│   │   │   │   │   │       │       └── config-params.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── error/
│   │   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │   │       ├── orders/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── detail/
│   │   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │   │       ├── products/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── edit/
│   │   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │   │       │   └── products.module.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Landing/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── landing/
│   │   │   │   │   │       │   ├── landing.component.html
│   │   │   │   │   │       │   ├── landing.component.scss
│   │   │   │   │   │       │   └── landing.component.ts
│   │   │   │   │   │       └── register/
│   │   │   │   │   │           ├── register.component.html
│   │   │   │   │   │           ├── register.component.scss
│   │   │   │   │   │           └── register.component.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── dummy.txt
│   │   ├── scripts/
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   ├── shared_service_authorizer.py
│   │       │   └── tenant_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── layers/
│   │       │   ├── auth_manager.py
│   │       │   ├── logger.py
│   │       │   ├── metrics_manager.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── shared-samconfig.toml
│   │       ├── shared-template.yaml
│   │       ├── tenant-samconfig.toml
│   │       └── tenant-template.yaml
│   ├── Lab5/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Application/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── cypress/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── e2e/
│   │   │   │   │       └── 1-getting-started/
│   │   │   │   │           ├── basic-access.cy.js
│   │   │   │   │           └── product-testing.cy.js
│   │   │   │   ├── cypress.config.ts
│   │   │   │   ├── cypress.env.json.example
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │   │       │   └── models/
│   │   │   │   │   │       │       └── config-params.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── error/
│   │   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │   │       ├── orders/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── detail/
│   │   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │   │       ├── products/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── edit/
│   │   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │   │       │   └── products.module.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── Landing/
│   │   │       ├── .browserslistrc
│   │   │       ├── .editorconfig
│   │   │       ├── .gitignore
│   │   │       ├── README.md
│   │   │       ├── angular.json
│   │   │       ├── karma.conf.js
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── app/
│   │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │   ├── app.component.scss
│   │   │       │   │   ├── app.component.ts
│   │   │       │   │   ├── app.module.ts
│   │   │       │   │   └── views/
│   │   │       │   │       ├── landing/
│   │   │       │   │       │   ├── landing.component.html
│   │   │       │   │       │   ├── landing.component.scss
│   │   │       │   │       │   └── landing.component.ts
│   │   │       │   │       └── register/
│   │   │       │   │           ├── register.component.html
│   │   │       │   │           ├── register.component.scss
│   │   │       │   │           └── register.component.ts
│   │   │       │   ├── assets/
│   │   │       │   │   └── .gitkeep
│   │   │       │   ├── custom-theme.scss
│   │   │       │   ├── environments/
│   │   │       │   │   ├── environment.prod.ts
│   │   │       │   │   └── environment.ts
│   │   │       │   ├── index.html
│   │   │       │   ├── main.ts
│   │   │       │   ├── polyfills.ts
│   │   │       │   ├── styles/
│   │   │       │   │   ├── _variables.scss
│   │   │       │   │   └── reset.scss
│   │   │       │   ├── styles.scss
│   │   │       │   └── test.ts
│   │   │       ├── tsconfig.app.json
│   │   │       ├── tsconfig.json
│   │   │       └── tsconfig.spec.json
│   │   ├── scripts/
│   │   │   ├── deploy-updates.sh
│   │   │   ├── deployment.sh
│   │   │   └── geturl.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   ├── shared_service_authorizer.py
│   │       │   └── tenant_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── events/
│   │       │   │   ├── env.json
│   │       │   │   ├── tenant-registration.json
│   │       │   │   ├── update_users_apikey_by_tenant.json
│   │       │   │   └── user-management.json
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-provisioning.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── TenantPipeline/
│   │       │   ├── .gitignore
│   │       │   ├── .npmignore
│   │       │   ├── README.md
│   │       │   ├── bin/
│   │       │   │   └── pipeline.ts
│   │       │   ├── cdk.json
│   │       │   ├── jest.config.js
│   │       │   ├── lib/
│   │       │   │   └── serverless-saas-stack.ts
│   │       │   ├── package.json
│   │       │   ├── resources/
│   │       │   │   └── lambda-deploy-tenant-stack.py
│   │       │   ├── test/
│   │       │   │   └── pipeline.test.ts
│   │       │   └── tsconfig.json
│   │       ├── custom_resources/
│   │       │   ├── requirements.txt
│   │       │   ├── update_settings_table.py
│   │       │   ├── update_tenant_apigatewayurl.py
│   │       │   └── update_tenantstackmap_table.py
│   │       ├── layers/
│   │       │   ├── auth_manager.py
│   │       │   ├── logger.py
│   │       │   ├── metrics_manager.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── custom_resources.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── shared-samconfig.toml
│   │       ├── shared-template.yaml
│   │       ├── tenant-buildspec.yml
│   │       ├── tenant-samconfig.toml
│   │       └── tenant-template.yaml
│   ├── Lab6/
│   │   ├── client/
│   │   │   ├── Admin/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.css
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.spec.ts
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   └── auth.component.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── tenants/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── tenant.ts
│   │   │   │   │   │       │   ├── tenants-routing.module.ts
│   │   │   │   │   │       │   ├── tenants.module.ts
│   │   │   │   │   │       │   └── tenants.service.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── aws-exports.ts
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   ├── Application/
│   │   │   │   ├── .browserslistrc
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── angular.json
│   │   │   │   ├── cypress/
│   │   │   │   │   ├── README.md
│   │   │   │   │   └── e2e/
│   │   │   │   │       └── 1-getting-started/
│   │   │   │   │           ├── basic-access.cy.js
│   │   │   │   │           └── product-testing.cy.js
│   │   │   │   ├── cypress.config.ts
│   │   │   │   ├── cypress.env.json.example
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── src/
│   │   │   │   │   ├── app/
│   │   │   │   │   │   ├── _nav.ts
│   │   │   │   │   │   ├── app-routing.module.ts
│   │   │   │   │   │   ├── app.component.scss
│   │   │   │   │   │   ├── app.component.ts
│   │   │   │   │   │   ├── app.module.ts
│   │   │   │   │   │   ├── cognito.guard.ts
│   │   │   │   │   │   ├── interceptors/
│   │   │   │   │   │   │   ├── auth.interceptor.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── models/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── interfaces.ts
│   │   │   │   │   │   ├── nav/
│   │   │   │   │   │   │   ├── nav.component.html
│   │   │   │   │   │   │   ├── nav.component.scss
│   │   │   │   │   │   │   └── nav.component.ts
│   │   │   │   │   │   └── views/
│   │   │   │   │   │       ├── auth/
│   │   │   │   │   │       │   ├── auth-configuration.service.ts
│   │   │   │   │   │       │   ├── auth.component.html
│   │   │   │   │   │       │   ├── auth.component.scss
│   │   │   │   │   │       │   ├── auth.component.ts
│   │   │   │   │   │       │   └── models/
│   │   │   │   │   │       │       └── config-params.ts
│   │   │   │   │   │       ├── dashboard/
│   │   │   │   │   │       │   ├── dashboard-routing.module.ts
│   │   │   │   │   │       │   ├── dashboard.component.html
│   │   │   │   │   │       │   ├── dashboard.component.scss
│   │   │   │   │   │       │   ├── dashboard.component.ts
│   │   │   │   │   │       │   └── dashboard.module.ts
│   │   │   │   │   │       ├── error/
│   │   │   │   │   │       │   ├── 404.component.html
│   │   │   │   │   │       │   ├── 404.component.ts
│   │   │   │   │   │       │   ├── 500.component.html
│   │   │   │   │   │       │   ├── 500.component.ts
│   │   │   │   │   │       │   ├── unauthorized.component.html
│   │   │   │   │   │       │   ├── unauthorized.component.scss
│   │   │   │   │   │       │   └── unauthorized.component.ts
│   │   │   │   │   │       ├── orders/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── detail/
│   │   │   │   │   │       │   │   ├── detail.component.html
│   │   │   │   │   │       │   │   ├── detail.component.scss
│   │   │   │   │   │       │   │   └── detail.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   ├── order.interface.ts
│   │   │   │   │   │       │   │   └── orderproduct.interface.ts
│   │   │   │   │   │       │   ├── orders-routing.module.ts
│   │   │   │   │   │       │   ├── orders.module.ts
│   │   │   │   │   │       │   └── orders.service.ts
│   │   │   │   │   │       ├── products/
│   │   │   │   │   │       │   ├── create/
│   │   │   │   │   │       │   │   ├── create.component.html
│   │   │   │   │   │       │   │   ├── create.component.scss
│   │   │   │   │   │       │   │   └── create.component.ts
│   │   │   │   │   │       │   ├── edit/
│   │   │   │   │   │       │   │   ├── edit.component.html
│   │   │   │   │   │       │   │   ├── edit.component.scss
│   │   │   │   │   │       │   │   └── edit.component.ts
│   │   │   │   │   │       │   ├── list/
│   │   │   │   │   │       │   │   ├── list.component.html
│   │   │   │   │   │       │   │   ├── list.component.scss
│   │   │   │   │   │       │   │   └── list.component.ts
│   │   │   │   │   │       │   ├── models/
│   │   │   │   │   │       │   │   └── product.interface.ts
│   │   │   │   │   │       │   ├── product.service.ts
│   │   │   │   │   │       │   ├── products-routing.module.ts
│   │   │   │   │   │       │   └── products.module.ts
│   │   │   │   │   │       └── users/
│   │   │   │   │   │           ├── create/
│   │   │   │   │   │           │   ├── create.component.html
│   │   │   │   │   │           │   ├── create.component.scss
│   │   │   │   │   │           │   └── create.component.ts
│   │   │   │   │   │           ├── list/
│   │   │   │   │   │           │   ├── list.component.html
│   │   │   │   │   │           │   ├── list.component.scss
│   │   │   │   │   │           │   └── list.component.ts
│   │   │   │   │   │           ├── models/
│   │   │   │   │   │           │   └── user.ts
│   │   │   │   │   │           ├── users-routing.module.ts
│   │   │   │   │   │           ├── users.module.ts
│   │   │   │   │   │           └── users.service.ts
│   │   │   │   │   ├── assets/
│   │   │   │   │   │   └── .gitkeep
│   │   │   │   │   ├── custom-theme.scss
│   │   │   │   │   ├── environments/
│   │   │   │   │   │   ├── environment.prod.ts
│   │   │   │   │   │   └── environment.ts
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── main.ts
│   │   │   │   │   ├── polyfills.ts
│   │   │   │   │   ├── styles/
│   │   │   │   │   │   ├── _variables.scss
│   │   │   │   │   │   └── reset.scss
│   │   │   │   │   ├── styles.scss
│   │   │   │   │   └── test.ts
│   │   │   │   ├── tsconfig.app.json
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── tsconfig.spec.json
│   │   │   └── Landing/
│   │   │       ├── .browserslistrc
│   │   │       ├── .editorconfig
│   │   │       ├── .gitignore
│   │   │       ├── README.md
│   │   │       ├── angular.json
│   │   │       ├── karma.conf.js
│   │   │       ├── package.json
│   │   │       ├── src/
│   │   │       │   ├── app/
│   │   │       │   │   ├── app-routing.module.ts
│   │   │       │   │   ├── app.component.scss
│   │   │       │   │   ├── app.component.ts
│   │   │       │   │   ├── app.module.ts
│   │   │       │   │   └── views/
│   │   │       │   │       ├── landing/
│   │   │       │   │       │   ├── landing.component.html
│   │   │       │   │       │   ├── landing.component.scss
│   │   │       │   │       │   └── landing.component.ts
│   │   │       │   │       └── register/
│   │   │       │   │           ├── register.component.html
│   │   │       │   │           ├── register.component.scss
│   │   │       │   │           └── register.component.ts
│   │   │       │   ├── assets/
│   │   │       │   │   └── .gitkeep
│   │   │       │   ├── custom-theme.scss
│   │   │       │   ├── environments/
│   │   │       │   │   ├── environment.prod.ts
│   │   │       │   │   └── environment.ts
│   │   │       │   ├── index.html
│   │   │       │   ├── main.ts
│   │   │       │   ├── polyfills.ts
│   │   │       │   ├── styles/
│   │   │       │   │   ├── _variables.scss
│   │   │       │   │   └── reset.scss
│   │   │       │   ├── styles.scss
│   │   │       │   └── test.ts
│   │   │       ├── tsconfig.app.json
│   │   │       ├── tsconfig.json
│   │   │       └── tsconfig.spec.json
│   │   ├── scripts/
│   │   │   ├── deployment.sh
│   │   │   ├── geturl.sh
│   │   │   └── test-basic-tier-throttling.sh
│   │   └── server/
│   │       ├── .gitignore
│   │       ├── OrderService/
│   │       │   ├── order_models.py
│   │       │   ├── order_service.py
│   │       │   ├── order_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── ProductService/
│   │       │   ├── product_models.py
│   │       │   ├── product_service.py
│   │       │   ├── product_service_dal.py
│   │       │   └── requirements.txt
│   │       ├── README.md
│   │       ├── Resources/
│   │       │   ├── requirements.txt
│   │       │   ├── shared_service_authorizer.py
│   │       │   └── tenant_authorizer.py
│   │       ├── TenantManagementService/
│   │       │   ├── events/
│   │       │   │   ├── env.json
│   │       │   │   ├── tenant-registration.json
│   │       │   │   ├── update_users_apikey_by_tenant.json
│   │       │   │   └── user-management.json
│   │       │   ├── requirements.txt
│   │       │   ├── tenant-management.py
│   │       │   ├── tenant-provisioning.py
│   │       │   ├── tenant-registration.py
│   │       │   └── user-management.py
│   │       ├── TenantPipeline/
│   │       │   ├── .gitignore
│   │       │   ├── .npmignore
│   │       │   ├── README.md
│   │       │   ├── bin/
│   │       │   │   └── pipeline.ts
│   │       │   ├── cdk.json
│   │       │   ├── jest.config.js
│   │       │   ├── lib/
│   │       │   │   └── serverless-saas-stack.ts
│   │       │   ├── package.json
│   │       │   ├── resources/
│   │       │   │   └── lambda-deploy-tenant-stack.py
│   │       │   ├── test/
│   │       │   │   └── pipeline.test.ts
│   │       │   └── tsconfig.json
│   │       ├── custom_resources/
│   │       │   ├── requirements.txt
│   │       │   ├── update_settings_table.py
│   │       │   ├── update_tenant_apigatewayurl.py
│   │       │   ├── update_tenantstackmap_table.py
│   │       │   └── update_usage_plan.py
│   │       ├── layers/
│   │       │   ├── auth_manager.py
│   │       │   ├── logger.py
│   │       │   ├── metrics_manager.py
│   │       │   ├── requirements.txt
│   │       │   └── utils.py
│   │       ├── nested_templates/
│   │       │   ├── apigateway.yaml
│   │       │   ├── apigateway_lambdapermissions.yaml
│   │       │   ├── cognito.yaml
│   │       │   ├── custom_resources.yaml
│   │       │   ├── lambdafunctions.yaml
│   │       │   ├── tables.yaml
│   │       │   └── userinterface.yaml
│   │       ├── shared-samconfig.toml
│   │       ├── shared-template.yaml
│   │       ├── tenant-buildspec.yml
│   │       ├── tenant-samconfig.toml
│   │       └── tenant-template.yaml
│   └── Lab7/
│       ├── .aws-sam/
│       │   ├── build/
│       │   │   ├── GetDynamoDBUsageAndCostByTenant/
│       │   │   │   ├── requirements.txt
│       │   │   │   └── tenant_usage_and_cost.py
│       │   │   ├── GetLambdaUsageAndCostByTenant/
│       │   │   │   ├── requirements.txt
│       │   │   │   └── tenant_usage_and_cost.py
│       │   │   └── template.yaml
│       │   └── build.toml
│       ├── SampleCUR/
│       │   ├── 20221011_211731_00058_ff5sr_094c8542-2cfd-459d-96e1-10e3bc2ac7a6
│       │   ├── 20221011_211731_00058_ff5sr_1ded6019-91c5-470a-9533-5a63ff447fa4
│       │   ├── 20221011_211731_00058_ff5sr_265b33b8-c229-4a42-9c51-e54380ec03b0
│       │   ├── 20221011_211731_00058_ff5sr_36154ed1-7420-43dc-9bce-e30ff784b7fc
│       │   ├── 20221011_211731_00058_ff5sr_4644e2bd-8b84-42df-bce7-35b29a0d3b83
│       │   ├── 20221011_211731_00058_ff5sr_47129e77-847c-420a-acac-3ce962bad5af
│       │   ├── 20221011_211731_00058_ff5sr_4f484d50-53e1-40f6-84d3-1495af1981e7
│       │   ├── 20221011_211731_00058_ff5sr_501fe43e-84a3-4665-8ae6-e81ac0a8c024
│       │   ├── 20221011_211731_00058_ff5sr_586d15f5-4ff9-4231-9693-d601f8a96386
│       │   ├── 20221011_211731_00058_ff5sr_5cf01031-5bec-496a-9003-354edff50dcc
│       │   ├── 20221011_211731_00058_ff5sr_74023afa-6ec8-4281-a5ce-b4771aac2ae0
│       │   ├── 20221011_211731_00058_ff5sr_7fb5dd51-6c56-41be-94fc-0cb6fc122cfd
│       │   ├── 20221011_211731_00058_ff5sr_93372514-9952-4af6-a6f3-396921248c28
│       │   ├── 20221011_211731_00058_ff5sr_952352a7-a59a-4f6c-b359-aa2251d1f6a8
│       │   ├── 20221011_211731_00058_ff5sr_9ab989ba-acce-479c-bc60-c33acffa4c79
│       │   ├── 20221011_211731_00058_ff5sr_9b9fe19e-b145-49d1-9aed-135fec199529
│       │   ├── 20221011_211731_00058_ff5sr_a35b0a43-ebb6-44e1-949b-14d3e0472842
│       │   ├── 20221011_211731_00058_ff5sr_a6fa2ec0-8151-41a2-b6ef-f0f630ff956f
│       │   ├── 20221011_211731_00058_ff5sr_aa65c209-65b9-4c95-873a-7c863ea5e0a7
│       │   ├── 20221011_211731_00058_ff5sr_b0cfe354-83a9-403b-9371-477dc4f4e8ef
│       │   ├── 20221011_211731_00058_ff5sr_b6f519bf-0afa-480a-b5ab-5d75bec1490d
│       │   ├── 20221011_211731_00058_ff5sr_c0ad9ac0-db23-4466-9eb2-d59b532bf15a
│       │   ├── 20221011_211731_00058_ff5sr_c3499311-c8db-4272-875a-280a7473d9ec
│       │   ├── 20221011_211731_00058_ff5sr_dc8883cc-c8fd-49e7-acd1-8d08867e157d
│       │   ├── 20221011_211731_00058_ff5sr_e02f4092-0266-4104-9978-d5bcb8138da3
│       │   ├── 20221011_211731_00058_ff5sr_e7dfb4a0-e8eb-438b-96c6-16023f5a131b
│       │   ├── 20221011_211731_00058_ff5sr_ebfd0670-22dd-40cb-a63d-61ebb593982a
│       │   ├── 20221011_211731_00058_ff5sr_ecb0667a-7aa5-4fd0-8e85-8c3a5701dd14
│       │   ├── 20221011_211731_00058_ff5sr_f8c1b718-c6dc-4ee0-874d-3d41f6b12732
│       │   └── 20221011_211731_00058_ff5sr_faaa1338-ae7a-4565-ab3c-3dd6b1d63837
│       ├── TenantUsageAndCost/
│       │   ├── requirements.txt
│       │   └── tenant_usage_and_cost.py
│       ├── deployment.sh
│       ├── lambdaoutput.json
│       ├── samconfig.toml
│       └── template.yaml
├── THIRD-PARTY-LICENSES.txt
├── event-engine-assets/
│   ├── initialize-module-sam-template.yaml
│   ├── lab1-module-sam-template.yaml
│   ├── pre-requisites-event-engine.sh
│   └── userinterface-module-sam-template.yaml
└── scripts/
    ├── cleanup.sh
    ├── create_tenants.sh
    ├── lab2_updates.py
    ├── lab3_updates.py
    ├── lab4_updates.py
    ├── lab5_updates.py
    ├── lab6_updates.py
    ├── replace_function.py
    ├── run_all_labs.sh
    └── run_workshop.sh
Download .txt
Showing preview only (274K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3173 symbols across 813 files)

FILE: Lab1/client/Application/src/app/app-routing.module.ts
  class AppRoutingModule (line 44) | class AppRoutingModule {}

FILE: Lab1/client/Application/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab1/client/Application/src/app/app.module.ts
  class AppModule (line 74) | class AppModule {}

FILE: Lab1/client/Application/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab1/client/Application/src/app/nav/nav.component.ts
  class NavComponent (line 20) | class NavComponent implements OnInit {
    method constructor (line 30) | constructor(
    method ngOnInit (line 47) | ngOnInit(): void {}

FILE: Lab1/client/Application/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab1/client/Application/src/app/views/dashboard/dashboard.component.ts
  class DashboardComponent (line 13) | class DashboardComponent {
    method chartClicked (line 48) | public chartClicked({
    method chartHovered (line 56) | public chartHovered({
    method randomize (line 64) | public randomize(): void {
    method constructor (line 99) | constructor(private breakpointObserver: BreakpointObserver) {}

FILE: Lab1/client/Application/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab1/client/Application/src/app/views/orders/create/create.component.ts
  type LineItem (line 9) | interface LineItem {
  class CreateComponent (line 18) | class CreateComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 35) | ngOnInit(): void {
    method name (line 45) | get name() {
    method productQuantity (line 49) | get productQuantity() {
    method add (line 54) | add(op: LineItem) {
    method remove (line 69) | remove(op: LineItem) {
    method submit (line 87) | submit() {

FILE: Lab1/client/Application/src/app/views/orders/detail/detail.component.ts
  class DetailComponent (line 17) | class DetailComponent implements OnInit {
    method constructor (line 22) | constructor(private route: ActivatedRoute, private orderSvc: OrdersSer...
    method ngOnInit (line 24) | ngOnInit(): void {
    method today (line 30) | today() {
    method sum (line 34) | sum(op: OrderProduct) {
    method tax (line 38) | tax(op: OrderProduct) {
    method total (line 42) | total(op: OrderProduct) {
    method subTotal (line 46) | subTotal(order: Order) {
    method calcTax (line 52) | calcTax(order: Order) {
    method final (line 56) | final(order: Order) {

FILE: Lab1/client/Application/src/app/views/orders/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 15) | constructor(private orderSvc: OrdersService, private router: Router) {}
    method ngOnInit (line 17) | ngOnInit(): void {
    method sum (line 24) | sum(order: Order): number {

FILE: Lab1/client/Application/src/app/views/orders/models/order.interface.ts
  type Order (line 7) | interface Order {

FILE: Lab1/client/Application/src/app/views/orders/models/orderproduct.interface.ts
  type OrderProduct (line 5) | interface OrderProduct {

FILE: Lab1/client/Application/src/app/views/orders/orders-routing.module.ts
  class OrdersRoutingModule (line 44) | class OrdersRoutingModule {}

FILE: Lab1/client/Application/src/app/views/orders/orders.module.ts
  class OrdersModule (line 51) | class OrdersModule {}

FILE: Lab1/client/Application/src/app/views/orders/orders.service.ts
  class OrdersService (line 14) | class OrdersService {
    method constructor (line 17) | constructor(private http: HttpClient) {}
    method fetch (line 19) | fetch(): Observable<Order[]> {
    method get (line 23) | get(orderId: string): Observable<Order> {
    method create (line 28) | create(order: Order): Observable<Order> {

FILE: Lab1/client/Application/src/app/views/products/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 15) | constructor(
    method ngOnInit (line 23) | ngOnInit(): void {
    method name (line 32) | get name() {
    method price (line 36) | get price() {
    method submit (line 40) | submit() {
    method cancel (line 50) | cancel() {

FILE: Lab1/client/Application/src/app/views/products/edit/edit.component.ts
  class EditComponent (line 18) | class EditComponent implements OnInit {
    method constructor (line 25) | constructor(
    method ngOnInit (line 34) | ngOnInit(): void {
    method name (line 57) | get name() {
    method price (line 61) | get price() {
    method submit (line 65) | submit() {
    method delete (line 72) | delete() {
    method cancel (line 82) | cancel() {

FILE: Lab1/client/Application/src/app/views/products/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 16) | constructor(private productSvc: ProductService, private router: Router...
    method ngOnInit (line 18) | ngOnInit(): void {
    method onEdit (line 25) | onEdit(product: Product) {
    method onRemove (line 30) | onRemove(product: Product) {
    method onCreate (line 39) | onCreate() {

FILE: Lab1/client/Application/src/app/views/products/models/product.interface.ts
  type Product (line 5) | interface Product {

FILE: Lab1/client/Application/src/app/views/products/product.service.ts
  class ProductService (line 14) | class ProductService {
    method constructor (line 15) | constructor(private http: HttpClient) {}
    method fetch (line 18) | fetch(): Observable<Product[]> {
    method get (line 22) | get(productId: string): Observable<Product> {
    method delete (line 27) | delete(product: Product) {
    method put (line 32) | put(product: Product) {
    method post (line 37) | post(product: Product) {

FILE: Lab1/client/Application/src/app/views/products/products-routing.module.ts
  class ProductsRoutingModule (line 44) | class ProductsRoutingModule {}

FILE: Lab1/client/Application/src/app/views/products/products.module.ts
  class ProductsModule (line 48) | class ProductsModule {}

FILE: Lab1/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, orderId, orderName, orderProducts):
  class OrderProduct (line 11) | class  OrderProduct:
    method __init__ (line 13) | def __init__(self, productId, price, quantity):

FILE: Lab1/server/OrderService/order_service.py
  function get_order (line 12) | def get_order(event, context):
  function create_order (line 22) | def create_order(event, context):
  function update_order (line 29) | def update_order(event, context):
  function delete_order (line 38) | def delete_order(event, context):
  function get_orders (line 46) | def get_orders(event, context):

FILE: Lab1/server/OrderService/order_service_dal.py
  function get_order (line 19) | def get_order(event, orderId):
  function delete_order (line 32) | def delete_order(event, orderId):
  function create_order (line 44) | def create_order(event, payload):
  function update_order (line 61) | def update_order(event, payload, orderId):
  function get_orders (line 80) | def get_orders(event):
  function get_order_products_dict (line 97) | def get_order_products_dict(orderProducts):

FILE: Lab1/server/ProductService/product_models.py
  class Product (line 4) | class Product:
    method __init__ (line 6) | def __init__(self, productId, sku, name, price, category):
  class Category (line 13) | class Category:
    method __init__ (line 14) | def __init__(self, id, name):

FILE: Lab1/server/ProductService/product_service.py
  function get_product (line 11) | def get_product(event, context):
  function create_product (line 19) | def create_product(event, context):
  function update_product (line 27) | def update_product(event, context):
  function delete_product (line 36) | def delete_product(event, context):
  function get_products (line 44) | def get_products(event, context):

FILE: Lab1/server/ProductService/product_service_dal.py
  function get_product (line 19) | def get_product(event, productId):
  function delete_product (line 31) | def delete_product(event, productId):
  function create_product (line 42) | def create_product(event, payload):
  function update_product (line 63) | def update_product(event, payload, productId):
  function get_products (line 84) | def get_products(event):

FILE: Lab1/server/layers/logger.py
  function info (line 9) | def info(log_message):
  function error (line 14) | def error(log_message):

FILE: Lab1/server/layers/utils.py
  class StatusCodes (line 11) | class StatusCodes(Enum):
  function create_success_response (line 16) | def create_success_response(message):
  function generate_response (line 29) | def generate_response(inputObject):
  function encode_to_json_object (line 40) | def  encode_to_json_object(inputObject):

FILE: Lab2/client/Admin/src/app/app-routing.module.ts
  class AppRoutingModule (line 48) | class AppRoutingModule {}

FILE: Lab2/client/Admin/src/app/app.component.ts
  class AppComponent (line 18) | class AppComponent {
    method constructor (line 19) | constructor(

FILE: Lab2/client/Admin/src/app/app.module.ts
  class AppModule (line 58) | class AppModule {}

FILE: Lab2/client/Admin/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Lab2/client/Admin/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab2/client/Admin/src/app/nav/nav.component.ts
  class NavComponent (line 22) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 52) | ngOnInit(): void {

FILE: Lab2/client/Admin/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Lab2/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab2/client/Admin/src/app/views/dashboard/dashboard.component.ts
  type DataSet (line 9) | interface DataSet {
  type ChartData (line 13) | interface ChartData {
  class DashboardComponent (line 24) | class DashboardComponent implements OnInit {
    method constructor (line 25) | constructor(private tenantSvc: TenantsService) {}
    method random (line 132) | public random(min: number, max: number) {
    method ngOnInit (line 136) | ngOnInit(): void {

FILE: Lab2/client/Admin/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab2/client/Admin/src/app/views/tenants/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 29) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 31) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 37) | submit() {

FILE: Lab2/client/Admin/src/app/views/tenants/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 22) | constructor(private tenantSvc: TenantsService) {}
    method ngOnInit (line 24) | ngOnInit(): void {

FILE: Lab2/client/Admin/src/app/views/tenants/models/tenant.ts
  type Tenant (line 1) | interface Tenant {

FILE: Lab2/client/Admin/src/app/views/tenants/tenants-routing.module.ts
  class TenantsRoutingModule (line 37) | class TenantsRoutingModule {}

FILE: Lab2/client/Admin/src/app/views/tenants/tenants.module.ts
  class TenantsModule (line 51) | class TenantsModule {}

FILE: Lab2/client/Admin/src/app/views/tenants/tenants.service.ts
  class TenantsService (line 15) | class TenantsService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 22) | fetch(): Observable<Tenant[]> {
    method post (line 26) | post(tenant: Tenant): Observable<Tenant[]> {

FILE: Lab2/client/Admin/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 33) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 35) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 41) | onSubmit() {

FILE: Lab2/client/Admin/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Lab2/client/Admin/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Lab2/client/Admin/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Lab2/client/Admin/src/app/views/users/users.module.ts
  class UsersModule (line 49) | class UsersModule {}

FILE: Lab2/client/Admin/src/app/views/users/users.service.ts
  class UsersService (line 26) | class UsersService {
    method constructor (line 29) | constructor(private http: HttpClient) {
    method fetch (line 33) | fetch(): Observable<User[]> {
    method create (line 37) | create(user: User): Observable<User> {

FILE: Lab2/client/Landing/src/app/app-routing.module.ts
  class AppRoutingModule (line 31) | class AppRoutingModule {}

FILE: Lab2/client/Landing/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab2/client/Landing/src/app/app.module.ts
  class AppModule (line 53) | class AppModule {}

FILE: Lab2/client/Landing/src/app/views/landing/landing.component.ts
  class LandingComponent (line 25) | class LandingComponent implements OnInit {
    method constructor (line 26) | constructor(private router: Router) {}
    method ngOnInit (line 28) | ngOnInit() {}
    method register (line 30) | register() {

FILE: Lab2/client/Landing/src/app/views/register/register.component.ts
  class RegisterComponent (line 12) | class RegisterComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 28) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 30) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 36) | submit() {

FILE: Lab2/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, orderId, orderName, orderProducts):
  class OrderProduct (line 11) | class  OrderProduct:
    method __init__ (line 13) | def __init__(self, productId, price, quantity):

FILE: Lab2/server/OrderService/order_service.py
  function get_order (line 12) | def get_order(event, context):
  function create_order (line 22) | def create_order(event, context):
  function update_order (line 29) | def update_order(event, context):
  function delete_order (line 38) | def delete_order(event, context):
  function get_orders (line 46) | def get_orders(event, context):

FILE: Lab2/server/OrderService/order_service_dal.py
  function get_order (line 19) | def get_order(event, orderId):
  function delete_order (line 32) | def delete_order(event, orderId):
  function create_order (line 44) | def create_order(event, payload):
  function update_order (line 61) | def update_order(event, payload, orderId):
  function get_orders (line 80) | def get_orders(event):
  function get_order_products_dict (line 97) | def get_order_products_dict(orderProducts):

FILE: Lab2/server/ProductService/product_models.py
  class Product (line 4) | class Product:
    method __init__ (line 6) | def __init__(self, productId, sku, name, price, category):
  class Category (line 13) | class Category:
    method __init__ (line 14) | def __init__(self, id, name):

FILE: Lab2/server/ProductService/product_service.py
  function get_product (line 11) | def get_product(event, context):
  function create_product (line 19) | def create_product(event, context):
  function update_product (line 27) | def update_product(event, context):
  function delete_product (line 36) | def delete_product(event, context):
  function get_products (line 44) | def get_products(event, context):

FILE: Lab2/server/ProductService/product_service_dal.py
  function get_product (line 19) | def get_product(event, productId):
  function delete_product (line 31) | def delete_product(event, productId):
  function create_product (line 42) | def create_product(event, payload):
  function update_product (line 63) | def update_product(event, payload, productId):
  function get_products (line 84) | def get_products(event):

FILE: Lab2/server/Resources/shared_service_authorizer.py
  function lambda_handler (line 22) | def lambda_handler(event, context):
  function validateJWT (line 79) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 120) | class HttpVerb:
  class AuthPolicy (line 130) | class AuthPolicy(object):
    method __init__ (line 155) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 161) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 193) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 204) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 225) | def allowAllMethods(self):
    method denyAllMethods (line 229) | def denyAllMethods(self):
    method allowMethod (line 233) | def allowMethod(self, verb, resource):
    method denyMethod (line 238) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 243) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 249) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 255) | def build(self):

FILE: Lab2/server/TenantManagementService/tenant-management.py
  function create_tenant (line 20) | def create_tenant(event, context):
  function get_tenants (line 41) | def get_tenants(event, context):
  function update_tenant (line 50) | def update_tenant(event, context):
  function get_tenant (line 79) | def get_tenant(event, context):
  function deactivate_tenant (line 82) | def deactivate_tenant(event, context):
  function activate_tenant (line 113) | def activate_tenant(event, context):
  function __invoke_disable_users (line 144) | def __invoke_disable_users(headers, auth, host, stage_name, invoke_url, ...
  function __invoke_enable_users (line 159) | def __invoke_enable_users(headers, auth, host, stage_name, invoke_url, t...
  class TenantInfo (line 174) | class TenantInfo:
    method __init__ (line 175) | def __init__(self, tenant_name, tenant_address, tenant_email, tenant_p...

FILE: Lab2/server/TenantManagementService/tenant-registration.py
  function register_tenant (line 20) | def register_tenant(event, context):
  function __create_tenant_admin_user (line 23) | def __create_tenant_admin_user(tenant_details, headers, auth, host, stag...
  function __create_tenant (line 35) | def __create_tenant(tenant_details, headers, auth, host, stage_name):

FILE: Lab2/server/TenantManagementService/user-management.py
  function create_tenant_admin_user (line 19) | def create_tenant_admin_user(event, context):
  function create_user (line 44) | def create_user(event, context):
  function get_users (line 47) | def get_users(event, context):
  function get_user (line 80) | def get_user(event, context):
  function update_user (line 89) | def update_user(event, context):
  function disable_user (line 115) | def disable_user(event, context):
  function disable_users_by_tenant (line 130) | def disable_users_by_tenant(event, context):
  function enable_users_by_tenant (line 152) | def enable_users_by_tenant(event, context):
  function get_user_info (line 172) | def get_user_info(user_pool_id, user_name):
  class UserManagement (line 190) | class UserManagement:
    method create_user_group (line 191) | def create_user_group(self, user_pool_id, group_name, group_description):
    method create_tenant_admin (line 200) | def create_tenant_admin(self, user_pool_id, tenant_admin_user_name, us...
    method add_user_to_group (line 226) | def add_user_to_group(self, user_pool_id, user_name, group_name):
    method create_user_tenant_mapping (line 234) | def create_user_tenant_mapping(self, user_name, tenant_id):
  class UserInfo (line 245) | class UserInfo:
    method __init__ (line 246) | def __init__(self, user_name=None, tenant_id=None, user_role=None,

FILE: Lab2/server/layers/logger.py
  function info (line 9) | def info(log_message):
  function error (line 14) | def error(log_message):

FILE: Lab2/server/layers/utils.py
  class StatusCodes (line 12) | class StatusCodes(Enum):
  function create_success_response (line 17) | def create_success_response(message):
  function generate_response (line 30) | def generate_response(inputObject):
  function encode_to_json_object (line 41) | def  encode_to_json_object(inputObject):
  function get_auth (line 47) | def get_auth(host, region):
  function get_headers (line 58) | def get_headers(event):

FILE: Lab3/client/Admin/src/app/app-routing.module.ts
  class AppRoutingModule (line 48) | class AppRoutingModule {}

FILE: Lab3/client/Admin/src/app/app.component.ts
  class AppComponent (line 18) | class AppComponent {
    method constructor (line 19) | constructor(

FILE: Lab3/client/Admin/src/app/app.module.ts
  class AppModule (line 58) | class AppModule {}

FILE: Lab3/client/Admin/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Lab3/client/Admin/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab3/client/Admin/src/app/nav/nav.component.ts
  class NavComponent (line 22) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 52) | ngOnInit(): void {

FILE: Lab3/client/Admin/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Lab3/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab3/client/Admin/src/app/views/dashboard/dashboard.component.ts
  type DataSet (line 9) | interface DataSet {
  type ChartData (line 13) | interface ChartData {
  class DashboardComponent (line 24) | class DashboardComponent implements OnInit {
    method constructor (line 25) | constructor(private tenantSvc: TenantsService) {}
    method random (line 132) | public random(min: number, max: number) {
    method ngOnInit (line 136) | ngOnInit(): void {

FILE: Lab3/client/Admin/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab3/client/Admin/src/app/views/tenants/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 29) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 31) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 37) | submit() {

FILE: Lab3/client/Admin/src/app/views/tenants/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 22) | constructor(private tenantSvc: TenantsService) {}
    method ngOnInit (line 24) | ngOnInit(): void {

FILE: Lab3/client/Admin/src/app/views/tenants/models/tenant.ts
  type Tenant (line 1) | interface Tenant {

FILE: Lab3/client/Admin/src/app/views/tenants/tenants-routing.module.ts
  class TenantsRoutingModule (line 37) | class TenantsRoutingModule {}

FILE: Lab3/client/Admin/src/app/views/tenants/tenants.module.ts
  class TenantsModule (line 51) | class TenantsModule {}

FILE: Lab3/client/Admin/src/app/views/tenants/tenants.service.ts
  class TenantsService (line 15) | class TenantsService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 22) | fetch(): Observable<Tenant[]> {
    method post (line 26) | post(tenant: Tenant): Observable<Tenant[]> {

FILE: Lab3/client/Admin/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 33) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 35) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 41) | onSubmit() {

FILE: Lab3/client/Admin/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Lab3/client/Admin/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Lab3/client/Admin/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Lab3/client/Admin/src/app/views/users/users.module.ts
  class UsersModule (line 49) | class UsersModule {}

FILE: Lab3/client/Admin/src/app/views/users/users.service.ts
  class UsersService (line 26) | class UsersService {
    method constructor (line 29) | constructor(private http: HttpClient) {
    method fetch (line 33) | fetch(): Observable<User[]> {
    method create (line 37) | create(user: User): Observable<User> {

FILE: Lab3/client/Application/cypress.config.ts
  method setupNodeEvents (line 6) | setupNodeEvents(on, config) {

FILE: Lab3/client/Application/src/app/app-routing.module.ts
  class AppRoutingModule (line 62) | class AppRoutingModule {}

FILE: Lab3/client/Application/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab3/client/Application/src/app/app.module.ts
  class AppModule (line 86) | class AppModule {}

FILE: Lab3/client/Application/src/app/cognito.guard.ts
  class CognitoGuard (line 16) | class CognitoGuard implements CanActivate {
    method constructor (line 17) | constructor(
    method canActivate (line 22) | canActivate(

FILE: Lab3/client/Application/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Lab3/client/Application/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab3/client/Application/src/app/nav/nav.component.ts
  class NavComponent (line 23) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 54) | ngOnInit(): void {
    method logout (line 85) | async logout() {

FILE: Lab3/client/Application/src/app/views/auth/auth-configuration.service.ts
  class AuthConfigurationService (line 36) | class AuthConfigurationService {
    method constructor (line 41) | constructor(
    method setTenantConfig (line 47) | public setTenantConfig(tenantName: string): Promise<any> {
    method configureAmplifyAuth (line 69) | configureAmplifyAuth(): boolean {
    method cleanLocalStorage (line 93) | cleanLocalStorage() {

FILE: Lab3/client/Application/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Lab3/client/Application/src/app/views/auth/models/config-params.ts
  type ConfigParams (line 17) | interface ConfigParams {

FILE: Lab3/client/Application/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab3/client/Application/src/app/views/dashboard/dashboard.component.ts
  class DashboardComponent (line 13) | class DashboardComponent {
    method chartClicked (line 48) | public chartClicked({
    method chartHovered (line 56) | public chartHovered({
    method randomize (line 64) | public randomize(): void {
    method constructor (line 99) | constructor(private breakpointObserver: BreakpointObserver) {}

FILE: Lab3/client/Application/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab3/client/Application/src/app/views/error/404.component.ts
  class P404Component (line 10) | class P404Component {
    method constructor (line 11) | constructor() {}

FILE: Lab3/client/Application/src/app/views/error/500.component.ts
  class P500Component (line 10) | class P500Component {
    method constructor (line 11) | constructor() {}

FILE: Lab3/client/Application/src/app/views/error/unauthorized.component.ts
  class UnauthorizedComponent (line 30) | class UnauthorizedComponent implements OnInit {
    method constructor (line 37) | constructor(
    method ngOnInit (line 60) | ngOnInit(): void {
    method isFieldInvalid (line 66) | isFieldInvalid(field: string) {
    method displayFieldCss (line 73) | displayFieldCss(field: string) {
    method hasRequiredError (line 79) | hasRequiredError(field: string) {
    method openErrorMessageSnackBar (line 83) | openErrorMessageSnackBar(errorMessage: string) {
    method login (line 89) | login() {

FILE: Lab3/client/Application/src/app/views/orders/create/create.component.ts
  type LineItem (line 9) | interface LineItem {
  class CreateComponent (line 18) | class CreateComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 35) | ngOnInit(): void {
    method name (line 45) | get name() {
    method productQuantity (line 49) | get productQuantity() {
    method add (line 55) | add(op: LineItem) {
    method remove (line 70) | remove(op: LineItem) {
    method submit (line 88) | submit() {

FILE: Lab3/client/Application/src/app/views/orders/detail/detail.component.ts
  class DetailComponent (line 17) | class DetailComponent implements OnInit {
    method constructor (line 22) | constructor(private route: ActivatedRoute, private orderSvc: OrdersSer...
    method ngOnInit (line 24) | ngOnInit(): void {
    method today (line 30) | today() {
    method tenantName (line 34) | tenantName() {
    method sum (line 38) | sum(op: OrderProduct) {
    method tax (line 42) | tax(op: OrderProduct) {
    method total (line 46) | total(op: OrderProduct) {
    method subTotal (line 50) | subTotal(order: Order) {
    method calcTax (line 56) | calcTax(order: Order) {
    method final (line 60) | final(order: Order) {

FILE: Lab3/client/Application/src/app/views/orders/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 15) | constructor(private orderSvc: OrdersService, private router: Router) {}
    method ngOnInit (line 17) | ngOnInit(): void {
    method sum (line 24) | sum(order: Order): number {

FILE: Lab3/client/Application/src/app/views/orders/models/order.interface.ts
  type Order (line 7) | interface Order {

FILE: Lab3/client/Application/src/app/views/orders/models/orderproduct.interface.ts
  type OrderProduct (line 5) | interface OrderProduct {

FILE: Lab3/client/Application/src/app/views/orders/orders-routing.module.ts
  class OrdersRoutingModule (line 44) | class OrdersRoutingModule {}

FILE: Lab3/client/Application/src/app/views/orders/orders.module.ts
  class OrdersModule (line 51) | class OrdersModule {}

FILE: Lab3/client/Application/src/app/views/orders/orders.service.ts
  class OrdersService (line 13) | class OrdersService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 18) | fetch(): Observable<Order[]> {
    method get (line 22) | get(orderId: string): Observable<Order> {
    method create (line 27) | create(order: Order): Observable<Order> {

FILE: Lab3/client/Application/src/app/views/products/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 15) | constructor(
    method ngOnInit (line 23) | ngOnInit(): void {
    method name (line 32) | get name() {
    method price (line 36) | get price() {
    method submit (line 40) | submit() {
    method cancel (line 50) | cancel() {

FILE: Lab3/client/Application/src/app/views/products/edit/edit.component.ts
  class EditComponent (line 18) | class EditComponent implements OnInit {
    method constructor (line 25) | constructor(
    method ngOnInit (line 34) | ngOnInit(): void {
    method name (line 57) | get name() {
    method price (line 61) | get price() {
    method submit (line 65) | submit() {
    method delete (line 72) | delete() {
    method cancel (line 82) | cancel() {

FILE: Lab3/client/Application/src/app/views/products/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 16) | constructor(private productSvc: ProductService, private router: Router...
    method ngOnInit (line 18) | ngOnInit(): void {
    method onEdit (line 25) | onEdit(product: Product) {
    method onRemove (line 30) | onRemove(product: Product) {
    method onCreate (line 39) | onCreate() {

FILE: Lab3/client/Application/src/app/views/products/models/product.interface.ts
  type Product (line 5) | interface Product {

FILE: Lab3/client/Application/src/app/views/products/product.service.ts
  class ProductService (line 13) | class ProductService {
    method constructor (line 14) | constructor(private http: HttpClient) {}
    method fetch (line 17) | fetch(): Observable<Product[]> {
    method get (line 21) | get(productId: string): Observable<Product> {
    method delete (line 26) | delete(product: Product) {
    method put (line 31) | put(product: Product) {
    method post (line 36) | post(product: Product) {

FILE: Lab3/client/Application/src/app/views/products/products-routing.module.ts
  class ProductsRoutingModule (line 44) | class ProductsRoutingModule {}

FILE: Lab3/client/Application/src/app/views/products/products.module.ts
  class ProductsModule (line 48) | class ProductsModule {}

FILE: Lab3/client/Application/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 32) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 34) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 40) | onSubmit() {

FILE: Lab3/client/Application/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Lab3/client/Application/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Lab3/client/Application/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Lab3/client/Application/src/app/views/users/users.module.ts
  class UsersModule (line 50) | class UsersModule {}

FILE: Lab3/client/Application/src/app/views/users/users.service.ts
  class UsersService (line 27) | class UsersService {
    method constructor (line 30) | constructor(private http: HttpClient) {
    method fetch (line 34) | fetch(): Observable<User[]> {
    method create (line 38) | create(user: User): Observable<User> {
    method update (line 42) | update(email: string, user: User) {}

FILE: Lab3/client/Landing/src/app/app-routing.module.ts
  class AppRoutingModule (line 31) | class AppRoutingModule {}

FILE: Lab3/client/Landing/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab3/client/Landing/src/app/app.module.ts
  class AppModule (line 53) | class AppModule {}

FILE: Lab3/client/Landing/src/app/views/landing/landing.component.ts
  class LandingComponent (line 25) | class LandingComponent implements OnInit {
    method constructor (line 26) | constructor(private router: Router) {}
    method ngOnInit (line 28) | ngOnInit() {}
    method register (line 30) | register() {

FILE: Lab3/client/Landing/src/app/views/register/register.component.ts
  class RegisterComponent (line 12) | class RegisterComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 28) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 30) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 36) | submit() {

FILE: Lab3/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, shardId, orderId, orderName, orderProducts):
  class OrderProduct (line 13) | class  OrderProduct:
    method __init__ (line 15) | def __init__(self, productId, price, quantity):

FILE: Lab3/server/OrderService/order_service.py
  function get_order (line 15) | def get_order(event, context):
  function create_order (line 30) | def create_order(event, context):
  function update_order (line 42) | def update_order(event, context):
  function delete_order (line 56) | def delete_order(event, context):
  function get_orders (line 69) | def get_orders(event, context):

FILE: Lab3/server/OrderService/order_service_dal.py
  function get_order (line 27) | def get_order(event, key):
  function delete_order (line 45) | def delete_order(event, key):
  function create_order (line 61) | def create_order(event, payload):
  function update_order (line 84) | def update_order(event, payload, key):
  function get_orders (line 110) | def get_orders(event, tenantId):
  function __query_all_partitions (line 122) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 138) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...
  function get_order_products_dict (line 149) | def get_order_products_dict(orderProducts):

FILE: Lab3/server/ProductService/product_models.py
  class Product (line 4) | class Product:
    method __init__ (line 6) | def __init__(self, shardId, productId, sku, name, price, category):
  class Category (line 15) | class Category:
    method __init__ (line 16) | def __init__(self, id, name):

FILE: Lab3/server/ProductService/product_service.py
  function get_product (line 15) | def get_product(event, context):
  function create_product (line 31) | def create_product(event, context):
  function update_product (line 45) | def update_product(event, context):
  function delete_product (line 59) | def delete_product(event, context):
  function get_products (line 72) | def get_products(event, context):

FILE: Lab3/server/ProductService/product_service_dal.py
  function get_product (line 27) | def get_product(event, key):
  function delete_product (line 45) | def delete_product(event, key):
  function create_product (line 60) | def create_product(event, payload):
  function update_product (line 63) | def update_product(event, payload, key):
  function get_products (line 92) | def get_products(event, tenantId):
  function __query_all_partitions (line 103) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 119) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...

FILE: Lab3/server/Resources/shared_service_authorizer.py
  function lambda_handler (line 25) | def lambda_handler(event, context):
  function validateJWT (line 93) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 134) | class HttpVerb:
  class AuthPolicy (line 144) | class AuthPolicy(object):
    method __init__ (line 169) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 175) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 207) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 218) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 239) | def allowAllMethods(self):
    method denyAllMethods (line 243) | def denyAllMethods(self):
    method allowMethod (line 247) | def allowMethod(self, verb, resource):
    method denyMethod (line 252) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 257) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 263) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 269) | def build(self):

FILE: Lab3/server/Resources/tenant_authorizer.py
  function lambda_handler (line 21) | def lambda_handler(event, context):
  function validateJWT (line 69) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 110) | class HttpVerb:
  class AuthPolicy (line 120) | class AuthPolicy(object):
    method __init__ (line 145) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 151) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 183) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 194) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 215) | def allowAllMethods(self):
    method denyAllMethods (line 219) | def denyAllMethods(self):
    method allowMethod (line 223) | def allowMethod(self, verb, resource):
    method denyMethod (line 228) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 233) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 239) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 245) | def build(self):

FILE: Lab3/server/TenantManagementService/tenant-management.py
  function create_tenant (line 25) | def create_tenant(event, context):
  function get_tenants (line 46) | def get_tenants(event, context):
  function update_tenant (line 56) | def update_tenant(event, context):
  function get_tenant (line 95) | def get_tenant(event, context):
  function deactivate_tenant (line 127) | def deactivate_tenant(event, context):
  function activate_tenant (line 170) | def activate_tenant(event, context):
  function __invoke_disable_users (line 212) | def __invoke_disable_users(update_details, headers, auth, host, stage_na...
  function __invoke_enable_users (line 227) | def __invoke_enable_users(update_details, headers, auth, host, stage_nam...
  class TenantInfo (line 242) | class TenantInfo:
    method __init__ (line 243) | def __init__(self, tenant_name, tenant_address, tenant_email, tenant_p...

FILE: Lab3/server/TenantManagementService/tenant-registration.py
  function register_tenant (line 19) | def register_tenant(event, context):
  function __create_tenant_admin_user (line 46) | def __create_tenant_admin_user(tenant_details, headers, auth, host, stag...
  function __create_tenant (line 58) | def __create_tenant(tenant_details, headers, auth, host, stage_name):

FILE: Lab3/server/TenantManagementService/user-management.py
  function create_tenant_admin_user (line 23) | def create_tenant_admin_user(event, context):
  function create_user (line 47) | def create_user(event, context):
  function get_users (line 100) | def get_users(event, context):
  function get_user (line 144) | def get_user(event, context):
  function update_user (line 164) | def update_user(event, context):
  function disable_user (line 203) | def disable_user(event, context):
  function disable_users_by_tenant (line 229) | def disable_users_by_tenant(event, context):
  function enable_users_by_tenant (line 258) | def enable_users_by_tenant(event, context):
  function get_user_info (line 285) | def get_user_info(event, user_pool_id, user_name):
  class UserManagement (line 305) | class UserManagement:
    method create_user_group (line 306) | def create_user_group(self, user_pool_id, group_name, group_description):
    method create_tenant_admin (line 315) | def create_tenant_admin(self, user_pool_id, tenant_admin_user_name, us...
    method add_user_to_group (line 341) | def add_user_to_group(self, user_pool_id, user_name, group_name):
    method create_user_tenant_mapping (line 349) | def create_user_tenant_mapping(self, user_name, tenant_id):
  class UserInfo (line 360) | class UserInfo:
    method __init__ (line 361) | def __init__(self, user_name=None, tenant_id=None, user_role=None,

FILE: Lab3/server/layers/auth_manager.py
  class UserRoles (line 8) | class UserRoles:
  function isTenantAdmin (line 14) | def isTenantAdmin(user_role):
  function isSystemAdmin (line 20) | def isSystemAdmin(user_role):
  function isSaaSProvider (line 27) | def isSaaSProvider(user_role):
  function isTenantUser (line 32) | def isTenantUser(user_role):

FILE: Lab3/server/layers/logger.py
  function info (line 9) | def info(log_message):
  function error (line 14) | def error(log_message):
  function log_with_tenant_context (line 17) | def log_with_tenant_context(event, log_message):

FILE: Lab3/server/layers/metrics_manager.py
  function record_metric (line 10) | def record_metric(event, metric_name, metric_unit, metric_value):

FILE: Lab3/server/layers/utils.py
  class StatusCodes (line 12) | class StatusCodes(Enum):
  function create_success_response (line 17) | def create_success_response(message):
  function create_unauthorized_response (line 30) | def create_unauthorized_response():
  function generate_response (line 44) | def generate_response(inputObject):
  function encode_to_json_object (line 55) | def  encode_to_json_object(inputObject):
  function get_auth (line 61) | def get_auth(host, region):
  function get_headers (line 72) | def get_headers(event):

FILE: Lab4/client/Admin/src/app/app-routing.module.ts
  class AppRoutingModule (line 48) | class AppRoutingModule {}

FILE: Lab4/client/Admin/src/app/app.component.ts
  class AppComponent (line 18) | class AppComponent {
    method constructor (line 19) | constructor(

FILE: Lab4/client/Admin/src/app/app.module.ts
  class AppModule (line 58) | class AppModule {}

FILE: Lab4/client/Admin/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Lab4/client/Admin/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab4/client/Admin/src/app/nav/nav.component.ts
  class NavComponent (line 22) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 52) | ngOnInit(): void {

FILE: Lab4/client/Admin/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Lab4/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab4/client/Admin/src/app/views/dashboard/dashboard.component.ts
  type DataSet (line 9) | interface DataSet {
  type ChartData (line 13) | interface ChartData {
  class DashboardComponent (line 24) | class DashboardComponent implements OnInit {
    method constructor (line 25) | constructor(private tenantSvc: TenantsService) {}
    method random (line 132) | public random(min: number, max: number) {
    method ngOnInit (line 136) | ngOnInit(): void {

FILE: Lab4/client/Admin/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab4/client/Admin/src/app/views/tenants/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 29) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 31) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 37) | submit() {

FILE: Lab4/client/Admin/src/app/views/tenants/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 22) | constructor(private tenantSvc: TenantsService) {}
    method ngOnInit (line 24) | ngOnInit(): void {

FILE: Lab4/client/Admin/src/app/views/tenants/models/tenant.ts
  type Tenant (line 1) | interface Tenant {

FILE: Lab4/client/Admin/src/app/views/tenants/tenants-routing.module.ts
  class TenantsRoutingModule (line 37) | class TenantsRoutingModule {}

FILE: Lab4/client/Admin/src/app/views/tenants/tenants.module.ts
  class TenantsModule (line 51) | class TenantsModule {}

FILE: Lab4/client/Admin/src/app/views/tenants/tenants.service.ts
  class TenantsService (line 15) | class TenantsService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 22) | fetch(): Observable<Tenant[]> {
    method post (line 26) | post(tenant: Tenant): Observable<Tenant[]> {

FILE: Lab4/client/Admin/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 33) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 35) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 41) | onSubmit() {

FILE: Lab4/client/Admin/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Lab4/client/Admin/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Lab4/client/Admin/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Lab4/client/Admin/src/app/views/users/users.module.ts
  class UsersModule (line 49) | class UsersModule {}

FILE: Lab4/client/Admin/src/app/views/users/users.service.ts
  class UsersService (line 26) | class UsersService {
    method constructor (line 29) | constructor(private http: HttpClient) {
    method fetch (line 33) | fetch(): Observable<User[]> {
    method create (line 37) | create(user: User): Observable<User> {

FILE: Lab4/client/Application/cypress.config.ts
  method setupNodeEvents (line 6) | setupNodeEvents(on, config) {

FILE: Lab4/client/Application/src/app/app-routing.module.ts
  class AppRoutingModule (line 62) | class AppRoutingModule {}

FILE: Lab4/client/Application/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab4/client/Application/src/app/app.module.ts
  class AppModule (line 87) | class AppModule {}

FILE: Lab4/client/Application/src/app/cognito.guard.ts
  class CognitoGuard (line 16) | class CognitoGuard implements CanActivate {
    method constructor (line 17) | constructor(
    method canActivate (line 22) | canActivate(

FILE: Lab4/client/Application/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Lab4/client/Application/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab4/client/Application/src/app/nav/nav.component.ts
  class NavComponent (line 23) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 54) | ngOnInit(): void {
    method logout (line 85) | async logout() {

FILE: Lab4/client/Application/src/app/views/auth/auth-configuration.service.ts
  class AuthConfigurationService (line 36) | class AuthConfigurationService {
    method constructor (line 41) | constructor(
    method setTenantConfig (line 47) | public setTenantConfig(tenantName: string): Promise<any> {
    method configureAmplifyAuth (line 69) | configureAmplifyAuth(): boolean {
    method cleanLocalStorage (line 93) | cleanLocalStorage() {

FILE: Lab4/client/Application/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Lab4/client/Application/src/app/views/auth/models/config-params.ts
  type ConfigParams (line 17) | interface ConfigParams {

FILE: Lab4/client/Application/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab4/client/Application/src/app/views/dashboard/dashboard.component.ts
  class DashboardComponent (line 13) | class DashboardComponent {
    method chartClicked (line 48) | public chartClicked({
    method chartHovered (line 56) | public chartHovered({
    method randomize (line 64) | public randomize(): void {
    method constructor (line 99) | constructor(private breakpointObserver: BreakpointObserver) {}

FILE: Lab4/client/Application/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab4/client/Application/src/app/views/error/404.component.ts
  class P404Component (line 10) | class P404Component {
    method constructor (line 11) | constructor() {}

FILE: Lab4/client/Application/src/app/views/error/500.component.ts
  class P500Component (line 10) | class P500Component {
    method constructor (line 11) | constructor() {}

FILE: Lab4/client/Application/src/app/views/error/unauthorized.component.ts
  class UnauthorizedComponent (line 30) | class UnauthorizedComponent implements OnInit {
    method constructor (line 37) | constructor(
    method ngOnInit (line 60) | ngOnInit(): void {
    method isFieldInvalid (line 66) | isFieldInvalid(field: string) {
    method displayFieldCss (line 73) | displayFieldCss(field: string) {
    method hasRequiredError (line 79) | hasRequiredError(field: string) {
    method openErrorMessageSnackBar (line 83) | openErrorMessageSnackBar(errorMessage: string) {
    method login (line 89) | login() {

FILE: Lab4/client/Application/src/app/views/orders/create/create.component.ts
  type LineItem (line 9) | interface LineItem {
  class CreateComponent (line 18) | class CreateComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 35) | ngOnInit(): void {
    method name (line 45) | get name() {
    method productQuantity (line 49) | get productQuantity() {
    method add (line 55) | add(op: LineItem) {
    method remove (line 70) | remove(op: LineItem) {
    method submit (line 88) | submit() {

FILE: Lab4/client/Application/src/app/views/orders/detail/detail.component.ts
  class DetailComponent (line 17) | class DetailComponent implements OnInit {
    method constructor (line 22) | constructor(private route: ActivatedRoute, private orderSvc: OrdersSer...
    method ngOnInit (line 24) | ngOnInit(): void {
    method today (line 30) | today() {
    method tenantName (line 34) | tenantName() {
    method sum (line 38) | sum(op: OrderProduct) {
    method tax (line 42) | tax(op: OrderProduct) {
    method total (line 46) | total(op: OrderProduct) {
    method subTotal (line 50) | subTotal(order: Order) {
    method calcTax (line 56) | calcTax(order: Order) {
    method final (line 60) | final(order: Order) {

FILE: Lab4/client/Application/src/app/views/orders/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 15) | constructor(private orderSvc: OrdersService, private router: Router) {}
    method ngOnInit (line 17) | ngOnInit(): void {
    method sum (line 24) | sum(order: Order): number {

FILE: Lab4/client/Application/src/app/views/orders/models/order.interface.ts
  type Order (line 7) | interface Order {

FILE: Lab4/client/Application/src/app/views/orders/models/orderproduct.interface.ts
  type OrderProduct (line 5) | interface OrderProduct {

FILE: Lab4/client/Application/src/app/views/orders/orders-routing.module.ts
  class OrdersRoutingModule (line 44) | class OrdersRoutingModule {}

FILE: Lab4/client/Application/src/app/views/orders/orders.module.ts
  class OrdersModule (line 51) | class OrdersModule {}

FILE: Lab4/client/Application/src/app/views/orders/orders.service.ts
  class OrdersService (line 13) | class OrdersService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 18) | fetch(): Observable<Order[]> {
    method get (line 22) | get(orderId: string): Observable<Order> {
    method create (line 27) | create(order: Order): Observable<Order> {

FILE: Lab4/client/Application/src/app/views/products/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 15) | constructor(
    method ngOnInit (line 23) | ngOnInit(): void {
    method name (line 32) | get name() {
    method price (line 36) | get price() {
    method submit (line 40) | submit() {
    method cancel (line 50) | cancel() {

FILE: Lab4/client/Application/src/app/views/products/edit/edit.component.ts
  class EditComponent (line 17) | class EditComponent implements OnInit {
    method constructor (line 23) | constructor(
    method ngOnInit (line 30) | ngOnInit(): void {
    method name (line 51) | get name() {
    method price (line 55) | get price() {
    method submit (line 59) | submit() {
    method delete (line 66) | delete() {
    method cancel (line 76) | cancel() {

FILE: Lab4/client/Application/src/app/views/products/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 16) | constructor(private productSvc: ProductService, private router: Router...
    method ngOnInit (line 18) | ngOnInit(): void {
    method onEdit (line 25) | onEdit(product: Product) {
    method onRemove (line 30) | onRemove(product: Product) {
    method onCreate (line 39) | onCreate() {

FILE: Lab4/client/Application/src/app/views/products/models/product.interface.ts
  type Product (line 5) | interface Product {

FILE: Lab4/client/Application/src/app/views/products/product.service.ts
  class ProductService (line 13) | class ProductService {
    method constructor (line 14) | constructor(private http: HttpClient) {}
    method fetch (line 17) | fetch(): Observable<Product[]> {
    method get (line 21) | get(productId: string): Observable<Product> {
    method delete (line 26) | delete(product: Product) {
    method put (line 31) | put(product: Product) {
    method post (line 35) | post(product: Product) {

FILE: Lab4/client/Application/src/app/views/products/products-routing.module.ts
  class ProductsRoutingModule (line 44) | class ProductsRoutingModule {}

FILE: Lab4/client/Application/src/app/views/products/products.module.ts
  class ProductsModule (line 48) | class ProductsModule {}

FILE: Lab4/client/Application/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 32) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 34) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 40) | onSubmit() {

FILE: Lab4/client/Application/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Lab4/client/Application/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Lab4/client/Application/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Lab4/client/Application/src/app/views/users/users.module.ts
  class UsersModule (line 50) | class UsersModule {}

FILE: Lab4/client/Application/src/app/views/users/users.service.ts
  class UsersService (line 27) | class UsersService {
    method constructor (line 30) | constructor(private http: HttpClient) {
    method fetch (line 34) | fetch(): Observable<User[]> {
    method create (line 38) | create(user: User): Observable<User> {
    method update (line 42) | update(email: string, user: User) {}

FILE: Lab4/client/Landing/src/app/app-routing.module.ts
  class AppRoutingModule (line 31) | class AppRoutingModule {}

FILE: Lab4/client/Landing/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab4/client/Landing/src/app/app.module.ts
  class AppModule (line 53) | class AppModule {}

FILE: Lab4/client/Landing/src/app/views/landing/landing.component.ts
  class LandingComponent (line 25) | class LandingComponent implements OnInit {
    method constructor (line 26) | constructor(private router: Router) {}
    method ngOnInit (line 28) | ngOnInit() {}
    method register (line 30) | register() {

FILE: Lab4/client/Landing/src/app/views/register/register.component.ts
  class RegisterComponent (line 12) | class RegisterComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 28) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 30) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 36) | submit() {

FILE: Lab4/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, shardId, orderId, orderName, orderProducts):
  class OrderProduct (line 13) | class  OrderProduct:
    method __init__ (line 15) | def __init__(self, productId, price, quantity):

FILE: Lab4/server/OrderService/order_service.py
  function get_order (line 15) | def get_order(event, context):
  function create_order (line 30) | def create_order(event, context):
  function update_order (line 42) | def update_order(event, context):
  function delete_order (line 56) | def delete_order(event, context):
  function get_orders (line 69) | def get_orders(event, context):

FILE: Lab4/server/OrderService/order_service_dal.py
  function get_order (line 26) | def get_order(event, key):
  function delete_order (line 45) | def delete_order(event, key):
  function create_order (line 62) | def create_order(event, payload):
  function update_order (line 86) | def update_order(event, payload, key):
  function get_orders (line 113) | def get_orders(event, tenantId):
  function __query_all_partitions (line 126) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 142) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...
  function __get_dynamodb_table (line 152) | def __get_dynamodb_table(event, dynamodb):
  function get_order_products_dict (line 163) | def get_order_products_dict(orderProducts):

FILE: Lab4/server/ProductService/product_models.py
  class Product (line 4) | class Product:
    method __init__ (line 6) | def __init__(self, shardId, productId, sku, name, price, category):
  class Category (line 15) | class Category:
    method __init__ (line 16) | def __init__(self, id, name):

FILE: Lab4/server/ProductService/product_service.py
  function get_product (line 15) | def get_product(event, context):
  function create_product (line 31) | def create_product(event, context):
  function update_product (line 43) | def update_product(event, context):
  function delete_product (line 57) | def delete_product(event, context):
  function get_products (line 70) | def get_products(event, context):

FILE: Lab4/server/ProductService/product_service_dal.py
  function get_product (line 26) | def get_product(event, key):
  function delete_product (line 45) | def delete_product(event, key):
  function create_product (line 61) | def create_product(event, payload):
  function update_product (line 91) | def update_product(event, payload, key):
  function get_products (line 121) | def get_products(event, tenantId):
  function __query_all_partitions (line 133) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 149) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...
  function __get_dynamodb_table (line 159) | def __get_dynamodb_table(event, dynamodb):

FILE: Lab4/server/Resources/shared_service_authorizer.py
  function lambda_handler (line 25) | def lambda_handler(event, context):
  function validateJWT (line 124) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 165) | class HttpVerb:
  class AuthPolicy (line 175) | class AuthPolicy(object):
    method __init__ (line 200) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 206) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 238) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 249) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 270) | def allowAllMethods(self):
    method denyAllMethods (line 274) | def denyAllMethods(self):
    method allowMethod (line 278) | def allowMethod(self, verb, resource):
    method denyMethod (line 283) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 288) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 294) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 300) | def build(self):

FILE: Lab4/server/Resources/tenant_authorizer.py
  function lambda_handler (line 22) | def lambda_handler(event, context):
  function validateJWT (line 75) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 116) | class HttpVerb:
  class AuthPolicy (line 126) | class AuthPolicy(object):
    method __init__ (line 151) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 157) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 189) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 200) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 221) | def allowAllMethods(self):
    method denyAllMethods (line 225) | def denyAllMethods(self):
    method allowMethod (line 229) | def allowMethod(self, verb, resource):
    method denyMethod (line 234) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 239) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 245) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 251) | def build(self):

FILE: Lab4/server/TenantManagementService/tenant-management.py
  function create_tenant (line 25) | def create_tenant(event, context):
  function get_tenants (line 46) | def get_tenants(event, context):
  function update_tenant (line 56) | def update_tenant(event, context):
  function get_tenant (line 95) | def get_tenant(event, context):
  function deactivate_tenant (line 127) | def deactivate_tenant(event, context):
  function activate_tenant (line 170) | def activate_tenant(event, context):
  function __invoke_disable_users (line 212) | def __invoke_disable_users(update_details, headers, auth, host, stage_na...
  function __invoke_enable_users (line 227) | def __invoke_enable_users(update_details, headers, auth, host, stage_nam...
  class TenantInfo (line 242) | class TenantInfo:
    method __init__ (line 243) | def __init__(self, tenant_name, tenant_address, tenant_email, tenant_p...

FILE: Lab4/server/TenantManagementService/tenant-registration.py
  function register_tenant (line 19) | def register_tenant(event, context):
  function __create_tenant_admin_user (line 46) | def __create_tenant_admin_user(tenant_details, headers, auth, host, stag...
  function __create_tenant (line 58) | def __create_tenant(tenant_details, headers, auth, host, stage_name):

FILE: Lab4/server/TenantManagementService/user-management.py
  function create_tenant_admin_user (line 23) | def create_tenant_admin_user(event, context):
  function create_user (line 47) | def create_user(event, context):
  function get_users (line 100) | def get_users(event, context):
  function get_user (line 144) | def get_user(event, context):
  function update_user (line 167) | def update_user(event, context):
  function disable_user (line 210) | def disable_user(event, context):
  function disable_users_by_tenant (line 240) | def disable_users_by_tenant(event, context):
  function enable_users_by_tenant (line 269) | def enable_users_by_tenant(event, context):
  function get_user_info (line 296) | def get_user_info(event, user_pool_id, user_name):
  class UserManagement (line 316) | class UserManagement:
    method create_user_group (line 317) | def create_user_group(self, user_pool_id, group_name, group_description):
    method create_tenant_admin (line 326) | def create_tenant_admin(self, user_pool_id, tenant_admin_user_name, us...
    method add_user_to_group (line 352) | def add_user_to_group(self, user_pool_id, user_name, group_name):
    method create_user_tenant_mapping (line 360) | def create_user_tenant_mapping(self, user_name, tenant_id):
  class UserInfo (line 371) | class UserInfo:
    method __init__ (line 372) | def __init__(self, user_name=None, tenant_id=None, user_role=None,

FILE: Lab4/server/layers/auth_manager.py
  class UserRoles (line 8) | class UserRoles:
  function isTenantAdmin (line 14) | def isTenantAdmin(user_role):
  function isSystemAdmin (line 20) | def isSystemAdmin(user_role):
  function isSaaSProvider (line 27) | def isSaaSProvider(user_role):
  function isTenantUser (line 32) | def isTenantUser(user_role):
  function getPolicyForUser (line 38) | def getPolicyForUser(user_role, service_identifier, tenant_id, region, a...
  function __getPolicyForSystemAdmin (line 59) | def __getPolicyForSystemAdmin(region, aws_account_id):
  function __getPolicyForTenantAdmin (line 82) | def __getPolicyForTenantAdmin(tenant_id, sevice_identifier, region, aws_...
  function __getPolicyForTenantUser (line 171) | def __getPolicyForTenantUser(tenant_id, region, aws_account_id):

FILE: Lab4/server/layers/logger.py
  function info (line 9) | def info(log_message):
  function error (line 14) | def error(log_message):
  function log_with_tenant_context (line 17) | def log_with_tenant_context(event, log_message):

FILE: Lab4/server/layers/metrics_manager.py
  function record_metric (line 10) | def record_metric(event, metric_name, metric_unit, metric_value):

FILE: Lab4/server/layers/utils.py
  class StatusCodes (line 12) | class StatusCodes(Enum):
  class Service_Identifier (line 17) | class Service_Identifier(Enum):
  function create_success_response (line 21) | def create_success_response(message):
  function create_unauthorized_response (line 34) | def create_unauthorized_response():
  function generate_response (line 47) | def generate_response(inputObject):
  function encode_to_json_object (line 58) | def  encode_to_json_object(inputObject):
  function get_auth (line 64) | def get_auth(host, region):
  function get_headers (line 75) | def get_headers(event):

FILE: Lab5/client/Admin/src/app/app-routing.module.ts
  class AppRoutingModule (line 48) | class AppRoutingModule {}

FILE: Lab5/client/Admin/src/app/app.component.ts
  class AppComponent (line 18) | class AppComponent {
    method constructor (line 19) | constructor(

FILE: Lab5/client/Admin/src/app/app.module.ts
  class AppModule (line 58) | class AppModule {}

FILE: Lab5/client/Admin/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Lab5/client/Admin/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab5/client/Admin/src/app/nav/nav.component.ts
  class NavComponent (line 22) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 52) | ngOnInit(): void {

FILE: Lab5/client/Admin/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Lab5/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab5/client/Admin/src/app/views/dashboard/dashboard.component.ts
  type DataSet (line 9) | interface DataSet {
  type ChartData (line 13) | interface ChartData {
  class DashboardComponent (line 24) | class DashboardComponent implements OnInit {
    method constructor (line 25) | constructor(private tenantSvc: TenantsService) {}
    method random (line 132) | public random(min: number, max: number) {
    method ngOnInit (line 136) | ngOnInit(): void {

FILE: Lab5/client/Admin/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab5/client/Admin/src/app/views/tenants/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 29) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 31) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 37) | submit() {

FILE: Lab5/client/Admin/src/app/views/tenants/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 22) | constructor(private tenantSvc: TenantsService) {}
    method ngOnInit (line 24) | ngOnInit(): void {

FILE: Lab5/client/Admin/src/app/views/tenants/models/tenant.ts
  type Tenant (line 1) | interface Tenant {

FILE: Lab5/client/Admin/src/app/views/tenants/tenants-routing.module.ts
  class TenantsRoutingModule (line 37) | class TenantsRoutingModule {}

FILE: Lab5/client/Admin/src/app/views/tenants/tenants.module.ts
  class TenantsModule (line 51) | class TenantsModule {}

FILE: Lab5/client/Admin/src/app/views/tenants/tenants.service.ts
  class TenantsService (line 15) | class TenantsService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 22) | fetch(): Observable<Tenant[]> {
    method post (line 26) | post(tenant: Tenant): Observable<Tenant[]> {

FILE: Lab5/client/Admin/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 33) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 35) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 41) | onSubmit() {

FILE: Lab5/client/Admin/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Lab5/client/Admin/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Lab5/client/Admin/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Lab5/client/Admin/src/app/views/users/users.module.ts
  class UsersModule (line 49) | class UsersModule {}

FILE: Lab5/client/Admin/src/app/views/users/users.service.ts
  class UsersService (line 26) | class UsersService {
    method constructor (line 29) | constructor(private http: HttpClient) {
    method fetch (line 33) | fetch(): Observable<User[]> {
    method create (line 37) | create(user: User): Observable<User> {

FILE: Lab5/client/Application/cypress.config.ts
  method setupNodeEvents (line 6) | setupNodeEvents(on, config) {

FILE: Lab5/client/Application/src/app/app-routing.module.ts
  class AppRoutingModule (line 62) | class AppRoutingModule {}

FILE: Lab5/client/Application/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab5/client/Application/src/app/app.module.ts
  class AppModule (line 86) | class AppModule {}

FILE: Lab5/client/Application/src/app/cognito.guard.ts
  class CognitoGuard (line 16) | class CognitoGuard implements CanActivate {
    method constructor (line 17) | constructor(
    method canActivate (line 22) | canActivate(

FILE: Lab5/client/Application/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Lab5/client/Application/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab5/client/Application/src/app/nav/nav.component.ts
  class NavComponent (line 23) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 54) | ngOnInit(): void {
    method logout (line 85) | async logout() {

FILE: Lab5/client/Application/src/app/views/auth/auth-configuration.service.ts
  class AuthConfigurationService (line 36) | class AuthConfigurationService {
    method constructor (line 41) | constructor(
    method setTenantConfig (line 47) | public setTenantConfig(tenantName: string): Promise<any> {
    method configureAmplifyAuth (line 69) | configureAmplifyAuth(): boolean {
    method cleanLocalStorage (line 93) | cleanLocalStorage() {

FILE: Lab5/client/Application/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Lab5/client/Application/src/app/views/auth/models/config-params.ts
  type ConfigParams (line 17) | interface ConfigParams {

FILE: Lab5/client/Application/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab5/client/Application/src/app/views/dashboard/dashboard.component.ts
  class DashboardComponent (line 13) | class DashboardComponent {
    method chartClicked (line 48) | public chartClicked({
    method chartHovered (line 56) | public chartHovered({
    method randomize (line 64) | public randomize(): void {
    method constructor (line 99) | constructor(private breakpointObserver: BreakpointObserver) {}

FILE: Lab5/client/Application/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab5/client/Application/src/app/views/error/404.component.ts
  class P404Component (line 10) | class P404Component {
    method constructor (line 11) | constructor() {}

FILE: Lab5/client/Application/src/app/views/error/500.component.ts
  class P500Component (line 10) | class P500Component {
    method constructor (line 11) | constructor() {}

FILE: Lab5/client/Application/src/app/views/error/unauthorized.component.ts
  class UnauthorizedComponent (line 30) | class UnauthorizedComponent implements OnInit {
    method constructor (line 37) | constructor(
    method ngOnInit (line 60) | ngOnInit(): void {
    method isFieldInvalid (line 66) | isFieldInvalid(field: string) {
    method displayFieldCss (line 73) | displayFieldCss(field: string) {
    method hasRequiredError (line 79) | hasRequiredError(field: string) {
    method openErrorMessageSnackBar (line 83) | openErrorMessageSnackBar(errorMessage: string) {
    method login (line 89) | login() {

FILE: Lab5/client/Application/src/app/views/orders/create/create.component.ts
  type LineItem (line 9) | interface LineItem {
  class CreateComponent (line 18) | class CreateComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 35) | ngOnInit(): void {
    method name (line 45) | get name() {
    method productQuantity (line 49) | get productQuantity() {
    method add (line 55) | add(op: LineItem) {
    method remove (line 70) | remove(op: LineItem) {
    method submit (line 88) | submit() {

FILE: Lab5/client/Application/src/app/views/orders/detail/detail.component.ts
  class DetailComponent (line 17) | class DetailComponent implements OnInit {
    method constructor (line 22) | constructor(private route: ActivatedRoute, private orderSvc: OrdersSer...
    method ngOnInit (line 24) | ngOnInit(): void {
    method today (line 30) | today() {
    method tenantName (line 34) | tenantName() {
    method sum (line 38) | sum(op: OrderProduct) {
    method tax (line 42) | tax(op: OrderProduct) {
    method total (line 46) | total(op: OrderProduct) {
    method subTotal (line 50) | subTotal(order: Order) {
    method calcTax (line 56) | calcTax(order: Order) {
    method final (line 60) | final(order: Order) {

FILE: Lab5/client/Application/src/app/views/orders/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 15) | constructor(private orderSvc: OrdersService, private router: Router) {}
    method ngOnInit (line 17) | ngOnInit(): void {
    method sum (line 24) | sum(order: Order): number {

FILE: Lab5/client/Application/src/app/views/orders/models/order.interface.ts
  type Order (line 7) | interface Order {

FILE: Lab5/client/Application/src/app/views/orders/models/orderproduct.interface.ts
  type OrderProduct (line 5) | interface OrderProduct {

FILE: Lab5/client/Application/src/app/views/orders/orders-routing.module.ts
  class OrdersRoutingModule (line 44) | class OrdersRoutingModule {}

FILE: Lab5/client/Application/src/app/views/orders/orders.module.ts
  class OrdersModule (line 51) | class OrdersModule {}

FILE: Lab5/client/Application/src/app/views/orders/orders.service.ts
  class OrdersService (line 13) | class OrdersService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 18) | fetch(): Observable<Order[]> {
    method get (line 22) | get(orderId: string): Observable<Order> {
    method create (line 27) | create(order: Order): Observable<Order> {

FILE: Lab5/client/Application/src/app/views/products/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 15) | constructor(
    method ngOnInit (line 23) | ngOnInit(): void {
    method name (line 32) | get name() {
    method price (line 36) | get price() {
    method submit (line 40) | submit() {
    method cancel (line 50) | cancel() {

FILE: Lab5/client/Application/src/app/views/products/edit/edit.component.ts
  class EditComponent (line 18) | class EditComponent implements OnInit {
    method constructor (line 25) | constructor(
    method ngOnInit (line 34) | ngOnInit(): void {
    method name (line 57) | get name() {
    method price (line 61) | get price() {
    method submit (line 65) | submit() {
    method delete (line 72) | delete() {
    method cancel (line 82) | cancel() {

FILE: Lab5/client/Application/src/app/views/products/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 16) | constructor(private productSvc: ProductService, private router: Router...
    method ngOnInit (line 18) | ngOnInit(): void {
    method onEdit (line 25) | onEdit(product: Product) {
    method onRemove (line 30) | onRemove(product: Product) {
    method onCreate (line 39) | onCreate() {

FILE: Lab5/client/Application/src/app/views/products/models/product.interface.ts
  type Product (line 5) | interface Product {

FILE: Lab5/client/Application/src/app/views/products/product.service.ts
  class ProductService (line 13) | class ProductService {
    method constructor (line 14) | constructor(private http: HttpClient) {}
    method fetch (line 17) | fetch(): Observable<Product[]> {
    method get (line 21) | get(productId: string): Observable<Product> {
    method delete (line 26) | delete(product: Product) {
    method put (line 31) | put(product: Product) {
    method post (line 36) | post(product: Product) {

FILE: Lab5/client/Application/src/app/views/products/products-routing.module.ts
  class ProductsRoutingModule (line 44) | class ProductsRoutingModule {}

FILE: Lab5/client/Application/src/app/views/products/products.module.ts
  class ProductsModule (line 48) | class ProductsModule {}

FILE: Lab5/client/Application/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 32) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 34) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 40) | onSubmit() {

FILE: Lab5/client/Application/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Lab5/client/Application/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Lab5/client/Application/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Lab5/client/Application/src/app/views/users/users.module.ts
  class UsersModule (line 50) | class UsersModule {}

FILE: Lab5/client/Application/src/app/views/users/users.service.ts
  class UsersService (line 27) | class UsersService {
    method constructor (line 30) | constructor(private http: HttpClient) {
    method fetch (line 34) | fetch(): Observable<User[]> {
    method create (line 38) | create(user: User): Observable<User> {
    method update (line 42) | update(email: string, user: User) {}

FILE: Lab5/client/Landing/src/app/app-routing.module.ts
  class AppRoutingModule (line 31) | class AppRoutingModule {}

FILE: Lab5/client/Landing/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab5/client/Landing/src/app/app.module.ts
  class AppModule (line 53) | class AppModule {}

FILE: Lab5/client/Landing/src/app/views/landing/landing.component.ts
  class LandingComponent (line 25) | class LandingComponent implements OnInit {
    method constructor (line 26) | constructor(private router: Router) {}
    method ngOnInit (line 28) | ngOnInit() {}
    method register (line 30) | register() {

FILE: Lab5/client/Landing/src/app/views/register/register.component.ts
  class RegisterComponent (line 12) | class RegisterComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 28) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 30) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 36) | submit() {

FILE: Lab5/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, shardId, orderId, orderName, orderProducts):
  class OrderProduct (line 13) | class  OrderProduct:
    method __init__ (line 15) | def __init__(self, productId, price, quantity):

FILE: Lab5/server/OrderService/order_service.py
  function get_order (line 15) | def get_order(event, context):
  function create_order (line 30) | def create_order(event, context):
  function update_order (line 42) | def update_order(event, context):
  function delete_order (line 56) | def delete_order(event, context):
  function get_orders (line 69) | def get_orders(event, context):

FILE: Lab5/server/OrderService/order_service_dal.py
  function get_order (line 27) | def get_order(event, key):
  function delete_order (line 47) | def delete_order(event, key):
  function create_order (line 64) | def create_order(event, payload):
  function update_order (line 88) | def update_order(event, payload, key):
  function get_orders (line 115) | def get_orders(event, tenantId):
  function __query_all_partitions (line 128) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 144) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...
  function __get_dynamodb_table (line 154) | def __get_dynamodb_table(event, dynamodb):
  function get_order_products_dict (line 178) | def get_order_products_dict(orderProducts):

FILE: Lab5/server/ProductService/product_models.py
  class Product (line 4) | class Product:
    method __init__ (line 6) | def __init__(self, shardId, productId, sku, name, price, category):
  class Category (line 15) | class Category:
    method __init__ (line 16) | def __init__(self, id, name):

FILE: Lab5/server/ProductService/product_service.py
  function get_product (line 15) | def get_product(event, context):
  function create_product (line 31) | def create_product(event, context):
  function update_product (line 43) | def update_product(event, context):
  function delete_product (line 57) | def delete_product(event, context):
  function get_products (line 70) | def get_products(event, context):

FILE: Lab5/server/ProductService/product_service_dal.py
  function get_product (line 27) | def get_product(event, key):
  function delete_product (line 47) | def delete_product(event, key):
  function create_product (line 64) | def create_product(event, payload):
  function update_product (line 95) | def update_product(event, payload, key):
  function get_products (line 126) | def get_products(event, tenantId):
  function __query_all_partitions (line 138) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 154) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...
  function __get_dynamodb_table (line 164) | def __get_dynamodb_table(event, dynamodb):

FILE: Lab5/server/Resources/shared_service_authorizer.py
  function lambda_handler (line 24) | def lambda_handler(event, context):
  function validateJWT (line 129) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 170) | class HttpVerb:
  class AuthPolicy (line 180) | class AuthPolicy(object):
    method __init__ (line 205) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 211) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 243) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 254) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 275) | def allowAllMethods(self):
    method denyAllMethods (line 279) | def denyAllMethods(self):
    method allowMethod (line 283) | def allowMethod(self, verb, resource):
    method denyMethod (line 288) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 293) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 299) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 305) | def build(self):

FILE: Lab5/server/Resources/tenant_authorizer.py
  function lambda_handler (line 23) | def lambda_handler(event, context):
  function isTenantAuthorizedForThisAPI (line 126) | def isTenantAuthorizedForThisAPI(apigateway_url, current_api_id):
  function validateJWT (line 132) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 173) | class HttpVerb:
  class AuthPolicy (line 183) | class AuthPolicy(object):
    method __init__ (line 208) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 214) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 246) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 257) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 278) | def allowAllMethods(self):
    method denyAllMethods (line 282) | def denyAllMethods(self):
    method allowMethod (line 286) | def allowMethod(self, verb, resource):
    method denyMethod (line 291) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 296) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 302) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 308) | def build(self):

FILE: Lab5/server/TenantManagementService/tenant-management.py
  function create_tenant (line 24) | def create_tenant(event, context):
  function get_tenants (line 64) | def get_tenants(event, context):
  function update_tenant (line 77) | def update_tenant(event, context):
  function get_tenant (line 118) | def get_tenant(event, context):
  function deactivate_tenant (line 152) | def deactivate_tenant(event, context):
  function activate_tenant (line 206) | def activate_tenant(event, context):
  function load_tenant_config (line 259) | def load_tenant_config(event, context):
  function __invoke_disable_users (line 281) | def __invoke_disable_users(update_details, headers, auth, host, stage_na...
  function __invoke_deprovision_tenant (line 296) | def __invoke_deprovision_tenant(update_details, headers, auth, host, sta...
  function __invoke_enable_users (line 311) | def __invoke_enable_users(update_details, headers, auth, host, stage_nam...
  function __invoke_provision_tenant (line 326) | def __invoke_provision_tenant(update_details, headers, auth, host, stage...
  function __getTenantManagementTable (line 341) | def __getTenantManagementTable(event):
  class TenantInfo (line 350) | class TenantInfo:
    method __init__ (line 351) | def __init__(self, tenant_name, tenant_address, tenant_email, tenant_p...

FILE: Lab5/server/TenantManagementService/tenant-provisioning.py
  function provision_tenant (line 22) | def provision_tenant(event, context):
  function deprovision_tenant (line 37) | def deprovision_tenant(event, context):

FILE: Lab5/server/TenantManagementService/tenant-registration.py
  function register_tenant (line 22) | def register_tenant(event, context):
  function __create_tenant_admin_user (line 60) | def __create_tenant_admin_user(tenant_details, headers, auth, host, stag...
  function __create_tenant (line 72) | def __create_tenant(tenant_details, headers, auth, host, stage_name):
  function __provision_tenant (line 83) | def __provision_tenant(tenant_details, headers, auth, host, stage_name):

FILE: Lab5/server/TenantManagementService/user-management.py
  function create_tenant_admin_user (line 21) | def create_tenant_admin_user(event, context):
  function create_user (line 54) | def create_user(event, context):
  function get_users (line 115) | def get_users(event, context):
  function get_user (line 164) | def get_user(event, context):
  function update_user (line 198) | def update_user(event, context):
  function disable_user (line 251) | def disable_user(event, context):
  function disable_users_by_tenant (line 291) | def disable_users_by_tenant(event, context):
  function enable_users_by_tenant (line 323) | def enable_users_by_tenant(event, context):
  function get_user_info (line 353) | def get_user_info(event, user_pool_id, user_name):
  class UserManagement (line 373) | class UserManagement:
    method create_user_pool (line 374) | def create_user_pool(self, tenant_id):
    method create_user_pool_client (line 417) | def create_user_pool_client(self, user_pool_id):
    method create_user_pool_domain (line 448) | def create_user_pool_domain(self, user_pool_id, tenant_id):
    method create_user_group (line 455) | def create_user_group(self, user_pool_id, group_name, group_description):
    method create_tenant_admin (line 464) | def create_tenant_admin(self, user_pool_id, tenant_admin_user_name, us...
    method add_user_to_group (line 490) | def add_user_to_group(self, user_pool_id, user_name, group_name):
    method create_user_tenant_mapping (line 498) | def create_user_tenant_mapping(self, user_name, tenant_id):
  class UserInfo (line 509) | class UserInfo:
    method __init__ (line 510) | def __init__(self, user_name=None, tenant_id=None, user_role=None,

FILE: Lab5/server/TenantPipeline/lib/serverless-saas-stack.ts
  class ServerlessSaaSStack (line 18) | class ServerlessSaaSStack extends cdk.Stack {
    method constructor (line 19) | constructor(scope: Construct, id: string, props?: cdk.StackProps) {

FILE: Lab5/server/TenantPipeline/resources/lambda-deploy-tenant-stack.py
  function find_artifact (line 26) | def find_artifact(artifacts, name):
  function get_template_url (line 44) | def get_template_url(s3, artifact, file_in_zip):
  function update_stack (line 78) | def update_stack(stack, template_url, params):
  function stack_exists (line 103) | def stack_exists(stack):
  function create_stack (line 126) | def create_stack(stack, template_url, params):
  function get_stack_status (line 138) | def get_stack_status(stack):
  function put_job_success (line 154) | def put_job_success(job, message):
  function put_job_failure (line 169) | def put_job_failure(job, message):
  function continue_job_later (line 184) | def continue_job_later(job, message):
  function start_update_or_create (line 208) | def start_update_or_create(job_id, stack, template_url, params):
  function check_stack_update_status (line 245) | def check_stack_update_status(job_id, stack):
  function get_user_params (line 273) | def get_user_params(job_data):
  function setup_s3_client (line 310) | def setup_s3_client(job_data):
  function get_tenant_params (line 336) | def get_tenant_params(tenantId):
  function add_parameter (line 353) | def add_parameter(params, parameter_key, parameter_value):
  function update_tenantstackmapping (line 362) | def update_tenantstackmapping(tenantId, commit_id):
  function lambda_handler (line 382) | def lambda_handler(event, context):

FILE: Lab5/server/custom_resources/update_settings_table.py
  function do_action (line 19) | def do_action(event, _):
  function do_nothing (line 51) | def do_nothing(_, __):
  function handler (line 54) | def handler(event, context):

FILE: Lab5/server/custom_resources/update_tenant_apigatewayurl.py
  function do_action (line 16) | def do_action(event, _):
  function do_nothing (line 54) | def do_nothing(_, __):
  function handler (line 57) | def handler(event, context):

FILE: Lab5/server/custom_resources/update_tenantstackmap_table.py
  function do_action (line 18) | def do_action(event, _):
  function do_nothing (line 41) | def do_nothing(_, __):
  function handler (line 44) | def handler(event, context):

FILE: Lab5/server/layers/auth_manager.py
  class UserRoles (line 8) | class UserRoles:
  function isTenantAdmin (line 14) | def isTenantAdmin(user_role):
  function isSystemAdmin (line 20) | def isSystemAdmin(user_role):
  function isSaaSProvider (line 27) | def isSaaSProvider(user_role):
  function isTenantUser (line 32) | def isTenantUser(user_role):
  function getPolicyForUser (line 38) | def getPolicyForUser(user_role, service_identifier, tenant_id, region, a...
  function __getPolicyForSystemAdmin (line 61) | def __getPolicyForSystemAdmin(region, aws_account_id):
  function __getPolicyForTenantAdmin (line 84) | def __getPolicyForTenantAdmin(tenant_id, sevice_identifier, region, aws_...
  function __getPolicyForTenantUser (line 173) | def __getPolicyForTenantUser(tenant_id, region, aws_account_id):

FILE: Lab5/server/layers/logger.py
  function info (line 9) | def info(log_message):
  function error (line 15) | def error(log_message):
  function log_with_tenant_context (line 21) | def log_with_tenant_context(event, log_message):

FILE: Lab5/server/layers/metrics_manager.py
  function record_metric (line 10) | def record_metric(event, metric_name, metric_unit, metric_value):

FILE: Lab5/server/layers/utils.py
  class TenantTier (line 12) | class TenantTier(Enum):
  class StatusCodes (line 19) | class StatusCodes(Enum):
  class Service_Identifier (line 24) | class Service_Identifier(Enum):
  function create_success_response (line 28) | def create_success_response(message):
  function create_unauthorized_response (line 41) | def create_unauthorized_response():
  function create_notfound_response (line 54) | def create_notfound_response(message):
  function get_auth (line 67) | def get_auth(host, region):
  function get_headers (line 78) | def get_headers(event):
  function generate_response (line 82) | def generate_response(inputObject):
  function encode_to_json_object (line 93) | def  encode_to_json_object(inputObject):

FILE: Lab6/client/Admin/src/app/app-routing.module.ts
  class AppRoutingModule (line 48) | class AppRoutingModule {}

FILE: Lab6/client/Admin/src/app/app.component.ts
  class AppComponent (line 18) | class AppComponent {
    method constructor (line 19) | constructor(

FILE: Lab6/client/Admin/src/app/app.module.ts
  class AppModule (line 58) | class AppModule {}

FILE: Lab6/client/Admin/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Lab6/client/Admin/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab6/client/Admin/src/app/nav/nav.component.ts
  class NavComponent (line 22) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 52) | ngOnInit(): void {

FILE: Lab6/client/Admin/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Lab6/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab6/client/Admin/src/app/views/dashboard/dashboard.component.ts
  type DataSet (line 9) | interface DataSet {
  type ChartData (line 13) | interface ChartData {
  class DashboardComponent (line 24) | class DashboardComponent implements OnInit {
    method constructor (line 25) | constructor(private tenantSvc: TenantsService) {}
    method random (line 132) | public random(min: number, max: number) {
    method ngOnInit (line 136) | ngOnInit(): void {

FILE: Lab6/client/Admin/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab6/client/Admin/src/app/views/tenants/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 29) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 31) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 37) | submit() {

FILE: Lab6/client/Admin/src/app/views/tenants/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 22) | constructor(private tenantSvc: TenantsService) {}
    method ngOnInit (line 24) | ngOnInit(): void {

FILE: Lab6/client/Admin/src/app/views/tenants/models/tenant.ts
  type Tenant (line 1) | interface Tenant {

FILE: Lab6/client/Admin/src/app/views/tenants/tenants-routing.module.ts
  class TenantsRoutingModule (line 37) | class TenantsRoutingModule {}

FILE: Lab6/client/Admin/src/app/views/tenants/tenants.module.ts
  class TenantsModule (line 51) | class TenantsModule {}

FILE: Lab6/client/Admin/src/app/views/tenants/tenants.service.ts
  class TenantsService (line 15) | class TenantsService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 22) | fetch(): Observable<Tenant[]> {
    method post (line 26) | post(tenant: Tenant): Observable<Tenant[]> {

FILE: Lab6/client/Admin/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 33) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 35) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 41) | onSubmit() {

FILE: Lab6/client/Admin/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Lab6/client/Admin/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Lab6/client/Admin/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Lab6/client/Admin/src/app/views/users/users.module.ts
  class UsersModule (line 49) | class UsersModule {}

FILE: Lab6/client/Admin/src/app/views/users/users.service.ts
  class UsersService (line 26) | class UsersService {
    method constructor (line 29) | constructor(private http: HttpClient) {
    method fetch (line 33) | fetch(): Observable<User[]> {
    method create (line 37) | create(user: User): Observable<User> {

FILE: Lab6/client/Application/cypress.config.ts
  method setupNodeEvents (line 6) | setupNodeEvents(on, config) {

FILE: Lab6/client/Application/src/app/app-routing.module.ts
  class AppRoutingModule (line 62) | class AppRoutingModule {}

FILE: Lab6/client/Application/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab6/client/Application/src/app/app.module.ts
  class AppModule (line 86) | class AppModule {}

FILE: Lab6/client/Application/src/app/cognito.guard.ts
  class CognitoGuard (line 16) | class CognitoGuard implements CanActivate {
    method constructor (line 17) | constructor(
    method canActivate (line 22) | canActivate(

FILE: Lab6/client/Application/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Lab6/client/Application/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Lab6/client/Application/src/app/nav/nav.component.ts
  class NavComponent (line 23) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 54) | ngOnInit(): void {
    method logout (line 85) | async logout() {

FILE: Lab6/client/Application/src/app/views/auth/auth-configuration.service.ts
  class AuthConfigurationService (line 36) | class AuthConfigurationService {
    method constructor (line 41) | constructor(
    method setTenantConfig (line 47) | public setTenantConfig(tenantName: string): Promise<any> {
    method configureAmplifyAuth (line 69) | configureAmplifyAuth(): boolean {
    method cleanLocalStorage (line 93) | cleanLocalStorage() {

FILE: Lab6/client/Application/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Lab6/client/Application/src/app/views/auth/models/config-params.ts
  type ConfigParams (line 17) | interface ConfigParams {

FILE: Lab6/client/Application/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Lab6/client/Application/src/app/views/dashboard/dashboard.component.ts
  class DashboardComponent (line 13) | class DashboardComponent {
    method chartClicked (line 48) | public chartClicked({
    method chartHovered (line 56) | public chartHovered({
    method randomize (line 64) | public randomize(): void {
    method constructor (line 99) | constructor(private breakpointObserver: BreakpointObserver) {}

FILE: Lab6/client/Application/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Lab6/client/Application/src/app/views/error/404.component.ts
  class P404Component (line 10) | class P404Component {
    method constructor (line 11) | constructor() {}

FILE: Lab6/client/Application/src/app/views/error/500.component.ts
  class P500Component (line 10) | class P500Component {
    method constructor (line 11) | constructor() {}

FILE: Lab6/client/Application/src/app/views/error/unauthorized.component.ts
  class UnauthorizedComponent (line 29) | class UnauthorizedComponent implements OnInit {
    method constructor (line 35) | constructor(
    method ngOnInit (line 42) | ngOnInit(): void {
    method isFieldInvalid (line 52) | isFieldInvalid(field: string) {
    method displayFieldCss (line 59) | displayFieldCss(field: string) {
    method hasRequiredError (line 65) | hasRequiredError(field: string) {
    method openErrorMessageSnackBar (line 69) | openErrorMessageSnackBar(errorMessage: string) {
    method login (line 75) | login() {

FILE: Lab6/client/Application/src/app/views/orders/create/create.component.ts
  type LineItem (line 9) | interface LineItem {
  class CreateComponent (line 18) | class CreateComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 35) | ngOnInit(): void {
    method name (line 45) | get name() {
    method productQuantity (line 49) | get productQuantity() {
    method add (line 55) | add(op: LineItem) {
    method remove (line 70) | remove(op: LineItem) {
    method submit (line 88) | submit() {

FILE: Lab6/client/Application/src/app/views/orders/detail/detail.component.ts
  class DetailComponent (line 17) | class DetailComponent implements OnInit {
    method constructor (line 22) | constructor(private route: ActivatedRoute, private orderSvc: OrdersSer...
    method ngOnInit (line 24) | ngOnInit(): void {
    method today (line 30) | today() {
    method tenantName (line 34) | tenantName() {
    method sum (line 38) | sum(op: OrderProduct) {
    method tax (line 42) | tax(op: OrderProduct) {
    method total (line 46) | total(op: OrderProduct) {
    method subTotal (line 50) | subTotal(order: Order) {
    method calcTax (line 56) | calcTax(order: Order) {
    method final (line 60) | final(order: Order) {

FILE: Lab6/client/Application/src/app/views/orders/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 15) | constructor(private orderSvc: OrdersService, private router: Router) {}
    method ngOnInit (line 17) | ngOnInit(): void {
    method sum (line 24) | sum(order: Order): number {

FILE: Lab6/client/Application/src/app/views/orders/models/order.interface.ts
  type Order (line 7) | interface Order {

FILE: Lab6/client/Application/src/app/views/orders/models/orderproduct.interface.ts
  type OrderProduct (line 5) | interface OrderProduct {

FILE: Lab6/client/Application/src/app/views/orders/orders-routing.module.ts
  class OrdersRoutingModule (line 44) | class OrdersRoutingModule {}

FILE: Lab6/client/Application/src/app/views/orders/orders.module.ts
  class OrdersModule (line 51) | class OrdersModule {}

FILE: Lab6/client/Application/src/app/views/orders/orders.service.ts
  class OrdersService (line 13) | class OrdersService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 18) | fetch(): Observable<Order[]> {
    method get (line 22) | get(orderId: string): Observable<Order> {
    method create (line 27) | create(order: Order): Observable<Order> {

FILE: Lab6/client/Application/src/app/views/products/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 15) | constructor(
    method ngOnInit (line 23) | ngOnInit(): void {
    method name (line 32) | get name() {
    method price (line 36) | get price() {
    method submit (line 40) | submit() {
    method cancel (line 50) | cancel() {

FILE: Lab6/client/Application/src/app/views/products/edit/edit.component.ts
  class EditComponent (line 17) | class EditComponent implements OnInit {
    method constructor (line 23) | constructor(
    method ngOnInit (line 30) | ngOnInit(): void {
    method name (line 51) | get name() {
    method price (line 55) | get price() {
    method submit (line 59) | submit() {
    method delete (line 66) | delete() {
    method cancel (line 76) | cancel() {

FILE: Lab6/client/Application/src/app/views/products/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 16) | constructor(private productSvc: ProductService, private router: Router...
    method ngOnInit (line 18) | ngOnInit(): void {
    method onEdit (line 25) | onEdit(product: Product) {
    method onRemove (line 30) | onRemove(product: Product) {
    method onCreate (line 39) | onCreate() {

FILE: Lab6/client/Application/src/app/views/products/models/product.interface.ts
  type Product (line 5) | interface Product {

FILE: Lab6/client/Application/src/app/views/products/product.service.ts
  class ProductService (line 13) | class ProductService {
    method constructor (line 14) | constructor(private http: HttpClient) {}
    method fetch (line 17) | fetch(): Observable<Product[]> {
    method get (line 21) | get(productId: string): Observable<Product> {
    method delete (line 26) | delete(product: Product) {
    method put (line 31) | put(product: Product) {
    method post (line 35) | post(product: Product) {

FILE: Lab6/client/Application/src/app/views/products/products-routing.module.ts
  class ProductsRoutingModule (line 44) | class ProductsRoutingModule {}

FILE: Lab6/client/Application/src/app/views/products/products.module.ts
  class ProductsModule (line 48) | class ProductsModule {}

FILE: Lab6/client/Application/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 32) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 34) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 40) | onSubmit() {

FILE: Lab6/client/Application/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Lab6/client/Application/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Lab6/client/Application/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Lab6/client/Application/src/app/views/users/users.module.ts
  class UsersModule (line 50) | class UsersModule {}

FILE: Lab6/client/Application/src/app/views/users/users.service.ts
  class UsersService (line 27) | class UsersService {
    method constructor (line 30) | constructor(private http: HttpClient) {
    method fetch (line 34) | fetch(): Observable<User[]> {
    method create (line 38) | create(user: User): Observable<User> {
    method update (line 42) | update(email: string, user: User) {}

FILE: Lab6/client/Landing/src/app/app-routing.module.ts
  class AppRoutingModule (line 31) | class AppRoutingModule {}

FILE: Lab6/client/Landing/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Lab6/client/Landing/src/app/app.module.ts
  class AppModule (line 53) | class AppModule {}

FILE: Lab6/client/Landing/src/app/views/landing/landing.component.ts
  class LandingComponent (line 25) | class LandingComponent implements OnInit {
    method constructor (line 26) | constructor(private router: Router) {}
    method ngOnInit (line 28) | ngOnInit() {}
    method register (line 30) | register() {

FILE: Lab6/client/Landing/src/app/views/register/register.component.ts
  class RegisterComponent (line 12) | class RegisterComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 28) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 30) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 36) | submit() {

FILE: Lab6/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, shardId, orderId, orderName, orderProducts):
  class OrderProduct (line 13) | class  OrderProduct:
    method __init__ (line 15) | def __init__(self, productId, price, quantity):

FILE: Lab6/server/OrderService/order_service.py
  function get_order (line 15) | def get_order(event, context):
  function create_order (line 30) | def create_order(event, context):
  function update_order (line 42) | def update_order(event, context):
  function delete_order (line 56) | def delete_order(event, context):
  function get_orders (line 69) | def get_orders(event, context):

FILE: Lab6/server/OrderService/order_service_dal.py
  function get_order (line 27) | def get_order(event, key):
  function delete_order (line 47) | def delete_order(event, key):
  function create_order (line 64) | def create_order(event, payload):
  function update_order (line 88) | def update_order(event, payload, key):
  function get_orders (line 115) | def get_orders(event, tenantId):
  function __query_all_partitions (line 128) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 144) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...
  function __get_dynamodb_table (line 154) | def __get_dynamodb_table(event, dynamodb):
  function get_order_products_dict (line 178) | def get_order_products_dict(orderProducts):

FILE: Lab6/server/ProductService/product_models.py
  class Product (line 4) | class Product:
    method __init__ (line 6) | def __init__(self, shardId, productId, sku, name, price, category):
  class Category (line 15) | class Category:
    method __init__ (line 16) | def __init__(self, id, name):

FILE: Lab6/server/ProductService/product_service.py
  function get_product (line 15) | def get_product(event, context):
  function create_product (line 31) | def create_product(event, context):
  function update_product (line 43) | def update_product(event, context):
  function delete_product (line 57) | def delete_product(event, context):
  function get_products (line 70) | def get_products(event, context):

FILE: Lab6/server/ProductService/product_service_dal.py
  function get_product (line 27) | def get_product(event, key):
  function delete_product (line 47) | def delete_product(event, key):
  function create_product (line 64) | def create_product(event, payload):
  function update_product (line 96) | def update_product(event, payload, key):
  function get_products (line 127) | def get_products(event, tenantId):
  function __query_all_partitions (line 139) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 155) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...
  function __get_dynamodb_table (line 165) | def __get_dynamodb_table(event, dynamodb):

FILE: Lab6/server/Resources/shared_service_authorizer.py
  function lambda_handler (line 24) | def lambda_handler(event, context):
  function validateJWT (line 133) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 174) | class HttpVerb:
  class AuthPolicy (line 184) | class AuthPolicy(object):
    method __init__ (line 209) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 215) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 247) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 258) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 279) | def allowAllMethods(self):
    method denyAllMethods (line 283) | def denyAllMethods(self):
    method allowMethod (line 287) | def allowMethod(self, verb, resource):
    method denyMethod (line 292) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 297) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 303) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 309) | def build(self):

FILE: Lab6/server/Resources/tenant_authorizer.py
  function lambda_handler (line 24) | def lambda_handler(event, context):
  function isTenantAuthorizedForThisAPI (line 133) | def isTenantAuthorizedForThisAPI(apigateway_url, current_api_id):
  function validateJWT (line 139) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 180) | class HttpVerb:
  class AuthPolicy (line 190) | class AuthPolicy(object):
    method __init__ (line 215) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 221) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 253) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 264) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 285) | def allowAllMethods(self):
    method denyAllMethods (line 289) | def denyAllMethods(self):
    method allowMethod (line 293) | def allowMethod(self, verb, resource):
    method denyMethod (line 298) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 303) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 309) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 315) | def build(self):

FILE: Lab6/server/TenantManagementService/tenant-management.py
  function create_tenant (line 24) | def create_tenant(event, context):
  function get_tenants (line 66) | def get_tenants(event, context):
  function update_tenant (line 79) | def update_tenant(event, context):
  function get_tenant (line 131) | def get_tenant(event, context):
  function deactivate_tenant (line 165) | def deactivate_tenant(event, context):
  function activate_tenant (line 219) | def activate_tenant(event, context):
  function load_tenant_config (line 272) | def load_tenant_config(event, context):
  function __invoke_disable_users (line 294) | def __invoke_disable_users(update_details, headers, auth, host, stage_na...
  function __invoke_deprovision_tenant (line 309) | def __invoke_deprovision_tenant(update_details, headers, auth, host, sta...
  function __invoke_enable_users (line 324) | def __invoke_enable_users(update_details, headers, auth, host, stage_nam...
  function __invoke_provision_tenant (line 339) | def __invoke_provision_tenant(update_details, headers, auth, host, stage...
  function __getApiKey (line 354) | def __getApiKey(tenant_tier):
  function __getTenantManagementTable (line 364) | def __getTenantManagementTable(event):
  class TenantInfo (line 373) | class TenantInfo:
    method __init__ (line 374) | def __init__(self, tenant_name, tenant_address, tenant_email, tenant_p...

FILE: Lab6/server/TenantManagementService/tenant-provisioning.py
  function provision_tenant (line 22) | def provision_tenant(event, context):
  function deprovision_tenant (line 50) | def deprovision_tenant(event, context):

FILE: Lab6/server/TenantManagementService/tenant-registration.py
  function register_tenant (line 26) | def register_tenant(event, context):
  function __create_tenant_admin_user (line 67) | def __create_tenant_admin_user(tenant_details, headers, auth, host, stag...
  function __create_tenant (line 79) | def __create_tenant(tenant_details, headers, auth, host, stage_name):
  function __provision_tenant (line 90) | def __provision_tenant(tenant_details, headers, auth, host, stage_name):

FILE: Lab6/server/TenantManagementService/user-management.py
  function create_tenant_admin_user (line 21) | def create_tenant_admin_user(event, context):
  function create_user (line 62) | def create_user(event, context):
  function get_users (line 123) | def get_users(event, context):
  function get_user (line 172) | def get_user(event, context):
  function update_user (line 206) | def update_user(event, context):
  function disable_user (line 259) | def disable_user(event, context):
  function disable_users_by_tenant (line 299) | def disable_users_by_tenant(event, context):
  function enable_users_by_tenant (line 331) | def enable_users_by_tenant(event, context):
  function get_user_info (line 361) | def get_user_info(event, user_pool_id, user_name):
  class UserManagement (line 381) | class UserManagement:
    method create_user_pool (line 382) | def create_user_pool(self, tenant_id):
    method create_user_pool_client (line 425) | def create_user_pool_client(self, user_pool_id):
    method create_user_pool_domain (line 456) | def create_user_pool_domain(self, user_pool_id, tenant_id):
    method create_user_group (line 463) | def create_user_group(self, user_pool_id, group_name, group_description):
    method create_tenant_admin (line 472) | def create_tenant_admin(self, user_pool_id, tenant_admin_user_name, us...
    method add_user_to_group (line 498) | def add_user_to_group(self, user_pool_id, user_name, group_name):
    method create_user_tenant_mapping (line 506) | def create_user_tenant_mapping(self, user_name, tenant_id):
  class UserInfo (line 517) | class UserInfo:
    method __init__ (line 518) | def __init__(self, user_name=None, tenant_id=None, user_role=None,

FILE: Lab6/server/TenantPipeline/lib/serverless-saas-stack.ts
  class ServerlessSaaSStack (line 18) | class ServerlessSaaSStack extends cdk.Stack {
    method constructor (line 19) | constructor(scope: Construct, id: string, props?: cdk.StackProps) {

FILE: Lab6/server/TenantPipeline/resources/lambda-deploy-tenant-stack.py
  function find_artifact (line 26) | def find_artifact(artifacts, name):
  function get_template_url (line 44) | def get_template_url(s3, artifact, file_in_zip):
  function update_stack (line 78) | def update_stack(stack, template_url, params):
  function stack_exists (line 103) | def stack_exists(stack):
  function create_stack (line 126) | def create_stack(stack, template_url, params):
  function get_stack_status (line 138) | def get_stack_status(stack):
  function put_job_success (line 154) | def put_job_success(job, message):
  function put_job_failure (line 169) | def put_job_failure(job, message):
  function continue_job_later (line 184) | def continue_job_later(job, message):
  function start_update_or_create (line 208) | def start_update_or_create(job_id, stack, template_url, params):
  function check_stack_update_status (line 245) | def check_stack_update_status(job_id, stack):
  function get_user_params (line 273) | def get_user_params(job_data):
  function setup_s3_client (line 310) | def setup_s3_client(job_data):
  function get_tenant_params (line 336) | def get_tenant_params(tenantId):
  function add_parameter (line 353) | def add_parameter(params, parameter_key, parameter_value):
  function update_tenantstackmapping (line 362) | def update_tenantstackmapping(tenantId, commit_id):
  function lambda_handler (line 382) | def lambda_handler(event, context):

FILE: Lab6/server/custom_resources/update_settings_table.py
  function do_action (line 19) | def do_action(event, _):
  function do_nothing (line 51) | def do_nothing(_, __):
  function handler (line 54) | def handler(event, context):

FILE: Lab6/server/custom_resources/update_tenant_apigatewayurl.py
  function do_action (line 16) | def do_action(event, _):
  function do_nothing (line 54) | def do_nothing(_, __):
  function handler (line 57) | def handler(event, context):

FILE: Lab6/server/custom_resources/update_tenantstackmap_table.py
  function do_action (line 18) | def do_action(event, _):
  function do_nothing (line 41) | def do_nothing(_, __):
  function handler (line 44) | def handler(event, context):

FILE: Lab6/server/custom_resources/update_usage_plan.py
  function do_action (line 18) | def do_action(event, _):
  function do_nothing (line 87) | def do_nothing(_, __):
  function handler (line 90) | def handler(event, context):

FILE: Lab6/server/layers/auth_manager.py
  class UserRoles (line 8) | class UserRoles:
  function isTenantAdmin (line 14) | def isTenantAdmin(user_role):
  function isSystemAdmin (line 20) | def isSystemAdmin(user_role):
  function isSaaSProvider (line 27) | def isSaaSProvider(user_role):
  function isTenantUser (line 32) | def isTenantUser(user_role):
  function getPolicyForUser (line 38) | def getPolicyForUser(user_role, service_identifier, tenant_id, region, a...
  function __getPolicyForSystemAdmin (line 61) | def __getPolicyForSystemAdmin(region, aws_account_id):
  function __getPolicyForTenantAdmin (line 84) | def __getPolicyForTenantAdmin(tenant_id, sevice_identifier, region, aws_...
  function __getPolicyForTenantUser (line 173) | def __getPolicyForTenantUser(tenant_id, region, aws_account_id):

FILE: Lab6/server/layers/logger.py
  function info (line 9) | def info(log_message):
  function error (line 15) | def error(log_message):
  function log_with_tenant_context (line 21) | def log_with_tenant_context(event, log_message):

FILE: Lab6/server/layers/metrics_manager.py
  function record_metric (line 10) | def record_metric(event, metric_name, metric_unit, metric_value):

FILE: Lab6/server/layers/utils.py
  class TenantTier (line 12) | class TenantTier(Enum):
  class StatusCodes (line 19) | class StatusCodes(Enum):
  class Service_Identifier (line 24) | class Service_Identifier(Enum):
  function create_success_response (line 28) | def create_success_response(message):
  function create_unauthorized_response (line 41) | def create_unauthorized_response():
  function create_notfound_response (line 54) | def create_notfound_response(message):
  function get_auth (line 67) | def get_auth(host, region):
  function get_headers (line 78) | def get_headers(event):
  function generate_response (line 82) | def generate_response(inputObject):
  function encode_to_json_object (line 93) | def  encode_to_json_object(inputObject):

FILE: Lab7/.aws-sam/build/GetDynamoDBUsageAndCostByTenant/tenant_usage_and_cost.py
  function calculate_daily_dynamodb_attribution_by_tenant (line 21) | def calculate_daily_dynamodb_attribution_by_tenant(event, context):
  function calculate_daily_lambda_attribution_by_tenant (line 114) | def calculate_daily_lambda_attribution_by_tenant(event, context):
  function __get_total_service_cost (line 190) | def __get_total_service_cost(servicename, start_date_time, end_date_time):
  function __query_cloudwatch_logs (line 245) | def __query_cloudwatch_logs(logs, log_group_names, query_string, start_t...
  function __is_log_group_exists (line 259) | def __is_log_group_exists(logs_client, log_group_name):
  function __add_log_group_name (line 269) | def __add_log_group_name(logs_client, log_group_name, log_group_names_li...
  function __get_list_of_log_group_names (line 275) | def __get_list_of_log_group_names():

FILE: Lab7/.aws-sam/build/GetLambdaUsageAndCostByTenant/tenant_usage_and_cost.py
  function calculate_daily_dynamodb_attribution_by_tenant (line 21) | def calculate_daily_dynamodb_attribution_by_tenant(event, context):
  function calculate_daily_lambda_attribution_by_tenant (line 114) | def calculate_daily_lambda_attribution_by_tenant(event, context):
  function __get_total_service_cost (line 190) | def __get_total_service_cost(servicename, start_date_time, end_date_time):
  function __query_cloudwatch_logs (line 245) | def __query_cloudwatch_logs(logs, log_group_names, query_string, start_t...
  function __is_log_group_exists (line 259) | def __is_log_group_exists(logs_client, log_group_name):
  function __add_log_group_name (line 269) | def __add_log_group_name(logs_client, log_group_name, log_group_names_li...
  function __get_list_of_log_group_names (line 275) | def __get_list_of_log_group_names():

FILE: Lab7/TenantUsageAndCost/tenant_usage_and_cost.py
  function calculate_daily_dynamodb_attribution_by_tenant (line 21) | def calculate_daily_dynamodb_attribution_by_tenant(event, context):
  function calculate_daily_lambda_attribution_by_tenant (line 92) | def calculate_daily_lambda_attribution_by_tenant(event, context):
  function __get_total_service_cost (line 159) | def __get_total_service_cost(servicename, start_date_time, end_date_time):
  function __query_cloudwatch_logs (line 214) | def __query_cloudwatch_logs(logs, log_group_names, query_string, start_t...
  function __is_log_group_exists (line 228) | def __is_log_group_exists(logs_client, log_group_name):
  function __add_log_group_name (line 238) | def __add_log_group_name(logs_client, log_group_name, log_group_names_li...
  function __get_list_of_log_group_names (line 244) | def __get_list_of_log_group_names():
  function __get_start_date_time (line 287) | def __get_start_date_time():
  function __get_end_date_time (line 292) | def __get_end_date_time():

FILE: Solution/Lab1/client/Application/src/app/app-routing.module.ts
  class AppRoutingModule (line 44) | class AppRoutingModule {}

FILE: Solution/Lab1/client/Application/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Solution/Lab1/client/Application/src/app/app.module.ts
  class AppModule (line 74) | class AppModule {}

FILE: Solution/Lab1/client/Application/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Solution/Lab1/client/Application/src/app/nav/nav.component.ts
  class NavComponent (line 20) | class NavComponent implements OnInit {
    method constructor (line 30) | constructor(
    method ngOnInit (line 47) | ngOnInit(): void {}

FILE: Solution/Lab1/client/Application/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Solution/Lab1/client/Application/src/app/views/dashboard/dashboard.component.ts
  class DashboardComponent (line 13) | class DashboardComponent {
    method chartClicked (line 48) | public chartClicked({
    method chartHovered (line 56) | public chartHovered({
    method randomize (line 64) | public randomize(): void {
    method constructor (line 99) | constructor(private breakpointObserver: BreakpointObserver) {}

FILE: Solution/Lab1/client/Application/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Solution/Lab1/client/Application/src/app/views/orders/create/create.component.ts
  type LineItem (line 9) | interface LineItem {
  class CreateComponent (line 18) | class CreateComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 35) | ngOnInit(): void {
    method name (line 45) | get name() {
    method productQuantity (line 49) | get productQuantity() {
    method add (line 55) | add(op: LineItem) {
    method remove (line 70) | remove(op: LineItem) {
    method submit (line 88) | submit() {

FILE: Solution/Lab1/client/Application/src/app/views/orders/detail/detail.component.ts
  class DetailComponent (line 17) | class DetailComponent implements OnInit {
    method constructor (line 22) | constructor(private route: ActivatedRoute, private orderSvc: OrdersSer...
    method ngOnInit (line 24) | ngOnInit(): void {
    method today (line 30) | today() {
    method sum (line 34) | sum(op: OrderProduct) {
    method tax (line 38) | tax(op: OrderProduct) {
    method total (line 42) | total(op: OrderProduct) {
    method subTotal (line 46) | subTotal(order: Order) {
    method calcTax (line 52) | calcTax(order: Order) {
    method final (line 56) | final(order: Order) {

FILE: Solution/Lab1/client/Application/src/app/views/orders/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 15) | constructor(private orderSvc: OrdersService, private router: Router) {}
    method ngOnInit (line 17) | ngOnInit(): void {
    method sum (line 24) | sum(order: Order): number {

FILE: Solution/Lab1/client/Application/src/app/views/orders/models/order.interface.ts
  type Order (line 7) | interface Order {

FILE: Solution/Lab1/client/Application/src/app/views/orders/models/orderproduct.interface.ts
  type OrderProduct (line 5) | interface OrderProduct {

FILE: Solution/Lab1/client/Application/src/app/views/orders/orders-routing.module.ts
  class OrdersRoutingModule (line 44) | class OrdersRoutingModule {}

FILE: Solution/Lab1/client/Application/src/app/views/orders/orders.module.ts
  class OrdersModule (line 51) | class OrdersModule {}

FILE: Solution/Lab1/client/Application/src/app/views/orders/orders.service.ts
  class OrdersService (line 14) | class OrdersService {
    method constructor (line 17) | constructor(private http: HttpClient) {}
    method fetch (line 19) | fetch(): Observable<Order[]> {
    method get (line 23) | get(orderId: string): Observable<Order> {
    method create (line 28) | create(order: Order): Observable<Order> {

FILE: Solution/Lab1/client/Application/src/app/views/products/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 15) | constructor(
    method ngOnInit (line 23) | ngOnInit(): void {
    method name (line 32) | get name() {
    method price (line 36) | get price() {
    method submit (line 40) | submit() {
    method cancel (line 50) | cancel() {

FILE: Solution/Lab1/client/Application/src/app/views/products/edit/edit.component.ts
  class EditComponent (line 18) | class EditComponent implements OnInit {
    method constructor (line 25) | constructor(
    method ngOnInit (line 34) | ngOnInit(): void {
    method name (line 57) | get name() {
    method price (line 61) | get price() {
    method submit (line 65) | submit() {
    method delete (line 72) | delete() {
    method cancel (line 82) | cancel() {

FILE: Solution/Lab1/client/Application/src/app/views/products/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 16) | constructor(private productSvc: ProductService, private router: Router...
    method ngOnInit (line 18) | ngOnInit(): void {
    method onEdit (line 25) | onEdit(product: Product) {
    method onRemove (line 30) | onRemove(product: Product) {
    method onCreate (line 39) | onCreate() {

FILE: Solution/Lab1/client/Application/src/app/views/products/models/product.interface.ts
  type Product (line 5) | interface Product {

FILE: Solution/Lab1/client/Application/src/app/views/products/product.service.ts
  class ProductService (line 14) | class ProductService {
    method constructor (line 15) | constructor(private http: HttpClient) {}
    method fetch (line 18) | fetch(): Observable<Product[]> {
    method get (line 22) | get(productId: string): Observable<Product> {
    method delete (line 27) | delete(product: Product) {
    method put (line 32) | put(product: Product) {
    method post (line 37) | post(product: Product) {

FILE: Solution/Lab1/client/Application/src/app/views/products/products-routing.module.ts
  class ProductsRoutingModule (line 44) | class ProductsRoutingModule {}

FILE: Solution/Lab1/client/Application/src/app/views/products/products.module.ts
  class ProductsModule (line 48) | class ProductsModule {}

FILE: Solution/Lab1/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, orderId, orderName, orderProducts):
  class OrderProduct (line 11) | class  OrderProduct:
    method __init__ (line 13) | def __init__(self, productId, price, quantity):

FILE: Solution/Lab1/server/OrderService/order_service.py
  function get_order (line 12) | def get_order(event, context):
  function create_order (line 22) | def create_order(event, context):
  function update_order (line 29) | def update_order(event, context):
  function delete_order (line 38) | def delete_order(event, context):
  function get_orders (line 46) | def get_orders(event, context):

FILE: Solution/Lab1/server/OrderService/order_service_dal.py
  function get_order (line 19) | def get_order(event, orderId):
  function delete_order (line 32) | def delete_order(event, orderId):
  function create_order (line 44) | def create_order(event, payload):
  function update_order (line 61) | def update_order(event, payload, orderId):
  function get_orders (line 80) | def get_orders(event):
  function get_order_products_dict (line 97) | def get_order_products_dict(orderProducts):

FILE: Solution/Lab1/server/ProductService/product_models.py
  class Product (line 4) | class Product:
    method __init__ (line 6) | def __init__(self, productId, sku, name, price, category):
  class Category (line 13) | class Category:
    method __init__ (line 14) | def __init__(self, id, name):

FILE: Solution/Lab1/server/ProductService/product_service.py
  function get_product (line 11) | def get_product(event, context):
  function create_product (line 19) | def create_product(event, context):
  function update_product (line 27) | def update_product(event, context):
  function delete_product (line 36) | def delete_product(event, context):
  function get_products (line 44) | def get_products(event, context):

FILE: Solution/Lab1/server/ProductService/product_service_dal.py
  function get_product (line 19) | def get_product(event, productId):
  function delete_product (line 31) | def delete_product(event, productId):
  function create_product (line 42) | def create_product(event, payload):
  function update_product (line 63) | def update_product(event, payload, productId):
  function get_products (line 84) | def get_products(event):

FILE: Solution/Lab1/server/layers/logger.py
  function info (line 9) | def info(log_message):
  function error (line 14) | def error(log_message):

FILE: Solution/Lab1/server/layers/utils.py
  class StatusCodes (line 11) | class StatusCodes(Enum):
  function create_success_response (line 16) | def create_success_response(message):
  function generate_response (line 29) | def generate_response(inputObject):
  function encode_to_json_object (line 40) | def  encode_to_json_object(inputObject):

FILE: Solution/Lab2/client/Admin/src/app/app-routing.module.ts
  class AppRoutingModule (line 48) | class AppRoutingModule {}

FILE: Solution/Lab2/client/Admin/src/app/app.component.ts
  class AppComponent (line 18) | class AppComponent {
    method constructor (line 19) | constructor(

FILE: Solution/Lab2/client/Admin/src/app/app.module.ts
  class AppModule (line 58) | class AppModule {}

FILE: Solution/Lab2/client/Admin/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Solution/Lab2/client/Admin/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Solution/Lab2/client/Admin/src/app/nav/nav.component.ts
  class NavComponent (line 22) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 52) | ngOnInit(): void {

FILE: Solution/Lab2/client/Admin/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Solution/Lab2/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Solution/Lab2/client/Admin/src/app/views/dashboard/dashboard.component.ts
  type DataSet (line 9) | interface DataSet {
  type ChartData (line 13) | interface ChartData {
  class DashboardComponent (line 24) | class DashboardComponent implements OnInit {
    method constructor (line 25) | constructor(private tenantSvc: TenantsService) {}
    method random (line 132) | public random(min: number, max: number) {
    method ngOnInit (line 136) | ngOnInit(): void {

FILE: Solution/Lab2/client/Admin/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Solution/Lab2/client/Admin/src/app/views/tenants/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 29) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 31) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 37) | submit() {

FILE: Solution/Lab2/client/Admin/src/app/views/tenants/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 22) | constructor(private tenantSvc: TenantsService) {}
    method ngOnInit (line 24) | ngOnInit(): void {

FILE: Solution/Lab2/client/Admin/src/app/views/tenants/models/tenant.ts
  type Tenant (line 1) | interface Tenant {

FILE: Solution/Lab2/client/Admin/src/app/views/tenants/tenants-routing.module.ts
  class TenantsRoutingModule (line 37) | class TenantsRoutingModule {}

FILE: Solution/Lab2/client/Admin/src/app/views/tenants/tenants.module.ts
  class TenantsModule (line 51) | class TenantsModule {}

FILE: Solution/Lab2/client/Admin/src/app/views/tenants/tenants.service.ts
  class TenantsService (line 15) | class TenantsService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 22) | fetch(): Observable<Tenant[]> {
    method post (line 26) | post(tenant: Tenant): Observable<Tenant[]> {

FILE: Solution/Lab2/client/Admin/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 33) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 35) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 41) | onSubmit() {

FILE: Solution/Lab2/client/Admin/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Solution/Lab2/client/Admin/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Solution/Lab2/client/Admin/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Solution/Lab2/client/Admin/src/app/views/users/users.module.ts
  class UsersModule (line 49) | class UsersModule {}

FILE: Solution/Lab2/client/Admin/src/app/views/users/users.service.ts
  class UsersService (line 26) | class UsersService {
    method constructor (line 29) | constructor(private http: HttpClient) {
    method fetch (line 33) | fetch(): Observable<User[]> {
    method create (line 37) | create(user: User): Observable<User> {

FILE: Solution/Lab2/client/Landing/src/app/app-routing.module.ts
  class AppRoutingModule (line 31) | class AppRoutingModule {}

FILE: Solution/Lab2/client/Landing/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Solution/Lab2/client/Landing/src/app/app.module.ts
  class AppModule (line 53) | class AppModule {}

FILE: Solution/Lab2/client/Landing/src/app/views/landing/landing.component.ts
  class LandingComponent (line 25) | class LandingComponent implements OnInit {
    method constructor (line 26) | constructor(private router: Router) {}
    method ngOnInit (line 28) | ngOnInit() {}
    method register (line 30) | register() {

FILE: Solution/Lab2/client/Landing/src/app/views/register/register.component.ts
  class RegisterComponent (line 12) | class RegisterComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 28) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 30) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 36) | submit() {

FILE: Solution/Lab2/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, orderId, orderName, orderProducts):
  class OrderProduct (line 11) | class  OrderProduct:
    method __init__ (line 13) | def __init__(self, productId, price, quantity):

FILE: Solution/Lab2/server/OrderService/order_service.py
  function get_order (line 12) | def get_order(event, context):
  function create_order (line 22) | def create_order(event, context):
  function update_order (line 29) | def update_order(event, context):
  function delete_order (line 38) | def delete_order(event, context):
  function get_orders (line 46) | def get_orders(event, context):

FILE: Solution/Lab2/server/OrderService/order_service_dal.py
  function get_order (line 19) | def get_order(event, orderId):
  function delete_order (line 32) | def delete_order(event, orderId):
  function create_order (line 44) | def create_order(event, payload):
  function update_order (line 61) | def update_order(event, payload, orderId):
  function get_orders (line 80) | def get_orders(event):
  function get_order_products_dict (line 97) | def get_order_products_dict(orderProducts):

FILE: Solution/Lab2/server/ProductService/product_models.py
  class Product (line 4) | class Product:
    method __init__ (line 6) | def __init__(self, productId, sku, name, price, category):
  class Category (line 13) | class Category:
    method __init__ (line 14) | def __init__(self, id, name):

FILE: Solution/Lab2/server/ProductService/product_service.py
  function get_product (line 11) | def get_product(event, context):
  function create_product (line 19) | def create_product(event, context):
  function update_product (line 27) | def update_product(event, context):
  function delete_product (line 36) | def delete_product(event, context):
  function get_products (line 44) | def get_products(event, context):

FILE: Solution/Lab2/server/ProductService/product_service_dal.py
  function get_product (line 19) | def get_product(event, productId):
  function delete_product (line 31) | def delete_product(event, productId):
  function create_product (line 42) | def create_product(event, payload):
  function update_product (line 63) | def update_product(event, payload, productId):
  function get_products (line 84) | def get_products(event):

FILE: Solution/Lab2/server/Resources/shared_service_authorizer.py
  function lambda_handler (line 22) | def lambda_handler(event, context):
  function validateJWT (line 79) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 120) | class HttpVerb:
  class AuthPolicy (line 130) | class AuthPolicy(object):
    method __init__ (line 155) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 161) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 193) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 204) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 225) | def allowAllMethods(self):
    method denyAllMethods (line 229) | def denyAllMethods(self):
    method allowMethod (line 233) | def allowMethod(self, verb, resource):
    method denyMethod (line 238) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 243) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 249) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 255) | def build(self):

FILE: Solution/Lab2/server/TenantManagementService/tenant-management.py
  function create_tenant (line 20) | def create_tenant(event, context):
  function get_tenants (line 41) | def get_tenants(event, context):
  function update_tenant (line 50) | def update_tenant(event, context):
  function get_tenant (line 78) | def get_tenant(event, context):
  function deactivate_tenant (line 100) | def deactivate_tenant(event, context):
  function activate_tenant (line 131) | def activate_tenant(event, context):
  function __invoke_disable_users (line 162) | def __invoke_disable_users(headers, auth, host, stage_name, invoke_url, ...
  function __invoke_enable_users (line 177) | def __invoke_enable_users(headers, auth, host, stage_name, invoke_url, t...
  class TenantInfo (line 192) | class TenantInfo:
    method __init__ (line 193) | def __init__(self, tenant_name, tenant_address, tenant_email, tenant_p...

FILE: Solution/Lab2/server/TenantManagementService/tenant-registration.py
  function register_tenant (line 19) | def register_tenant(event, context):
  function __create_tenant_admin_user (line 46) | def __create_tenant_admin_user(tenant_details, headers, auth, host, stag...
  function __create_tenant (line 58) | def __create_tenant(tenant_details, headers, auth, host, stage_name):

FILE: Solution/Lab2/server/TenantManagementService/user-management.py
  function create_tenant_admin_user (line 19) | def create_tenant_admin_user(event, context):
  function create_user (line 43) | def create_user(event, context):
  function get_users (line 84) | def get_users(event, context):
  function get_user (line 117) | def get_user(event, context):
  function update_user (line 126) | def update_user(event, context):
  function disable_user (line 152) | def disable_user(event, context):
  function disable_users_by_tenant (line 167) | def disable_users_by_tenant(event, context):
  function enable_users_by_tenant (line 189) | def enable_users_by_tenant(event, context):
  function get_user_info (line 209) | def get_user_info(user_pool_id, user_name):
  class UserManagement (line 227) | class UserManagement:
    method create_user_group (line 228) | def create_user_group(self, user_pool_id, group_name, group_description):
    method create_tenant_admin (line 237) | def create_tenant_admin(self, user_pool_id, tenant_admin_user_name, us...
    method add_user_to_group (line 263) | def add_user_to_group(self, user_pool_id, user_name, group_name):
    method create_user_tenant_mapping (line 271) | def create_user_tenant_mapping(self, user_name, tenant_id):
  class UserInfo (line 282) | class UserInfo:
    method __init__ (line 283) | def __init__(self, user_name=None, tenant_id=None, user_role=None,

FILE: Solution/Lab2/server/layers/logger.py
  function info (line 9) | def info(log_message):
  function error (line 14) | def error(log_message):

FILE: Solution/Lab2/server/layers/utils.py
  class StatusCodes (line 12) | class StatusCodes(Enum):
  function create_success_response (line 17) | def create_success_response(message):
  function generate_response (line 30) | def generate_response(inputObject):
  function encode_to_json_object (line 41) | def  encode_to_json_object(inputObject):
  function get_auth (line 47) | def get_auth(host, region):
  function get_headers (line 58) | def get_headers(event):

FILE: Solution/Lab3/client/Admin/src/app/app-routing.module.ts
  class AppRoutingModule (line 48) | class AppRoutingModule {}

FILE: Solution/Lab3/client/Admin/src/app/app.component.ts
  class AppComponent (line 18) | class AppComponent {
    method constructor (line 19) | constructor(

FILE: Solution/Lab3/client/Admin/src/app/app.module.ts
  class AppModule (line 58) | class AppModule {}

FILE: Solution/Lab3/client/Admin/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Solution/Lab3/client/Admin/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Solution/Lab3/client/Admin/src/app/nav/nav.component.ts
  class NavComponent (line 22) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 52) | ngOnInit(): void {

FILE: Solution/Lab3/client/Admin/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Solution/Lab3/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Solution/Lab3/client/Admin/src/app/views/dashboard/dashboard.component.ts
  type DataSet (line 9) | interface DataSet {
  type ChartData (line 13) | interface ChartData {
  class DashboardComponent (line 24) | class DashboardComponent implements OnInit {
    method constructor (line 25) | constructor(private tenantSvc: TenantsService) {}
    method random (line 132) | public random(min: number, max: number) {
    method ngOnInit (line 136) | ngOnInit(): void {

FILE: Solution/Lab3/client/Admin/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Solution/Lab3/client/Admin/src/app/views/tenants/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 29) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 31) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 37) | submit() {

FILE: Solution/Lab3/client/Admin/src/app/views/tenants/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 22) | constructor(private tenantSvc: TenantsService) {}
    method ngOnInit (line 24) | ngOnInit(): void {

FILE: Solution/Lab3/client/Admin/src/app/views/tenants/models/tenant.ts
  type Tenant (line 1) | interface Tenant {

FILE: Solution/Lab3/client/Admin/src/app/views/tenants/tenants-routing.module.ts
  class TenantsRoutingModule (line 37) | class TenantsRoutingModule {}

FILE: Solution/Lab3/client/Admin/src/app/views/tenants/tenants.module.ts
  class TenantsModule (line 51) | class TenantsModule {}

FILE: Solution/Lab3/client/Admin/src/app/views/tenants/tenants.service.ts
  class TenantsService (line 15) | class TenantsService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 22) | fetch(): Observable<Tenant[]> {
    method post (line 26) | post(tenant: Tenant): Observable<Tenant[]> {

FILE: Solution/Lab3/client/Admin/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 33) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 35) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 41) | onSubmit() {

FILE: Solution/Lab3/client/Admin/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Solution/Lab3/client/Admin/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Solution/Lab3/client/Admin/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Solution/Lab3/client/Admin/src/app/views/users/users.module.ts
  class UsersModule (line 49) | class UsersModule {}

FILE: Solution/Lab3/client/Admin/src/app/views/users/users.service.ts
  class UsersService (line 26) | class UsersService {
    method constructor (line 29) | constructor(private http: HttpClient) {
    method fetch (line 33) | fetch(): Observable<User[]> {
    method create (line 37) | create(user: User): Observable<User> {

FILE: Solution/Lab3/client/Application/cypress.config.ts
  method setupNodeEvents (line 6) | setupNodeEvents(on, config) {

FILE: Solution/Lab3/client/Application/src/app/app-routing.module.ts
  class AppRoutingModule (line 62) | class AppRoutingModule {}

FILE: Solution/Lab3/client/Application/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Solution/Lab3/client/Application/src/app/app.module.ts
  class AppModule (line 86) | class AppModule {}

FILE: Solution/Lab3/client/Application/src/app/cognito.guard.ts
  class CognitoGuard (line 16) | class CognitoGuard implements CanActivate {
    method constructor (line 17) | constructor(
    method canActivate (line 22) | canActivate(

FILE: Solution/Lab3/client/Application/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Solution/Lab3/client/Application/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Solution/Lab3/client/Application/src/app/nav/nav.component.ts
  class NavComponent (line 23) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 54) | ngOnInit(): void {
    method logout (line 85) | async logout() {

FILE: Solution/Lab3/client/Application/src/app/views/auth/auth-configuration.service.ts
  class AuthConfigurationService (line 36) | class AuthConfigurationService {
    method constructor (line 41) | constructor(
    method setTenantConfig (line 47) | public setTenantConfig(tenantName: string): Promise<any> {
    method configureAmplifyAuth (line 69) | configureAmplifyAuth(): boolean {
    method cleanLocalStorage (line 93) | cleanLocalStorage() {

FILE: Solution/Lab3/client/Application/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Solution/Lab3/client/Application/src/app/views/auth/models/config-params.ts
  type ConfigParams (line 17) | interface ConfigParams {

FILE: Solution/Lab3/client/Application/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Solution/Lab3/client/Application/src/app/views/dashboard/dashboard.component.ts
  class DashboardComponent (line 13) | class DashboardComponent {
    method chartClicked (line 48) | public chartClicked({
    method chartHovered (line 56) | public chartHovered({
    method randomize (line 64) | public randomize(): void {
    method constructor (line 99) | constructor(private breakpointObserver: BreakpointObserver) {}

FILE: Solution/Lab3/client/Application/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Solution/Lab3/client/Application/src/app/views/error/404.component.ts
  class P404Component (line 10) | class P404Component {
    method constructor (line 11) | constructor() {}

FILE: Solution/Lab3/client/Application/src/app/views/error/500.component.ts
  class P500Component (line 10) | class P500Component {
    method constructor (line 11) | constructor() {}

FILE: Solution/Lab3/client/Application/src/app/views/error/unauthorized.component.ts
  class UnauthorizedComponent (line 30) | class UnauthorizedComponent implements OnInit {
    method constructor (line 37) | constructor(
    method ngOnInit (line 60) | ngOnInit(): void {
    method isFieldInvalid (line 66) | isFieldInvalid(field: string) {
    method displayFieldCss (line 73) | displayFieldCss(field: string) {
    method hasRequiredError (line 79) | hasRequiredError(field: string) {
    method openErrorMessageSnackBar (line 83) | openErrorMessageSnackBar(errorMessage: string) {
    method login (line 89) | login() {

FILE: Solution/Lab3/client/Application/src/app/views/orders/create/create.component.ts
  type LineItem (line 9) | interface LineItem {
  class CreateComponent (line 18) | class CreateComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 35) | ngOnInit(): void {
    method name (line 45) | get name() {
    method productQuantity (line 49) | get productQuantity() {
    method add (line 55) | add(op: LineItem) {
    method remove (line 70) | remove(op: LineItem) {
    method submit (line 88) | submit() {

FILE: Solution/Lab3/client/Application/src/app/views/orders/detail/detail.component.ts
  class DetailComponent (line 17) | class DetailComponent implements OnInit {
    method constructor (line 22) | constructor(private route: ActivatedRoute, private orderSvc: OrdersSer...
    method ngOnInit (line 24) | ngOnInit(): void {
    method today (line 30) | today() {
    method tenantName (line 34) | tenantName() {
    method sum (line 38) | sum(op: OrderProduct) {
    method tax (line 42) | tax(op: OrderProduct) {
    method total (line 46) | total(op: OrderProduct) {
    method subTotal (line 50) | subTotal(order: Order) {
    method calcTax (line 56) | calcTax(order: Order) {
    method final (line 60) | final(order: Order) {

FILE: Solution/Lab3/client/Application/src/app/views/orders/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 15) | constructor(private orderSvc: OrdersService, private router: Router) {}
    method ngOnInit (line 17) | ngOnInit(): void {
    method sum (line 24) | sum(order: Order): number {

FILE: Solution/Lab3/client/Application/src/app/views/orders/models/order.interface.ts
  type Order (line 7) | interface Order {

FILE: Solution/Lab3/client/Application/src/app/views/orders/models/orderproduct.interface.ts
  type OrderProduct (line 5) | interface OrderProduct {

FILE: Solution/Lab3/client/Application/src/app/views/orders/orders-routing.module.ts
  class OrdersRoutingModule (line 44) | class OrdersRoutingModule {}

FILE: Solution/Lab3/client/Application/src/app/views/orders/orders.module.ts
  class OrdersModule (line 51) | class OrdersModule {}

FILE: Solution/Lab3/client/Application/src/app/views/orders/orders.service.ts
  class OrdersService (line 13) | class OrdersService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 18) | fetch(): Observable<Order[]> {
    method get (line 22) | get(orderId: string): Observable<Order> {
    method create (line 27) | create(order: Order): Observable<Order> {

FILE: Solution/Lab3/client/Application/src/app/views/products/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 15) | constructor(
    method ngOnInit (line 23) | ngOnInit(): void {
    method name (line 32) | get name() {
    method price (line 36) | get price() {
    method submit (line 40) | submit() {
    method cancel (line 50) | cancel() {

FILE: Solution/Lab3/client/Application/src/app/views/products/edit/edit.component.ts
  class EditComponent (line 18) | class EditComponent implements OnInit {
    method constructor (line 25) | constructor(
    method ngOnInit (line 34) | ngOnInit(): void {
    method name (line 57) | get name() {
    method price (line 61) | get price() {
    method submit (line 65) | submit() {
    method delete (line 72) | delete() {
    method cancel (line 82) | cancel() {

FILE: Solution/Lab3/client/Application/src/app/views/products/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 16) | constructor(private productSvc: ProductService, private router: Router...
    method ngOnInit (line 18) | ngOnInit(): void {
    method onEdit (line 25) | onEdit(product: Product) {
    method onRemove (line 30) | onRemove(product: Product) {
    method onCreate (line 39) | onCreate() {

FILE: Solution/Lab3/client/Application/src/app/views/products/models/product.interface.ts
  type Product (line 5) | interface Product {

FILE: Solution/Lab3/client/Application/src/app/views/products/product.service.ts
  class ProductService (line 13) | class ProductService {
    method constructor (line 14) | constructor(private http: HttpClient) {}
    method fetch (line 17) | fetch(): Observable<Product[]> {
    method get (line 21) | get(productId: string): Observable<Product> {
    method delete (line 26) | delete(product: Product) {
    method put (line 31) | put(product: Product) {
    method post (line 36) | post(product: Product) {

FILE: Solution/Lab3/client/Application/src/app/views/products/products-routing.module.ts
  class ProductsRoutingModule (line 44) | class ProductsRoutingModule {}

FILE: Solution/Lab3/client/Application/src/app/views/products/products.module.ts
  class ProductsModule (line 48) | class ProductsModule {}

FILE: Solution/Lab3/client/Application/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 32) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 34) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 40) | onSubmit() {

FILE: Solution/Lab3/client/Application/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Solution/Lab3/client/Application/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Solution/Lab3/client/Application/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Solution/Lab3/client/Application/src/app/views/users/users.module.ts
  class UsersModule (line 50) | class UsersModule {}

FILE: Solution/Lab3/client/Application/src/app/views/users/users.service.ts
  class UsersService (line 27) | class UsersService {
    method constructor (line 30) | constructor(private http: HttpClient) {
    method fetch (line 34) | fetch(): Observable<User[]> {
    method create (line 38) | create(user: User): Observable<User> {
    method update (line 42) | update(email: string, user: User) {}

FILE: Solution/Lab3/client/Landing/src/app/app-routing.module.ts
  class AppRoutingModule (line 31) | class AppRoutingModule {}

FILE: Solution/Lab3/client/Landing/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Solution/Lab3/client/Landing/src/app/app.module.ts
  class AppModule (line 53) | class AppModule {}

FILE: Solution/Lab3/client/Landing/src/app/views/landing/landing.component.ts
  class LandingComponent (line 25) | class LandingComponent implements OnInit {
    method constructor (line 26) | constructor(private router: Router) {}
    method ngOnInit (line 28) | ngOnInit() {}
    method register (line 30) | register() {

FILE: Solution/Lab3/client/Landing/src/app/views/register/register.component.ts
  class RegisterComponent (line 12) | class RegisterComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 28) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 30) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 36) | submit() {

FILE: Solution/Lab3/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, shardId, orderId, orderName, orderProducts):
  class OrderProduct (line 13) | class  OrderProduct:
    method __init__ (line 15) | def __init__(self, productId, price, quantity):

FILE: Solution/Lab3/server/OrderService/order_service.py
  function get_order (line 15) | def get_order(event, context):
  function create_order (line 30) | def create_order(event, context):
  function update_order (line 42) | def update_order(event, context):
  function delete_order (line 56) | def delete_order(event, context):
  function get_orders (line 69) | def get_orders(event, context):

FILE: Solution/Lab3/server/OrderService/order_service_dal.py
  function get_order (line 27) | def get_order(event, key):
  function delete_order (line 46) | def delete_order(event, key):
  function create_order (line 62) | def create_order(event, payload):
  function update_order (line 85) | def update_order(event, payload, key):
  function get_orders (line 111) | def get_orders(event, tenantId):
  function __query_all_partitions (line 123) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 139) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...
  function get_order_products_dict (line 150) | def get_order_products_dict(orderProducts):

FILE: Solution/Lab3/server/ProductService/product_models.py
  class Product (line 4) | class Product:
    method __init__ (line 6) | def __init__(self, shardId, productId, sku, name, price, category):
  class Category (line 15) | class Category:
    method __init__ (line 16) | def __init__(self, id, name):

FILE: Solution/Lab3/server/ProductService/product_service.py
  function get_product (line 15) | def get_product(event, context):
  function create_product (line 31) | def create_product(event, context):
  function update_product (line 43) | def update_product(event, context):
  function delete_product (line 57) | def delete_product(event, context):
  function get_products (line 70) | def get_products(event, context):

FILE: Solution/Lab3/server/ProductService/product_service_dal.py
  function get_product (line 27) | def get_product(event, key):
  function delete_product (line 45) | def delete_product(event, key):
  function create_product (line 60) | def create_product(event, payload):
  function update_product (line 90) | def update_product(event, payload, key):
  function get_products (line 119) | def get_products(event, tenantId):
  function __query_all_partitions (line 130) | def __query_all_partitions(tenantId,get_all_products_response, table, ev...
  function __get_tenant_data (line 146) | def __get_tenant_data(partition_id, get_all_products_response, table, ev...

FILE: Solution/Lab3/server/Resources/shared_service_authorizer.py
  function lambda_handler (line 25) | def lambda_handler(event, context):
  function validateJWT (line 99) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 140) | class HttpVerb:
  class AuthPolicy (line 150) | class AuthPolicy(object):
    method __init__ (line 175) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 181) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 213) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 224) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 245) | def allowAllMethods(self):
    method denyAllMethods (line 249) | def denyAllMethods(self):
    method allowMethod (line 253) | def allowMethod(self, verb, resource):
    method denyMethod (line 258) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 263) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 269) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 275) | def build(self):

FILE: Solution/Lab3/server/Resources/tenant_authorizer.py
  function lambda_handler (line 21) | def lambda_handler(event, context):
  function validateJWT (line 74) | def validateJWT(token, app_client_id, keys):
  class HttpVerb (line 115) | class HttpVerb:
  class AuthPolicy (line 125) | class AuthPolicy(object):
    method __init__ (line 150) | def __init__(self, principal, awsAccountId):
    method _addMethod (line 156) | def _addMethod(self, effect, verb, resource, conditions):
    method _getEmptyStatement (line 188) | def _getEmptyStatement(self, effect):
    method _getStatementForEffect (line 199) | def _getStatementForEffect(self, effect, methods):
    method allowAllMethods (line 220) | def allowAllMethods(self):
    method denyAllMethods (line 224) | def denyAllMethods(self):
    method allowMethod (line 228) | def allowMethod(self, verb, resource):
    method denyMethod (line 233) | def denyMethod(self, verb, resource):
    method allowMethodWithConditions (line 238) | def allowMethodWithConditions(self, verb, resource, conditions):
    method denyMethodWithConditions (line 244) | def denyMethodWithConditions(self, verb, resource, conditions):
    method build (line 250) | def build(self):

FILE: Solution/Lab3/server/TenantManagementService/tenant-management.py
  function create_tenant (line 25) | def create_tenant(event, context):
  function get_tenants (line 46) | def get_tenants(event, context):
  function update_tenant (line 56) | def update_tenant(event, context):
  function get_tenant (line 95) | def get_tenant(event, context):
  function deactivate_tenant (line 127) | def deactivate_tenant(event, context):
  function activate_tenant (line 170) | def activate_tenant(event, context):
  function __invoke_disable_users (line 212) | def __invoke_disable_users(update_details, headers, auth, host, stage_na...
  function __invoke_enable_users (line 227) | def __invoke_enable_users(update_details, headers, auth, host, stage_nam...
  class TenantInfo (line 242) | class TenantInfo:
    method __init__ (line 243) | def __init__(self, tenant_name, tenant_address, tenant_email, tenant_p...

FILE: Solution/Lab3/server/TenantManagementService/tenant-registration.py
  function register_tenant (line 19) | def register_tenant(event, context):
  function __create_tenant_admin_user (line 46) | def __create_tenant_admin_user(tenant_details, headers, auth, host, stag...
  function __create_tenant (line 58) | def __create_tenant(tenant_details, headers, auth, host, stage_name):

FILE: Solution/Lab3/server/TenantManagementService/user-management.py
  function create_tenant_admin_user (line 23) | def create_tenant_admin_user(event, context):
  function create_user (line 47) | def create_user(event, context):
  function get_users (line 101) | def get_users(event, context):
  function get_user (line 145) | def get_user(event, context):
  function update_user (line 165) | def update_user(event, context):
  function disable_user (line 204) | def disable_user(event, context):
  function disable_users_by_tenant (line 230) | def disable_users_by_tenant(event, context):
  function enable_users_by_tenant (line 259) | def enable_users_by_tenant(event, context):
  function get_user_info (line 286) | def get_user_info(event, user_pool_id, user_name):
  class UserManagement (line 306) | class UserManagement:
    method create_user_group (line 307) | def create_user_group(self, user_pool_id, group_name, group_description):
    method create_tenant_admin (line 316) | def create_tenant_admin(self, user_pool_id, tenant_admin_user_name, us...
    method add_user_to_group (line 342) | def add_user_to_group(self, user_pool_id, user_name, group_name):
    method create_user_tenant_mapping (line 350) | def create_user_tenant_mapping(self, user_name, tenant_id):
  class UserInfo (line 361) | class UserInfo:
    method __init__ (line 362) | def __init__(self, user_name=None, tenant_id=None, user_role=None,

FILE: Solution/Lab3/server/layers/auth_manager.py
  class UserRoles (line 8) | class UserRoles:
  function isTenantAdmin (line 14) | def isTenantAdmin(user_role):
  function isSystemAdmin (line 20) | def isSystemAdmin(user_role):
  function isSaaSProvider (line 27) | def isSaaSProvider(user_role):
  function isTenantUser (line 32) | def isTenantUser(user_role):

FILE: Solution/Lab3/server/layers/logger.py
  function info (line 9) | def info(log_message):
  function error (line 14) | def error(log_message):
  function log_with_tenant_context (line 17) | def log_with_tenant_context(event, log_message):

FILE: Solution/Lab3/server/layers/metrics_manager.py
  function record_metric (line 10) | def record_metric(event, metric_name, metric_unit, metric_value):

FILE: Solution/Lab3/server/layers/utils.py
  class StatusCodes (line 12) | class StatusCodes(Enum):
  function create_success_response (line 17) | def create_success_response(message):
  function create_unauthorized_response (line 30) | def create_unauthorized_response():
  function generate_response (line 43) | def generate_response(inputObject):
  function encode_to_json_object (line 54) | def  encode_to_json_object(inputObject):
  function get_auth (line 60) | def get_auth(host, region):
  function get_headers (line 71) | def get_headers(event):

FILE: Solution/Lab4/client/Admin/src/app/app-routing.module.ts
  class AppRoutingModule (line 48) | class AppRoutingModule {}

FILE: Solution/Lab4/client/Admin/src/app/app.component.ts
  class AppComponent (line 18) | class AppComponent {
    method constructor (line 19) | constructor(

FILE: Solution/Lab4/client/Admin/src/app/app.module.ts
  class AppModule (line 58) | class AppModule {}

FILE: Solution/Lab4/client/Admin/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Solution/Lab4/client/Admin/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Solution/Lab4/client/Admin/src/app/nav/nav.component.ts
  class NavComponent (line 22) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 52) | ngOnInit(): void {

FILE: Solution/Lab4/client/Admin/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Solution/Lab4/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Solution/Lab4/client/Admin/src/app/views/dashboard/dashboard.component.ts
  type DataSet (line 9) | interface DataSet {
  type ChartData (line 13) | interface ChartData {
  class DashboardComponent (line 24) | class DashboardComponent implements OnInit {
    method constructor (line 25) | constructor(private tenantSvc: TenantsService) {}
    method random (line 132) | public random(min: number, max: number) {
    method ngOnInit (line 136) | ngOnInit(): void {

FILE: Solution/Lab4/client/Admin/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Solution/Lab4/client/Admin/src/app/views/tenants/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 29) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 31) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 37) | submit() {

FILE: Solution/Lab4/client/Admin/src/app/views/tenants/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 22) | constructor(private tenantSvc: TenantsService) {}
    method ngOnInit (line 24) | ngOnInit(): void {

FILE: Solution/Lab4/client/Admin/src/app/views/tenants/models/tenant.ts
  type Tenant (line 1) | interface Tenant {

FILE: Solution/Lab4/client/Admin/src/app/views/tenants/tenants-routing.module.ts
  class TenantsRoutingModule (line 37) | class TenantsRoutingModule {}

FILE: Solution/Lab4/client/Admin/src/app/views/tenants/tenants.module.ts
  class TenantsModule (line 51) | class TenantsModule {}

FILE: Solution/Lab4/client/Admin/src/app/views/tenants/tenants.service.ts
  class TenantsService (line 15) | class TenantsService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 22) | fetch(): Observable<Tenant[]> {
    method post (line 26) | post(tenant: Tenant): Observable<Tenant[]> {

FILE: Solution/Lab4/client/Admin/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 33) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 35) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 41) | onSubmit() {

FILE: Solution/Lab4/client/Admin/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Solution/Lab4/client/Admin/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Solution/Lab4/client/Admin/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Solution/Lab4/client/Admin/src/app/views/users/users.module.ts
  class UsersModule (line 49) | class UsersModule {}

FILE: Solution/Lab4/client/Admin/src/app/views/users/users.service.ts
  class UsersService (line 26) | class UsersService {
    method constructor (line 29) | constructor(private http: HttpClient) {
    method fetch (line 33) | fetch(): Observable<User[]> {
    method create (line 37) | create(user: User): Observable<User> {

FILE: Solution/Lab4/client/Application/cypress.config.ts
  method setupNodeEvents (line 6) | setupNodeEvents(on, config) {

FILE: Solution/Lab4/client/Application/src/app/app-routing.module.ts
  class AppRoutingModule (line 62) | class AppRoutingModule {}

FILE: Solution/Lab4/client/Application/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Solution/Lab4/client/Application/src/app/app.module.ts
  class AppModule (line 87) | class AppModule {}

FILE: Solution/Lab4/client/Application/src/app/cognito.guard.ts
  class CognitoGuard (line 16) | class CognitoGuard implements CanActivate {
    method constructor (line 17) | constructor(
    method canActivate (line 22) | canActivate(

FILE: Solution/Lab4/client/Application/src/app/interceptors/auth.interceptor.ts
  class AuthInterceptor (line 17) | class AuthInterceptor implements HttpInterceptor {
    method constructor (line 18) | constructor() {}
    method intercept (line 21) | intercept(

FILE: Solution/Lab4/client/Application/src/app/models/interfaces.ts
  type INavData (line 1) | interface INavData {

FILE: Solution/Lab4/client/Application/src/app/nav/nav.component.ts
  class NavComponent (line 23) | class NavComponent implements OnInit {
    method constructor (line 36) | constructor(
    method ngOnInit (line 54) | ngOnInit(): void {
    method logout (line 85) | async logout() {

FILE: Solution/Lab4/client/Application/src/app/views/auth/auth-configuration.service.ts
  class AuthConfigurationService (line 36) | class AuthConfigurationService {
    method constructor (line 41) | constructor(
    method setTenantConfig (line 47) | public setTenantConfig(tenantName: string): Promise<any> {
    method configureAmplifyAuth (line 69) | configureAmplifyAuth(): boolean {
    method cleanLocalStorage (line 93) | cleanLocalStorage() {

FILE: Solution/Lab4/client/Application/src/app/views/auth/auth.component.ts
  class AuthComponent (line 11) | class AuthComponent implements OnInit {
    method constructor (line 20) | constructor() {}
    method ngOnInit (line 22) | ngOnInit(): void {
    method logout (line 33) | async logout() {

FILE: Solution/Lab4/client/Application/src/app/views/auth/models/config-params.ts
  type ConfigParams (line 17) | interface ConfigParams {

FILE: Solution/Lab4/client/Application/src/app/views/dashboard/dashboard-routing.module.ts
  class DashboardRoutingModule (line 24) | class DashboardRoutingModule {}

FILE: Solution/Lab4/client/Application/src/app/views/dashboard/dashboard.component.ts
  class DashboardComponent (line 13) | class DashboardComponent {
    method chartClicked (line 48) | public chartClicked({
    method chartHovered (line 56) | public chartHovered({
    method randomize (line 64) | public randomize(): void {
    method constructor (line 99) | constructor(private breakpointObserver: BreakpointObserver) {}

FILE: Solution/Lab4/client/Application/src/app/views/dashboard/dashboard.module.ts
  class DashboardModule (line 29) | class DashboardModule {}

FILE: Solution/Lab4/client/Application/src/app/views/error/404.component.ts
  class P404Component (line 10) | class P404Component {
    method constructor (line 11) | constructor() {}

FILE: Solution/Lab4/client/Application/src/app/views/error/500.component.ts
  class P500Component (line 10) | class P500Component {
    method constructor (line 11) | constructor() {}

FILE: Solution/Lab4/client/Application/src/app/views/error/unauthorized.component.ts
  class UnauthorizedComponent (line 30) | class UnauthorizedComponent implements OnInit {
    method constructor (line 37) | constructor(
    method ngOnInit (line 60) | ngOnInit(): void {
    method isFieldInvalid (line 66) | isFieldInvalid(field: string) {
    method displayFieldCss (line 73) | displayFieldCss(field: string) {
    method hasRequiredError (line 79) | hasRequiredError(field: string) {
    method openErrorMessageSnackBar (line 83) | openErrorMessageSnackBar(errorMessage: string) {
    method login (line 89) | login() {

FILE: Solution/Lab4/client/Application/src/app/views/orders/create/create.component.ts
  type LineItem (line 9) | interface LineItem {
  class CreateComponent (line 18) | class CreateComponent implements OnInit {
    method constructor (line 24) | constructor(
    method ngOnInit (line 35) | ngOnInit(): void {
    method name (line 45) | get name() {
    method productQuantity (line 49) | get productQuantity() {
    method add (line 55) | add(op: LineItem) {
    method remove (line 70) | remove(op: LineItem) {
    method submit (line 88) | submit() {

FILE: Solution/Lab4/client/Application/src/app/views/orders/detail/detail.component.ts
  class DetailComponent (line 17) | class DetailComponent implements OnInit {
    method constructor (line 22) | constructor(private route: ActivatedRoute, private orderSvc: OrdersSer...
    method ngOnInit (line 24) | ngOnInit(): void {
    method today (line 30) | today() {
    method tenantName (line 34) | tenantName() {
    method sum (line 38) | sum(op: OrderProduct) {
    method tax (line 42) | tax(op: OrderProduct) {
    method total (line 46) | total(op: OrderProduct) {
    method subTotal (line 50) | subTotal(order: Order) {
    method calcTax (line 56) | calcTax(order: Order) {
    method final (line 60) | final(order: Order) {

FILE: Solution/Lab4/client/Application/src/app/views/orders/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 15) | constructor(private orderSvc: OrdersService, private router: Router) {}
    method ngOnInit (line 17) | ngOnInit(): void {
    method sum (line 24) | sum(order: Order): number {

FILE: Solution/Lab4/client/Application/src/app/views/orders/models/order.interface.ts
  type Order (line 7) | interface Order {

FILE: Solution/Lab4/client/Application/src/app/views/orders/models/orderproduct.interface.ts
  type OrderProduct (line 5) | interface OrderProduct {

FILE: Solution/Lab4/client/Application/src/app/views/orders/orders-routing.module.ts
  class OrdersRoutingModule (line 44) | class OrdersRoutingModule {}

FILE: Solution/Lab4/client/Application/src/app/views/orders/orders.module.ts
  class OrdersModule (line 51) | class OrdersModule {}

FILE: Solution/Lab4/client/Application/src/app/views/orders/orders.service.ts
  class OrdersService (line 13) | class OrdersService {
    method constructor (line 16) | constructor(private http: HttpClient) {}
    method fetch (line 18) | fetch(): Observable<Order[]> {
    method get (line 22) | get(orderId: string): Observable<Order> {
    method create (line 27) | create(order: Order): Observable<Order> {

FILE: Solution/Lab4/client/Application/src/app/views/products/create/create.component.ts
  class CreateComponent (line 12) | class CreateComponent implements OnInit {
    method constructor (line 15) | constructor(
    method ngOnInit (line 23) | ngOnInit(): void {
    method name (line 32) | get name() {
    method price (line 36) | get price() {
    method submit (line 40) | submit() {
    method cancel (line 50) | cancel() {

FILE: Solution/Lab4/client/Application/src/app/views/products/edit/edit.component.ts
  class EditComponent (line 17) | class EditComponent implements OnInit {
    method constructor (line 23) | constructor(
    method ngOnInit (line 30) | ngOnInit(): void {
    method name (line 51) | get name() {
    method price (line 55) | get price() {
    method submit (line 59) | submit() {
    method delete (line 66) | delete() {
    method cancel (line 76) | cancel() {

FILE: Solution/Lab4/client/Application/src/app/views/products/list/list.component.ts
  class ListComponent (line 11) | class ListComponent implements OnInit {
    method constructor (line 16) | constructor(private productSvc: ProductService, private router: Router...
    method ngOnInit (line 18) | ngOnInit(): void {
    method onEdit (line 25) | onEdit(product: Product) {
    method onRemove (line 30) | onRemove(product: Product) {
    method onCreate (line 39) | onCreate() {

FILE: Solution/Lab4/client/Application/src/app/views/products/models/product.interface.ts
  type Product (line 5) | interface Product {

FILE: Solution/Lab4/client/Application/src/app/views/products/product.service.ts
  class ProductService (line 13) | class ProductService {
    method constructor (line 14) | constructor(private http: HttpClient) {}
    method fetch (line 17) | fetch(): Observable<Product[]> {
    method get (line 21) | get(productId: string): Observable<Product> {
    method delete (line 26) | delete(product: Product) {
    method put (line 31) | put(product: Product) {
    method post (line 35) | post(product: Product) {

FILE: Solution/Lab4/client/Application/src/app/views/products/products-routing.module.ts
  class ProductsRoutingModule (line 44) | class ProductsRoutingModule {}

FILE: Solution/Lab4/client/Application/src/app/views/products/products.module.ts
  class ProductsModule (line 48) | class ProductsModule {}

FILE: Solution/Lab4/client/Application/src/app/views/users/create/create.component.ts
  class CreateComponent (line 15) | class CreateComponent implements OnInit {
    method constructor (line 20) | constructor(
    method ngOnInit (line 32) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 34) | openErrorMessageSnackBar(errorMessage: string) {
    method onSubmit (line 40) | onSubmit() {

FILE: Solution/Lab4/client/Application/src/app/views/users/list/list.component.ts
  class ListComponent (line 14) | class ListComponent implements OnInit {
    method constructor (line 25) | constructor(private userSvc: UsersService) {}
    method ngOnInit (line 27) | ngOnInit(): void {

FILE: Solution/Lab4/client/Application/src/app/views/users/models/user.ts
  type User (line 5) | interface User {

FILE: Solution/Lab4/client/Application/src/app/views/users/users-routing.module.ts
  class UsersRoutingModule (line 36) | class UsersRoutingModule {}

FILE: Solution/Lab4/client/Application/src/app/views/users/users.module.ts
  class UsersModule (line 50) | class UsersModule {}

FILE: Solution/Lab4/client/Application/src/app/views/users/users.service.ts
  class UsersService (line 27) | class UsersService {
    method constructor (line 30) | constructor(private http: HttpClient) {
    method fetch (line 34) | fetch(): Observable<User[]> {
    method create (line 38) | create(user: User): Observable<User> {
    method update (line 42) | update(email: string, user: User) {}

FILE: Solution/Lab4/client/Landing/src/app/app-routing.module.ts
  class AppRoutingModule (line 31) | class AppRoutingModule {}

FILE: Solution/Lab4/client/Landing/src/app/app.component.ts
  class AppComponent (line 10) | class AppComponent {
    method constructor (line 11) | constructor(

FILE: Solution/Lab4/client/Landing/src/app/app.module.ts
  class AppModule (line 53) | class AppModule {}

FILE: Solution/Lab4/client/Landing/src/app/views/landing/landing.component.ts
  class LandingComponent (line 25) | class LandingComponent implements OnInit {
    method constructor (line 26) | constructor(private router: Router) {}
    method ngOnInit (line 28) | ngOnInit() {}
    method register (line 30) | register() {

FILE: Solution/Lab4/client/Landing/src/app/views/register/register.component.ts
  class RegisterComponent (line 12) | class RegisterComponent implements OnInit {
    method constructor (line 22) | constructor(
    method ngOnInit (line 28) | ngOnInit(): void {}
    method openErrorMessageSnackBar (line 30) | openErrorMessageSnackBar(errorMessage: string) {
    method submit (line 36) | submit() {

FILE: Solution/Lab4/server/OrderService/order_models.py
  class Order (line 4) | class Order:
    method __init__ (line 6) | def __init__(self, shar
Condensed preview — 2379 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,023K chars).
[
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 308,
    "preview": "## Code of Conduct\nThis project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-condu"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3159,
    "preview": "# Contributing Guidelines\n\nThank you for your interest in contributing to our project. Whether it's a bug report, new fe"
  },
  {
    "path": "Cloud9Setup/.gitignore",
    "chars": 43,
    "preview": ".aws-sam/\n.pytest_cache/\n.DS_Store\n.vscode/"
  },
  {
    "path": "Cloud9Setup/README.md",
    "chars": 82,
    "preview": "# Setup Cloud9\nsam build -t prereq-sam-template.yaml --use-container\nsam deploy\n\n\n"
  },
  {
    "path": "Cloud9Setup/increase-disk-size.sh",
    "chars": 1803,
    "preview": "#!/bin/bash\n\n# Specify the desired volume size in GiB as a command line argument. If not specified, default to 50 GiB.\nS"
  },
  {
    "path": "Cloud9Setup/pre-requisites-versions-check.sh",
    "chars": 4817,
    "preview": "#!/bin/bash\nSUMMARY=\"Make sure all the pre-requisites checks PASS\"$'\\n'\ncheck_version() {\n  retval=0  \n  MIN_VERSION=$1\n"
  },
  {
    "path": "Cloud9Setup/pre-requisites.sh",
    "chars": 1933,
    "preview": "#!/bin/bash -x\n\n#Installing NVM\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | sudo -u ec2-u"
  },
  {
    "path": "Cloud9Setup/samconfig.toml",
    "chars": 328,
    "preview": "version = 0.1\n[default]\n[default.deploy]\n[default.deploy.parameters]\nstack_name = \"serverless-saas-init-environment\"\ns3_"
  },
  {
    "path": "LICENSE",
    "chars": 14825,
    "preview": "Creative Commons Attribution-ShareAlike 4.0 International Public License\n\nBy exercising the Licensed Rights (defined bel"
  },
  {
    "path": "LICENSE-SAMPLECODE",
    "chars": 931,
    "preview": "Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n\nPermission is hereby granted, free of charge, t"
  },
  {
    "path": "LICENSE-SUMMARY",
    "chars": 328,
    "preview": "Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. \n\nThe documentation is made available under the "
  },
  {
    "path": "Lab1/client/Application/.browserslistrc",
    "chars": 600,
    "preview": "# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.\n# For addit"
  },
  {
    "path": "Lab1/client/Application/.editorconfig",
    "chars": 274,
    "preview": "# Editor configuration, see https://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size ="
  },
  {
    "path": "Lab1/client/Application/.gitignore",
    "chars": 1083,
    "preview": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# Compiled output\n/dist\n/tmp\n/out-tsc\n/bazel-"
  },
  {
    "path": "Lab1/client/Application/README.md",
    "chars": 1065,
    "preview": "# Application\n\nThis project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.0.5.\n\n##"
  },
  {
    "path": "Lab1/client/Application/angular.json",
    "chars": 3215,
    "preview": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"cli\": {\n    \"packageManager\": \"y"
  },
  {
    "path": "Lab1/client/Application/karma.conf.js",
    "chars": 1428,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "Lab1/client/Application/package.json",
    "chars": 1289,
    "preview": "{\n  \"name\": \"application\",\n  \"version\": \"0.0.0\",\n  \"scripts\": {\n    \"ng\": \"ng\",\n    \"start\": \"ng serve\",\n    \"build\": \"n"
  },
  {
    "path": "Lab1/client/Application/src/app/_nav.ts",
    "chars": 337,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab1/client/Application/src/app/app-routing.module.ts",
    "chars": 994,
    "preview": "import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { NavComponent "
  },
  {
    "path": "Lab1/client/Application/src/app/app.component.scss",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Lab1/client/Application/src/app/app.component.ts",
    "chars": 596,
    "preview": "import { Component } from '@angular/core';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitiz"
  },
  {
    "path": "Lab1/client/Application/src/app/app.module.ts",
    "chars": 2564,
    "preview": "import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { BrowserAni"
  },
  {
    "path": "Lab1/client/Application/src/app/models/index.ts",
    "chars": 30,
    "preview": "export * from './interfaces';\n"
  },
  {
    "path": "Lab1/client/Application/src/app/models/interfaces.ts",
    "chars": 208,
    "preview": "export interface INavData {\n  name?: string;\n  url?: string | any[];\n  href?: string;\n  icon?: string;\n  title?: boolean"
  },
  {
    "path": "Lab1/client/Application/src/app/nav/nav.component.html",
    "chars": 1147,
    "preview": "<mat-sidenav-container fullscreen>\n  <mat-sidenav\n    [mode]=\"'side'\"\n    #drawer\n    class=\"sidenav\"\n    fixedInViewpor"
  },
  {
    "path": "Lab1/client/Application/src/app/nav/nav.component.scss",
    "chars": 787,
    "preview": ".sidenav {\n  width: 200px;\n  background-color: #2f353a;\n}\n\n.mat-list-item {\n  color: whitesmoke;\n}\n\n.sidebar-icon-contai"
  },
  {
    "path": "Lab1/client/Application/src/app/nav/nav.component.ts",
    "chars": 1305,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'"
  },
  {
    "path": "Lab1/client/Application/src/app/views/dashboard/dashboard-routing.module.ts",
    "chars": 528,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab1/client/Application/src/app/views/dashboard/dashboard.component.html",
    "chars": 1267,
    "preview": "<div class=\"grid-container\">\n  <h1 class=\"mat-h1\">Dashboard</h1>\n  <mat-grid-list cols=\"2\" rowHeight=\"350px\">\n    <mat-g"
  },
  {
    "path": "Lab1/client/Application/src/app/views/dashboard/dashboard.component.scss",
    "chars": 271,
    "preview": ".grid-container {\n  margin: 20px;\n}\n\n.dashboard-card {\n  position: absolute;\n  top: 15px;\n  left: 15px;\n  right: 15px;\n "
  },
  {
    "path": "Lab1/client/Application/src/app/views/dashboard/dashboard.component.ts",
    "chars": 2616,
    "preview": "import { Component, ViewChild } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { Breakpoints, Breakp"
  },
  {
    "path": "Lab1/client/Application/src/app/views/dashboard/dashboard.module.ts",
    "chars": 905,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DashboardComponent } "
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/create/create.component.html",
    "chars": 2734,
    "preview": "<div class=\"order-form container\">\n  <div class=\"row\">\n    <div class=\"col-md-6\">\n      <form [formGroup]=\"orderForm\" (s"
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/create/create.component.scss",
    "chars": 438,
    "preview": "// .card {\n//   margin: 20px;\n//   display: flex;\n//   flex-direction: column;\n//   align-items: flex-start;\n// }\n\n.orde"
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/create/create.component.ts",
    "chars": 2788,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n"
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/detail/detail.component.html",
    "chars": 4312,
    "preview": "<div class=\"container invoice\">\n  <div class=\"invoice-header\">\n    <div class=\"row\">\n      <div class=\"col-xs-8\">\n      "
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/detail/detail.component.scss",
    "chars": 1957,
    "preview": "/*\n * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *\n * Permission is hereby granted, free o"
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/detail/detail.component.ts",
    "chars": 1692,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/list/list.component.html",
    "chars": 1722,
    "preview": "<div class=\"order-list\">\n  <h2>Order List</h2>\n  <div class=\"row\">\n    <div class=\"col-md-6\">\n      <table mat-table [da"
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/list/list.component.scss",
    "chars": 96,
    "preview": ".order-list {\n  margin: 20px;\n}\ntable {\n  width: 100%;\n}\n\n.button-panel {\n  margin-top: 20px;\n}\n"
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/list/list.component.ts",
    "chars": 847,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Order } from '../m"
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/models/order.interface.ts",
    "chars": 284,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/models/orderproduct.interface.ts",
    "chars": 203,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nexport in"
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/orders-routing.module.ts",
    "chars": 943,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/orders.module.ts",
    "chars": 1665,
    "preview": "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule }"
  },
  {
    "path": "Lab1/client/Application/src/app/views/orders/orders.service.ts",
    "chars": 885,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/create/create.component.html",
    "chars": 1949,
    "preview": "<div class=\"product-form\">\n  <form [formGroup]=\"productForm\" (submit)=\"submit()\">\n    <mat-card class=\"card\">\n      <mat"
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/create/create.component.scss",
    "chars": 358,
    "preview": ".card {\n  margin: 20px;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.product-form {\n  displ"
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/create/create.component.ts",
    "chars": 1261,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n"
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/edit/edit.component.html",
    "chars": 2131,
    "preview": "<div class=\"product-form\">\n  <form [formGroup]=\"productForm\" (submit)=\"submit()\">\n    <mat-card class=\"card\">\n      <mat"
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/edit/edit.component.scss",
    "chars": 358,
    "preview": ".card {\n  margin: 20px;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.product-form {\n  displ"
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/edit/edit.component.ts",
    "chars": 2288,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/list/list.component.html",
    "chars": 1645,
    "preview": "<div class=\"product-list\">\n  <h2>Product List</h2>\n  <div class=\"row\">\n    <div class=\"col-md-6\">\n      <table mat-table"
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/list/list.component.scss",
    "chars": 98,
    "preview": ".product-list {\n  margin: 20px;\n}\ntable {\n  width: 100%;\n}\n\n.button-panel {\n  margin-top: 20px;\n}\n"
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/list/list.component.ts",
    "chars": 1119,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Product } from '.."
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/models/product.interface.ts",
    "chars": 286,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nexport in"
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/product.service.ts",
    "chars": 1156,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/products-routing.module.ts",
    "chars": 942,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab1/client/Application/src/app/views/products/products.module.ts",
    "chars": 1602,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { MatCardModule } from"
  },
  {
    "path": "Lab1/client/Application/src/assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Lab1/client/Application/src/custom-theme.scss",
    "chars": 1548,
    "preview": "\n// Custom Theming for Angular Material\n// For more information: https://material.angular.io/guide/theming\n@use '@angula"
  },
  {
    "path": "Lab1/client/Application/src/environments/environment.prod.ts",
    "chars": 132,
    "preview": "export const environment = {\n  production: true,\n  apiGatewayUrl: 'https://0grqqki7qk.execute-api.us-west-2.amazonaws.co"
  },
  {
    "path": "Lab1/client/Application/src/environments/environment.ts",
    "chars": 133,
    "preview": "export const environment = {\n  production: false,\n  apiGatewayUrl: 'https://0grqqki7qk.execute-api.us-west-2.amazonaws.c"
  },
  {
    "path": "Lab1/client/Application/src/index.html",
    "chars": 880,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <!-- https://github.com/aws/aws-amplify/issues/678 fix: -->\n    <script>\n "
  },
  {
    "path": "Lab1/client/Application/src/main.ts",
    "chars": 377,
    "preview": "import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynami"
  },
  {
    "path": "Lab1/client/Application/src/polyfills.ts",
    "chars": 2338,
    "preview": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfi"
  },
  {
    "path": "Lab1/client/Application/src/styles/_variables.scss",
    "chars": 453,
    "preview": "$link-color: #673ab7; // 1\n$label-margin-bottom: 0; // 2\n$grid-breakpoints: (\n  xs: 0,\n  // handset portrait (small, med"
  },
  {
    "path": "Lab1/client/Application/src/styles/reset.scss",
    "chars": 147,
    "preview": "a {\n  &.mat-button,\n  &.mat-raised-button,\n  &.mat-fab,\n  &.mat-mini-fab,\n  &.mat-list-item {\n    &:hover {\n      color:"
  },
  {
    "path": "Lab1/client/Application/src/styles.scss",
    "chars": 1135,
    "preview": "/* You can add global styles to this file, and also import other style files */\n@import url(\"https://fonts.googleapis.co"
  },
  {
    "path": "Lab1/client/Application/src/test.ts",
    "chars": 749,
    "preview": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/testi"
  },
  {
    "path": "Lab1/client/Application/tsconfig.app.json",
    "chars": 287,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"extends\": \"./tsconfig.json\",\n  \"compil"
  },
  {
    "path": "Lab1/client/Application/tsconfig.json",
    "chars": 914,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"compileOnSave\": false,\n  \"compilerOpti"
  },
  {
    "path": "Lab1/client/Application/tsconfig.spec.json",
    "chars": 333,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"extends\": \"./tsconfig.json\",\n  \"compil"
  },
  {
    "path": "Lab1/scripts/deployment.sh",
    "chars": 3799,
    "preview": "#!/bin/bash\n\nif [[ \"$#\" -eq 0 ]]; then\n  echo \"Invalid parameters\"\n  echo \"Command to deploy client code: deployment.sh "
  },
  {
    "path": "Lab1/scripts/geturl.sh",
    "chars": 270,
    "preview": "#!/bin/bash\nstackname=\"serverless-saas-workshop-lab1\"\n\nAPP_SITE_URL=$(aws cloudformation describe-stacks --stack-name \"$"
  },
  {
    "path": "Lab1/server/.gitignore",
    "chars": 43,
    "preview": ".aws-sam/\n.pytest_cache/\n.DS_Store\n.vscode/"
  },
  {
    "path": "Lab1/server/OrderService/order_models.py",
    "chars": 468,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nclass Order:\n    "
  },
  {
    "path": "Lab1/server/OrderService/order_service.py",
    "chars": 1951,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport json\nimpor"
  },
  {
    "path": "Lab1/server/OrderService/order_service_dal.py",
    "chars": 3103,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport os\nimport "
  },
  {
    "path": "Lab1/server/OrderService/requirements.txt",
    "chars": 73,
    "preview": "aws-lambda-powertools[Tracer,Logger,Metrics]\njsonpickle\naws_requests_auth"
  },
  {
    "path": "Lab1/server/ProductService/product_models.py",
    "chars": 487,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nclass Product:\n  "
  },
  {
    "path": "Lab1/server/ProductService/product_service.py",
    "chars": 1981,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport json\nimpor"
  },
  {
    "path": "Lab1/server/ProductService/product_service_dal.py",
    "chars": 3322,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport os\nimport "
  },
  {
    "path": "Lab1/server/ProductService/requirements.txt",
    "chars": 94,
    "preview": "requests\npytest-mock\naws-lambda-powertools[Tracer,Logger,Metrics]\njsonpickle\naws_requests_auth"
  },
  {
    "path": "Lab1/server/README.md",
    "chars": 347,
    "preview": "if using EE\nsam build --use-container && sam package  --output-template-file packaged.yaml --s3-bucket aws-sam-cli-manag"
  },
  {
    "path": "Lab1/server/layers/logger.py",
    "chars": 323,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nfrom aws_lambda_p"
  },
  {
    "path": "Lab1/server/layers/requirements.txt",
    "chars": 67,
    "preview": "aws-lambda-powertools[Tracer,Logger,Metrics]\nsimplejson\njsonpickle\n"
  },
  {
    "path": "Lab1/server/layers/utils.py",
    "chars": 1549,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport json\nimpor"
  },
  {
    "path": "Lab1/server/samconfig.toml",
    "chars": 328,
    "preview": "version = 0.1\n[default]\n[default.deploy]\n[default.deploy.parameters]\nstack_name = \"serverless-saas-lab1\"\ns3_bucket = \"aw"
  },
  {
    "path": "Lab1/server/template.yaml",
    "chars": 31049,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nAWSTemplateFormat"
  },
  {
    "path": "Lab2/client/Admin/.browserslistrc",
    "chars": 600,
    "preview": "# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.\n# For addit"
  },
  {
    "path": "Lab2/client/Admin/.editorconfig",
    "chars": 274,
    "preview": "# Editor configuration, see https://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size ="
  },
  {
    "path": "Lab2/client/Admin/.gitignore",
    "chars": 1039,
    "preview": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# Compiled output\n/dist\n/tmp\n/out-tsc\n/bazel-"
  },
  {
    "path": "Lab2/client/Admin/README.md",
    "chars": 1059,
    "preview": "# Admin\n\nThis project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.0.5.\n\n## Devel"
  },
  {
    "path": "Lab2/client/Admin/angular.json",
    "chars": 3193,
    "preview": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"cli\": {\n    \"packageManager\": \"y"
  },
  {
    "path": "Lab2/client/Admin/karma.conf.js",
    "chars": 1426,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "Lab2/client/Admin/package.json",
    "chars": 1346,
    "preview": "{\n  \"name\": \"admin\",\n  \"version\": \"0.0.0\",\n  \"scripts\": {\n    \"ng\": \"ng\",\n    \"start\": \"ng serve\",\n    \"build\": \"ng buil"
  },
  {
    "path": "Lab2/client/Admin/src/app/_nav.ts",
    "chars": 417,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/app-routing.module.ts",
    "chars": 1111,
    "preview": "import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { NavComponent "
  },
  {
    "path": "Lab2/client/Admin/src/app/app.component.scss",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Lab2/client/Admin/src/app/app.component.ts",
    "chars": 796,
    "preview": "import { Component } from '@angular/core';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitiz"
  },
  {
    "path": "Lab2/client/Admin/src/app/app.module.ts",
    "chars": 2017,
    "preview": "import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { BrowserAni"
  },
  {
    "path": "Lab2/client/Admin/src/app/interceptors/auth.interceptor.ts",
    "chars": 1096,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/interceptors/index.ts",
    "chars": 398,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/models/index.ts",
    "chars": 30,
    "preview": "export * from './interfaces';\n"
  },
  {
    "path": "Lab2/client/Admin/src/app/models/interfaces.ts",
    "chars": 208,
    "preview": "export interface INavData {\n  name?: string;\n  url?: string | any[];\n  href?: string;\n  icon?: string;\n  title?: boolean"
  },
  {
    "path": "Lab2/client/Admin/src/app/nav/nav.component.css",
    "chars": 617,
    "preview": ".sidenav-container {\n  height: 100%;\n}\n\n.sidenav-content-container {\n  background-color: lightgray;\n}\n\n.sidenav {\n  widt"
  },
  {
    "path": "Lab2/client/Admin/src/app/nav/nav.component.html",
    "chars": 2184,
    "preview": "<mat-sidenav-container class=\"sidenav-container\">\n  <mat-sidenav\n    #drawer\n    class=\"sidenav\"\n    fixedInViewport\n   "
  },
  {
    "path": "Lab2/client/Admin/src/app/nav/nav.component.spec.ts",
    "chars": 1241,
    "preview": "import { LayoutModule } from '@angular/cdk/layout';\nimport { waitForAsync, ComponentFixture, TestBed } from '@angular/co"
  },
  {
    "path": "Lab2/client/Admin/src/app/nav/nav.component.ts",
    "chars": 2086,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/auth/auth.component.html",
    "chars": 1280,
    "preview": "<div *ngIf=\"isAuthenticated$ | async as isAuthenticated\">\n  <div class=\"animated fadeIn\">\n    <div class=\"row\">\n      <d"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/auth/auth.component.scss",
    "chars": 1400,
    "preview": "/*\n * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *\n * Permission is hereby granted, free o"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/auth/auth.component.ts",
    "chars": 1159,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { from, Observable, pipe } from 'rxjs';\nimport { Auth } from '"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/dashboard/dashboard-routing.module.ts",
    "chars": 528,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/dashboard/dashboard.component.html",
    "chars": 520,
    "preview": "<!--/.row-->\n<mat-card class=\"card\">\n  <mat-card-header class=\"card-body\">\n    <div class=\"col-sm-5\">\n      <h4 class=\"c"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/dashboard/dashboard.component.scss",
    "chars": 383,
    "preview": ".grid-container {\n  margin: 20px;\n}\n\n.dashboard-card {\n  position: absolute;\n  top: 15px;\n  left: 15px;\n  right: 15px;\n "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/dashboard/dashboard.component.ts",
    "chars": 3447,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/dashboard/dashboard.module.ts",
    "chars": 905,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DashboardComponent } "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/create/create.component.html",
    "chars": 2509,
    "preview": "<div fxLayout=\"column\" class=\"tenant-form\">\n  <form [formGroup]=\"tenantForm\" (submit)=\"submit()\">\n    <mat-card class=\"c"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/create/create.component.scss",
    "chars": 380,
    "preview": ".card {\n  margin: 20px;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  width: fit-content;\n}\n\n."
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/create/create.component.ts",
    "chars": 1581,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/list/list.component.html",
    "chars": 2043,
    "preview": "<div class=\"tenant-list\">\n  <mat-card class=\"card\">\n    <mat-card-content>\n      <mat-card-title>\n        Tenant List\n  "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/list/list.component.scss",
    "chars": 132,
    "preview": ".tenant-list {\n  margin: 20px;\n}\ntable {\n  width: 100%;\n}\n\n.button-panel {\n  margin-top: 20px;\n}\n\n.mat-cell {\n  margin: "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/list/list.component.ts",
    "chars": 761,
    "preview": "import { Component, OnInit } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { Tenant } from '../models/"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/models/tenant.ts",
    "chars": 136,
    "preview": "export interface Tenant {\n  tenantId: string;\n  tenantName: string;\n  tenantEmail: string;\n  tenantTier: string;\n  isAct"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/tenants-routing.module.ts",
    "chars": 770,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/tenants.module.ts",
    "chars": 1678,
    "preview": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule }"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/tenants/tenants.service.ts",
    "chars": 910,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/create/create.component.html",
    "chars": 2943,
    "preview": "<div class=\"user-form container\">\n  <div class=\"row\">\n    <div class=\"col-md-6\">\n      <form [formGroup]=\"userForm\">\n   "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/create/create.component.scss",
    "chars": 322,
    "preview": ".user-form {\n  margin: 20px;\n  display: flex;\n  flex-direction: column;\n}\n\n.mat-card-title {\n  display: flex;\n  justify-"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/create/create.component.ts",
    "chars": 1500,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/list/list.component.html",
    "chars": 2615,
    "preview": "<div class=\"user-list\">\n  <mat-card class=\"card\">\n    <mat-card-content>\n      <mat-card-title>\n        User List\n      "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/list/list.component.scss",
    "chars": 130,
    "preview": ".user-list {\n  margin: 20px;\n}\ntable {\n  width: 100%;\n}\n\n.button-panel {\n  margin-top: 20px;\n}\n\n.mat-cell {\n  margin: 20"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/list/list.component.ts",
    "chars": 773,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/models/user.ts",
    "chars": 257,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nexport in"
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/users-routing.module.ts",
    "chars": 758,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/users.module.ts",
    "chars": 1687,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: MIT-0\n */\nimport { "
  },
  {
    "path": "Lab2/client/Admin/src/app/views/users/users.service.ts",
    "chars": 1582,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *\n * Permission is hereby granted, free of cha"
  },
  {
    "path": "Lab2/client/Admin/src/assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Lab2/client/Admin/src/aws-exports.ts",
    "chars": 226,
    "preview": "const awsmobile = {\n  aws_project_region: 'us-west-2',\n  aws_cognito_region: 'us-west-2',\n  aws_user_pools_id: 'us-west-"
  },
  {
    "path": "Lab2/client/Admin/src/custom-theme.scss",
    "chars": 1548,
    "preview": "\n// Custom Theming for Angular Material\n// For more information: https://material.angular.io/guide/theming\n@use '@angula"
  },
  {
    "path": "Lab2/client/Admin/src/environments/environment.prod.ts",
    "chars": 125,
    "preview": "export const environment = {\n  production: true,\n  apiUrl: 'https://duobieudcl.execute-api.us-west-2.amazonaws.com/prod'"
  },
  {
    "path": "Lab2/client/Admin/src/environments/environment.ts",
    "chars": 126,
    "preview": "export const environment = {\n  production: false,\n  apiUrl: 'https://duobieudcl.execute-api.us-west-2.amazonaws.com/prod"
  },
  {
    "path": "Lab2/client/Admin/src/index.html",
    "chars": 878,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <!-- https://github.com/aws/aws-amplify/issues/678 fix: -->\n    <script>\n "
  },
  {
    "path": "Lab2/client/Admin/src/main.ts",
    "chars": 489,
    "preview": "import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynami"
  },
  {
    "path": "Lab2/client/Admin/src/polyfills.ts",
    "chars": 2338,
    "preview": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfi"
  },
  {
    "path": "Lab2/client/Admin/src/styles/_variables.scss",
    "chars": 453,
    "preview": "$link-color: #673ab7; // 1\n$label-margin-bottom: 0; // 2\n$grid-breakpoints: (\n  xs: 0,\n  // handset portrait (small, med"
  },
  {
    "path": "Lab2/client/Admin/src/styles/reset.scss",
    "chars": 147,
    "preview": "a {\n  &.mat-button,\n  &.mat-raised-button,\n  &.mat-fab,\n  &.mat-mini-fab,\n  &.mat-list-item {\n    &:hover {\n      color:"
  },
  {
    "path": "Lab2/client/Admin/src/styles.scss",
    "chars": 938,
    "preview": "/* You can add global styles to this file, and also import other style files */\n@import url(\"https://fonts.googleapis.co"
  },
  {
    "path": "Lab2/client/Admin/src/test.ts",
    "chars": 749,
    "preview": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/testi"
  },
  {
    "path": "Lab2/client/Admin/tsconfig.app.json",
    "chars": 287,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"extends\": \"./tsconfig.json\",\n  \"compil"
  },
  {
    "path": "Lab2/client/Admin/tsconfig.json",
    "chars": 871,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"compileOnSave\": false,\n  \"compilerOpti"
  },
  {
    "path": "Lab2/client/Admin/tsconfig.spec.json",
    "chars": 333,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"extends\": \"./tsconfig.json\",\n  \"compil"
  },
  {
    "path": "Lab2/client/Landing/.browserslistrc",
    "chars": 600,
    "preview": "# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.\n# For addit"
  },
  {
    "path": "Lab2/client/Landing/.editorconfig",
    "chars": 274,
    "preview": "# Editor configuration, see https://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size ="
  },
  {
    "path": "Lab2/client/Landing/.gitignore",
    "chars": 1039,
    "preview": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# Compiled output\n/dist\n/tmp\n/out-tsc\n/bazel-"
  },
  {
    "path": "Lab2/client/Landing/README.md",
    "chars": 1061,
    "preview": "# Landing\n\nThis project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.0.5.\n\n## Dev"
  },
  {
    "path": "Lab2/client/Landing/angular.json",
    "chars": 3310,
    "preview": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"cli\": {\n    \"packageManager\": \"y"
  },
  {
    "path": "Lab2/client/Landing/karma.conf.js",
    "chars": 1426,
    "preview": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-fi"
  },
  {
    "path": "Lab2/client/Landing/package.json",
    "chars": 1162,
    "preview": "{\n  \"name\": \"landing\",\n  \"version\": \"0.0.0\",\n  \"scripts\": {\n    \"ng\": \"ng\",\n    \"start\": \"ng serve\",\n    \"build\": \"ng bu"
  },
  {
    "path": "Lab2/client/Landing/src/app/app-routing.module.ts",
    "chars": 672,
    "preview": "import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { RegisterCompo"
  },
  {
    "path": "Lab2/client/Landing/src/app/app.component.scss",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Lab2/client/Landing/src/app/app.component.ts",
    "chars": 592,
    "preview": "import { Component } from '@angular/core';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitiz"
  },
  {
    "path": "Lab2/client/Landing/src/app/app.module.ts",
    "chars": 1820,
    "preview": "import { NgModule } from '@angular/core';\nimport { BrowserModule } from '@angular/platform-browser';\nimport { BrowserAni"
  },
  {
    "path": "Lab2/client/Landing/src/app/views/landing/landing.component.html",
    "chars": 4217,
    "preview": "<div class=\"animated fadeIn\">\n  <nav class=\"navbar navbar-expand-lg navbar-light bg-light\">\n    <a class=\"navbar-brand\" "
  },
  {
    "path": "Lab2/client/Landing/src/app/views/landing/landing.component.scss",
    "chars": 6549,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *\n * Permission is hereby granted, free of cha"
  },
  {
    "path": "Lab2/client/Landing/src/app/views/landing/landing.component.ts",
    "chars": 1384,
    "preview": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *\n * Permission is hereby granted, free of cha"
  },
  {
    "path": "Lab2/client/Landing/src/app/views/register/register.component.html",
    "chars": 2636,
    "preview": "<div fxLayout=\"column\" class=\"tenant-form\">\n  <form [formGroup]=\"tenantForm\" class=\"wide-form\">\n    <mat-card class=\"car"
  },
  {
    "path": "Lab2/client/Landing/src/app/views/register/register.component.scss",
    "chars": 477,
    "preview": ".card {\n  margin: 20px;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  width: fit-content;\n}\n\n."
  },
  {
    "path": "Lab2/client/Landing/src/app/views/register/register.component.ts",
    "chars": 1722,
    "preview": "import { MatSnackBar } from '@angular/material/snack-bar';\nimport { Component, OnInit } from '@angular/core';\nimport { F"
  },
  {
    "path": "Lab2/client/Landing/src/assets/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Lab2/client/Landing/src/custom-theme.scss",
    "chars": 1548,
    "preview": "\n// Custom Theming for Angular Material\n// For more information: https://material.angular.io/guide/theming\n@use '@angula"
  },
  {
    "path": "Lab2/client/Landing/src/environments/environment.prod.ts",
    "chars": 132,
    "preview": "export const environment = {\n  production: true,\n  apiGatewayUrl: 'https://duobieudcl.execute-api.us-west-2.amazonaws.co"
  },
  {
    "path": "Lab2/client/Landing/src/environments/environment.ts",
    "chars": 133,
    "preview": "export const environment = {\n  production: false,\n  apiGatewayUrl: 'https://duobieudcl.execute-api.us-west-2.amazonaws.c"
  },
  {
    "path": "Lab2/client/Landing/src/index.html",
    "chars": 745,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <!-- https://github.com/aws/aws-amplify/issues/678 fix: -->\n    <script>\n "
  },
  {
    "path": "Lab2/client/Landing/src/main.ts",
    "chars": 377,
    "preview": "import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynami"
  },
  {
    "path": "Lab2/client/Landing/src/polyfills.ts",
    "chars": 2338,
    "preview": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfi"
  },
  {
    "path": "Lab2/client/Landing/src/styles/_variables.scss",
    "chars": 453,
    "preview": "$link-color: #673ab7; // 1\n$label-margin-bottom: 0; // 2\n$grid-breakpoints: (\n  xs: 0,\n  // handset portrait (small, med"
  },
  {
    "path": "Lab2/client/Landing/src/styles/reset.scss",
    "chars": 147,
    "preview": "a {\n  &.mat-button,\n  &.mat-raised-button,\n  &.mat-fab,\n  &.mat-mini-fab,\n  &.mat-list-item {\n    &:hover {\n      color:"
  },
  {
    "path": "Lab2/client/Landing/src/styles.scss",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Lab2/client/Landing/src/test.ts",
    "chars": 749,
    "preview": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/testi"
  },
  {
    "path": "Lab2/client/Landing/tsconfig.app.json",
    "chars": 287,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"extends\": \"./tsconfig.json\",\n  \"compil"
  },
  {
    "path": "Lab2/client/Landing/tsconfig.json",
    "chars": 871,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"compileOnSave\": false,\n  \"compilerOpti"
  },
  {
    "path": "Lab2/client/Landing/tsconfig.spec.json",
    "chars": 333,
    "preview": "/* To learn more about this file see: https://angular.io/config/tsconfig. */\n{\n  \"extends\": \"./tsconfig.json\",\n  \"compil"
  },
  {
    "path": "Lab2/scripts/deploy-updates.sh",
    "chars": 598,
    "preview": "#!/bin/bash\ncd ../server || exit # stop execution if cd fails\nrm -rf .aws-sam/\npython3 -m pylint -E -d E0401 $(find . -i"
  },
  {
    "path": "Lab2/scripts/deployment.sh",
    "chars": 9292,
    "preview": "#!/bin/bash\n\nif [[ \"$#\" -eq 0 ]]; then\n  echo \"Invalid parameters\"\n  echo \"Command to deploy client code: deployment.sh "
  },
  {
    "path": "Lab2/scripts/geturl.sh",
    "chars": 979,
    "preview": "#!/bin/bash\nPREPROVISIONED_ADMIN_SITE=$(aws cloudformation list-exports --query \"Exports[?Name=='Serverless-SaaS-AdminAp"
  },
  {
    "path": "Lab2/server/.gitignore",
    "chars": 43,
    "preview": ".aws-sam/\n.pytest_cache/\n.DS_Store\n.vscode/"
  },
  {
    "path": "Lab2/server/OrderService/order_models.py",
    "chars": 468,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nclass Order:\n    "
  },
  {
    "path": "Lab2/server/OrderService/order_service.py",
    "chars": 1951,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport json\nimpor"
  },
  {
    "path": "Lab2/server/OrderService/order_service_dal.py",
    "chars": 3103,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport os\nimport "
  },
  {
    "path": "Lab2/server/OrderService/requirements.txt",
    "chars": 73,
    "preview": "aws-lambda-powertools[Tracer,Logger,Metrics]\njsonpickle\naws_requests_auth"
  },
  {
    "path": "Lab2/server/ProductService/product_models.py",
    "chars": 487,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nclass Product:\n  "
  },
  {
    "path": "Lab2/server/ProductService/product_service.py",
    "chars": 1981,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport json\nimpor"
  },
  {
    "path": "Lab2/server/ProductService/product_service_dal.py",
    "chars": 3322,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport os\nimport "
  },
  {
    "path": "Lab2/server/ProductService/requirements.txt",
    "chars": 94,
    "preview": "requests\npytest-mock\naws-lambda-powertools[Tracer,Logger,Metrics]\njsonpickle\naws_requests_auth"
  },
  {
    "path": "Lab2/server/README.md",
    "chars": 345,
    "preview": "if using EE\nsam build --use-container && sam package  --output-template-file packaged.yaml --s3-bucket aws-sam-cli-manag"
  },
  {
    "path": "Lab2/server/Resources/requirements.txt",
    "chars": 25,
    "preview": "python-jose[cryptography]"
  },
  {
    "path": "Lab2/server/Resources/shared_service_authorizer.py",
    "chars": 10729,
    "preview": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: MIT-0\n\nimport re\nimport "
  }
]

// ... and 2179 more files (download for full content)

About this extraction

This page contains the full source code of the aws-samples/aws-serverless-saas-workshop GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2379 files (4.4 MB), approximately 1.3M tokens, and a symbol index with 3173 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!