Architecture

alt text

Project structure

Generated project structure. Replace entity-[1..n] with the entities defined by you.


.
├── .angular-cli.json (Angular CLI config file)
├── .editorconfig (Editor Config config file)
├── .gitignore (Files to be ignored by GIT)
├── e2e (End to End Test files)
│   ├── ...
├── firebase.json (Firebase config files)
├── firestore.indexes.json (Firebase Firestore indexes)
├── firestore.rules (Firebase Firestore database rules)
├── functions (Firebase Functions)
│   ├── index.js (Index of Firebase Functions)
│   ├── lib
│   │   ├── admin
│   │   │   ├── role
│   │   │   │   ├── role-deletion.js (Role deletion triggers)
│   │   │   │   ├── role-log.js (Generates role logs)
│   │   │   │   └── roles.js (Handle all users triggers: log and deletion)
│   │   │   └── user
│   │   │       ├── user-admin.js (Admin permission methods)
│   │   │       ├── user-authentication.js (User authentication methods)
│   │   │       ├── user-deletion.js (User deletion methods)
│   │   │       ├── user-individual-permission.js (User individual permissions methods)
│   │   │       ├── user-log.js (User logs persistence)
│   │   │       ├── user-pending.js (Indexes users waiting for permissions)
│   │   │       ├── user-permission.js (Indexes and lists user's permissions)
│   │   │       ├── user-role-permission.js (User roles permissions)
│   │   │       ├── user-storage.js (Generates storage token for users)
│   │   │       └── users.js (Handle all users triggers: log, deletion, admin, pending of permissions and indexes)
│   │   ├── entities
│   │   │   └── entity-1
│   │   │       └── entity-1.js (Handle all entity triggers: log, deletion and indexes)
│   │   │   └── entity-2
│   │   │       └── entity-2.js
│   │   │   └── entity-n
│   │   │       └── entity-n.js
│   │   └── shared
│   │       ├── entities.js (Enumerator of entities)
│   │       ├── entity-deleter.js (Common entity deletion methods)
│   │       ├── entity-files.js (Common entity cloud storage file deletion methods)
│   │       ├── entity-index-foreigns.js (Common entity foreign indexes methods)
│   │       ├── entity-index-options.js (Common entity option indexes methods)
│   │       ├── entity-index.js (Common entity indexes methods)
│   │       ├── entity-log.js (Common entity logs methods)
│   │       ├── entity.js (Entity model)
│   │       ├── file-deleter.js (Methods to delete files from Cloud Functions)
│   │       └── permission-types.js (Enumerator of permission types)
│   ├── package.json (Firebase Functions dependencies)
│   └── service-account.json (Firebase Admin SDK credentials)
├── karma.conf.js (Karma unit test config files)
├── package.json (Project dependencies and scripts)
├── protractor.conf.js (Protractor test config file)
├── readme.md (Scaffold readme)
├── src
│   ├── app
│   │   ├── activity (Activity log files)
│   │   │   ├── activity-routing.module.ts (/activity route)
│   │   │   ├── activity.component.html
│   │   │   ├── activity.component.ts
│   │   │   ├── activity.module.ts
│   │   │   ├── activity.service.ts
│   │   │   ├── activity.ts
│   │   │   └── datagrid
│   │   │       ├── activity-datagrid.component.html
│   │   │       └── activity-datagrid.component.ts
│   │   ├── admin (Admin module files)
│   │   │   ├── admin-routing.module.ts (/admin/... routes)
│   │   │   ├── admin.guard.ts (Protect admin only routes)
│   │   │   ├── admin.module.ts (Admin module)
│   │   │   ├── permission
│   │   │   │   └── permission-types.ts (Enumerator of permission types)
│   │   │   ├── role
│   │   │   │   ├── role-detail (Role detail tab)
│   │   │   │   │   ├── role-detail.component.html
│   │   │   │   │   └── role-detail.component.ts
│   │   │   │   ├── role-form (Role form page)
│   │   │   │   │   ├── role-form.component.html
│   │   │   │   │   └── role-form.component.ts
│   │   │   │   ├── role-history
│   │   │   │   │   ├── full (History of all role records)
│   │   │   │   │   │   ├── role-history-full.component.html
│   │   │   │   │   │   └── role-history-full.component.ts
│   │   │   │   │   ├── role-history.service.ts (Role history service)
│   │   │   │   │   ├── role-history.ts (Role history model)
│   │   │   │   │   └── single (History of a single role record)
│   │   │   │   │       ├── role-history-single.component.html
│   │   │   │   │       └── role-history-single.component.ts
│   │   │   │   ├── role-list (Role list page)
│   │   │   │   │   ├── role-list.component.html
│   │   │   │   │   └── role-list.component.ts
│   │   │   │   ├── role-permissions (Role permission tab)
│   │   │   │   │   ├── role-permissions-resolve.service.ts (Resolve permissions to role permission tab)
│   │   │   │   │   ├── role-permissions.component.css
│   │   │   │   │   ├── role-permissions.component.html
│   │   │   │   │   ├── role-permissions.component.ts
│   │   │   │   │   └── role-permissions.service.ts (Role permission service)
│   │   │   │   ├── role-resolve.service.ts (Pre load role for routes)
│   │   │   │   ├── role-routing.module.ts (/admin/role/... routes)
│   │   │   │   ├── role-show (Role show page)
│   │   │   │   │   ├── role-show.component.html
│   │   │   │   │   └── role-show.component.ts
│   │   │   │   ├── role.module.ts
│   │   │   │   ├── role.service.ts
│   │   │   │   ├── role.ts (Role model)
│   │   │   │   └── roles-resolve.service.ts (Pre load roles list for routes)
│   │   │   └── user
│   │   │       ├── user-activity (User activity tab)
│   │   │       │   ├── user-activity.component.css
│   │   │       │   ├── user-activity.component.html
│   │   │       │   └── user-activity.component.ts
│   │   │       ├── user-detail (User detail tab)
│   │   │       │   ├── user-detail.component.html
│   │   │       │   └── user-detail.component.ts
│   │   │       ├── user-history
│   │   │       │   ├── full (History of all users records)
│   │   │       │   │   ├── user-history-full.component.html
│   │   │       │   │   └── user-history-full.component.ts
│   │   │       │   ├── single (History of a single user record)
│   │   │       │   │   ├── user-history-single.component.html
│   │   │       │   │   └── user-history-single.component.ts
│   │   │       │   ├── user-history.service.ts
│   │   │       │   └── user-history.ts
│   │   │       ├── user-list (User list page)
│   │   │       │   ├── user-list.component.html
│   │   │       │   └── user-list.component.ts
│   │   │       ├── user-pending (Users waiting for permissions component)
│   │   │       │   ├── user-pending.component.html
│   │   │       │   ├── user-pending.component.ts
│   │   │       │   └── user-pending.service.ts
│   │   │       ├── user-permissions (User individual permissions tab)
│   │   │       │   ├── user-permissions-blocked-resolve.service.ts
│   │   │       │   ├── user-permissions-blocked.ts
│   │   │       │   ├── user-permissions-resolve.service.ts
│   │   │       │   ├── user-permissions.component.css
│   │   │       │   ├── user-permissions.component.html
│   │   │       │   ├── user-permissions.component.ts
│   │   │       │   └── user-permissions.service.ts
│   │   │       ├── user-resolve.service.ts (Pre load the user for routes)
│   │   │       ├── user-roles (User roles tab)
│   │   │       │   ├── user-roles-resolve.ts
│   │   │       │   ├── user-roles.component.html
│   │   │       │   ├── user-roles.component.ts
│   │   │       │   └── user-roles.service.ts
│   │   │       ├── user-routing.module.ts (/admin/user/... routes)
│   │   │       ├── user-shared.module.ts (Module to share the User Waiting for Permissions component)
│   │   │       ├── user-show (User show page)
│   │   │       │   ├── user-show.component.html
│   │   │       │   └── user-show.component.ts
│   │   │       ├── user.module.ts
│   │   │       ├── user.service.ts
│   │   │       └── users-resolve.service.ts
│   │   ├── app-routing.module.ts (Main route module)
│   │   ├── app.component.css
│   │   ├── app.component.html
│   │   ├── app.component.ts (Main app component)
│   │   ├── app.module.ts (Main app module)
│   │   ├── auth (Authentication)
│   │   │   ├── auth-routing.module.ts (/auth/... routes)
│   │   │   ├── auth.guard.ts (Protect authenticated routes)
│   │   │   ├── auth.module.ts (Auth module)
│   │   │   ├── auth.service.ts (Auth service)
│   │   │   ├── email-unverified (Unverified email page)
│   │   │   │   ├── email-already-verified.guard.ts (Protect routes that needs email to be UNverified)
│   │   │   │   ├── email-unverified.component.html
│   │   │   │   └── email-unverified.component.ts
│   │   │   ├── login (Login page)
│   │   │   │   ├── login.component.html
│   │   │   │   └── login.component.ts
│   │   │   ├── password-reset (Password reset page)
│   │   │   │   ├── password-reset.component.html
│   │   │   │   └── password-reset.component.ts
│   │   │   ├── permission
│   │   │   │   ├── admin-permissions.ts (Admin permissions handler)
│   │   │   │   ├── empty-permissions.component.html
│   │   │   │   ├── empty-permissions.component.ts (Empty permissions pages)
│   │   │   │   ├── not-empty-permissions.guard.ts (Protect routes that needs the user to have empty permissions)
│   │   │   │   ├── permission.service.ts (Loads user permissions)
│   │   │   │   └── permissions.ts (Permissions model)
│   │   │   ├── registration (Registration page)
│   │   │   │   ├── registration.component.html
│   │   │   │   └── registration.component.ts
│   │   │   ├── unauth.guard.ts (Protect unauthenticated routes)
│   │   │   └── user
│   │   │       ├── auth-user.module.ts
│   │   │       ├── auth-user.service.ts (Loads logged user info)
│   │   │       └── user.ts (User model)
│   │   ├── core
│   │   │   ├── core.module.ts (Core module)
│   │   │   ├── extensions
│   │   │   │   ├── array-extensions.ts (Adds new methods for arrays)
│   │   │   │   └── string-extensions.ts (Adds new methods for strings)
│   │   │   ├── firebase
│   │   │   │   └── firebase-init.ts (Initializes Firebase)
│   │   │   ├── layout (Main layout)
│   │   │   │   ├── main-layout.component.html
│   │   │   │   └── main-layout.component.ts
│   │   │   ├── logger
│   │   │   │   └── logger.service.ts
│   │   │   ├── menu
│   │   │   │   ├── menu.component.html
│   │   │   │   └── menu.component.ts
│   │   │   └── snackbar
│   │   │       └── snackbar.service.ts (Shows error and success alerts)
│   │   ├── dashboard
│   │   │   ├── dashboard-routing.module.ts
│   │   │   ├── dashboard.component.html
│   │   │   ├── dashboard.component.ts
│   │   │   └── dashboard.module.ts
│   │   ├── entities
│   │   │   ├── entities-routing.module.ts (/entities/... routes)
│   │   │   ├── entities.module.ts (Entites module)
│   │   │   ├── entities.ts (Enumerator of entitites)
│   │   │   ├── entity.ts (Entity model)
│   │   │   ├── entity-1
│   │   │   │   ├── entity-1-detail (Entity detail tab)
│   │   │   │   │   ├── entity-1-detail.component.html
│   │   │   │   │   └── entity-1-detail.component.ts
│   │   │   │   ├── entity-1-enumerators (Entity enumerators folder)
│   │   │   │   │   └── entity-1-enumerator.ts
│   │   │   │   ├── entity-1-files (Entity file upload and download methods)
│   │   │   │   │   └── entity-1-files.service.ts
│   │   │   │   ├── entity-1-form (Entity form page)
│   │   │   │   │   ├── entity-1-form.component.html
│   │   │   │   │   └── entity-1-form.component.ts
│   │   │   │   ├── entity-1-history
│   │   │   │   │   ├── entity-1-history.service.ts (Entity history service)
│   │   │   │   │   ├── entity-1-history.ts (Entity history model)
│   │   │   │   │   ├── full (History of all entity records)
│   │   │   │   │   │   ├── entity-1-history-full.component.html
│   │   │   │   │   │   └── entity-1-history-full.component.ts
│   │   │   │   │   └── single (History of a single entity record)
│   │   │   │   │       ├── entity-1-history-single.component.html
│   │   │   │   │       └── entity-1-history-single.component.ts
│   │   │   │   ├── entity-1-list (Entity list page)
│   │   │   │   │   ├── entity-1-exporter.ts
│   │   │   │   │   ├── entity-1-list.component.html
│   │   │   │   │   └── entity-1-list.component.ts
│   │   │   │   ├── entity-1-option
│   │   │   │   │   ├── entity-1-option.service.ts (Service that lists the entity in a format of ID and Label)
│   │   │   │   │   └── entity-1-options-resolve.service.ts (Pre load entity options for routes)
│   │   │   │   ├── entity-1-permission
│   │   │   │   │   ├── entity-1-create.guard.ts (Protect entity routes that needs create permission)
│   │   │   │   │   ├── entity-1-permissions.service.ts (Verifies entity permissions)
│   │   │   │   │   ├── entity-1-read-logs.guard.ts (Protect entity routes that needs read logs permission)
│   │   │   │   │   ├── entity-1-read.guard.ts (Protect entity routes that needs read permission)
│   │   │   │   │   └── entity-1-update.guard.ts (Protect entity routes that needs update permission)
│   │   │   │   ├── entity-1-resolve.service.ts (Pre load entity for routes)
│   │   │   │   ├── entity-1-routing.module.ts (/entities/entity-1/... routes)
│   │   │   │   ├── entity-1-shared.module.ts (Entity shared module)
│   │   │   │   ├── entity-1-show (Entity show page)
│   │   │   │   │   ├── entity-1-show.component.html
│   │   │   │   │   └── entity-1-show.component.ts
│   │   │   │   ├── entity-1.module.ts (Entity module)
│   │   │   │   ├── entity-1.service.ts (Entity service)
│   │   │   │   └── entity-1.ts (Entity model)
│   │   │   ├── entity-2
│   │   │   │   ├── ...
│   │   │   ├── entity-n
│   │   │   │   ├── ...
│   │   └── shared
│   │       ├── audition
│   │       │   └── audition.ts (Common audition methods)
│   │       ├── autocomplete
│   │       │   ├── multiple (Autocomplete for multiple choices)
│   │       │   │   ├── autocomplete-multiple.component.html
│   │       │   │   └── autocomplete-multiple.component.ts
│   │       │   ├── option.ts (Autocomplete option model (ID and Label))
│   │       │   └── single (Autocomplete for one choice)
│   │       │       ├── autocomplete.component.html
│   │       │       └── autocomplete.component.ts
│   │       ├── autofocus
│   │       │   └── autofocus.directive.ts
│   │       ├── confirm (Confirm popup component)
│   │       │   ├── confirm.component.html
│   │       │   └── confirm.component.ts
│   │       ├── datagrid
│   │       │   ├── datagrid.ts (Common datagrid methods)
│   │       │   ├── exporter (Common CSV exporter methods)
│   │       │   │   ├── csv-exporter.ts
│   │       │   │   ├── exporter-definition.ts
│   │       │   │   ├── exporter.ts
│   │       │   │   └── json-exporter.ts
│   │       │   └── matrix.ts (Matrix [][] model)
│   │       ├── destroy
│   │       │   └── destroy.service.ts (Validates if the entity record can be deleted)
│   │       ├── entity-link (Generates a link to the entity)
│   │       │   ├── entity-link.component.html
│   │       │   └── entity-link.component.ts
│   │       ├── files
│   │       │   ├── file-item.ts
│   │       │   ├── files.service.ts (Common file upload methods)
│   │       │   ├── upload
│   │       │   │   ├── file-upload.component.html
│   │       │   │   ├── file-upload.component.ts (File upload component)
│   │       │   │   ├── file-uploader.ts
│   │       │   │   ├── image-upload.component.html
│   │       │   │   ├── image-upload.component.ts (Image upload component)
│   │       │   │   └── image-uploader.ts
│   │       │   └── viewer
│   │       │       ├── file-viewer.component.html
│   │       │       ├── file-viewer.component.ts (File viewer component)
│   │       │       ├── image-viewer.component.html
│   │       │       └── image-viewer.component.ts (Image viewer component)
│   │       ├── firebase
│   │       │   └── firebase-mapper.ts (Converts data from Firebase Firestore to javascript format)
│   │       ├── masks
│   │       │   ├── date.mask.ts (Form Date mask)
│   │       │   └── datetime.mask.ts (Form Datetime mask)
│   │       ├── mdl
│   │       │   └── mdl.directive.ts (Directive that loads Material Design Lite)
│   │       ├── moment
│   │       │   └── moment.pipe.ts (Moment - date and time library - pipe)
│   │       ├── shared.module.ts (Shared module)
│   │       ├── spinner (Spinner - Loading - component)
│   │       │   ├── spinner.component.html
│   │       │   └── spinner.component.ts
│   │       ├── subscriptions
│   │       │   └── subscriptions.ts (Handle subscriptions destroy)
│   │       └── validations
│   │           ├── custom-validators.ts (Custom form validations)
│   │           ├── validation-messages.ts (Form validation messages)
│   │           ├── validations.component.html
│   │           └── validations.component.ts (Form validation component)
│   ├── assets
│   │   └── material
│   │       └── indigo-pink.css (Angular Material css customization)
│   ├── environments
│   │   ├── environment.prod.ts (Production environment configs)
│   │   └── environment.ts (Development environment configs)
│   ├── favicon.ico
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   ├── styles.css
│   ├── test.ts
│   ├── tsconfig.app.json
│   ├── tsconfig.spec.json
│   ├── typings.d.ts
│   └── vendor.ts
├── storage.rules (Firebase Storage rules)
├── tsconfig.json
└── tslint.json