App Builder / Resource Builder 3
We need to create a page introducing SolidX and what it stands for, maybe a writeup of some of the design goals, we need to position it here as an enterprise low code platform.
Reference design for this could be: https://docs.strapi.io/
As in the above page we can have a paragraph on top instead of the carousel, and the bottom 2 blocks one for the user documentation & other for the developer documentation.
- Open Source
- Non vendor lockin, standards based
- (NestJS - Node, .NET Core - C#, Spring Boot - Java)
- Database agnostic (RDBMS - mssql, mysql, oracle & pg + NoSQL - MongoDB)
- Schema agnostic
- React on the Admin frontend.
- Existing developers can easily work on it without re-skilling.
- SOLID principles, brings standardisation to development workflows using tried & tested SOPs.
- Extensibility & Flexibility, never hit a brick wall in terms of what can be done.
- Batteries Attached - comes with a suite of recipes / features pre built.
- IAM
- Notifications - Email, SMS, Firebase push notifications & WhatsApp.
- Storage abstraction
- Queues abstraction
- Caching abstraction
- Standard data modeling & resource management features
- RESTful CRUD
- Import
- Export
- Audit Trail
- Saved filters
- Much more..
Here we can talk about the basics of the admin panel, we need to make a landing page in the admin panel that the user can land on immediately after they login similar to what Strapi has.
Reference: https://docs.strapi.io/user-docs/intro
We can start with a link to how one can access the admin panel, the default username & password that gets set up. How the user can login and change the password of the admin user.
At the bottom then we can have sections similar to the above page for us the sections will be (only consider top level bullets for now).
- App Builder
- Resource builder
- View builder
- Apps
- Media Library
- Media Storage providers
- IAM - Users, roles & permissions.
- Email & SMS Templates
- Other Settings
- List of values
- Messages & queue log
- Import & export jobs
- Saved views
The App Builder is one of the core modules that comes with SolidX.
Reference: https://docs.strapi.io/user-docs/content-type-builder
Here we talk about how everything is structured around modules. Explain each field on the module builder form.
We need to probably elaborate on the data source and how to use it, and other features.
Here we capture details about configuring a model / resource. Explain each field on the model form.
We need to probably elaborate on the data source and how to use it, soft delete, audit tracking, internationalisation and any other features.
Here we capture all the different field types we have in full detail. This is quite elaborate as we document what all is possible while making each field.
In this section we first talk about the different views which are possible for a given SOLID resource / model.
Talk about how the list view comes out, the json layout & all the filtering / searching / importing / exporting / saved queries functionality that the list view exposes.
Talk about how the list view comes out, the json layout & all the filtering / searching / importing / exporting / saved queries functionality that the list view exposes.
Here again we need to talk about the json layout, audit trail functionality, chatter, workflow stages etc.
Introduce what apps are - they are basic pieces around achieving modularity, they encapsulate a logical unit of functionality and expose RESTful API endpoints, services & internal user interface from where users can access & modify data of that module.
Talk about how swagger docs get auto-generated, we can demonstrate the login API to generate the token, and then use the other APIs which are automatically generated.
Talk about how for each module & resource a menu structure is automatically created.
Talk about the list view, talk about the list view layout, how one can customize the list view layout.
Then we can talk about the different features that the list view exposes by default.
- Search
- Filter
- Group (*)
- Import
- Export
- Pagination
- Sorting
- Configure layout
- Saved queries
- Custom action buttons (within record & in header)
- Saved views (list layout linked to user profile)
Talk about the kanban view, talk about the kanban view layout, how one can customize the kanban view layout.
Then we can talk about the different sections / features that the list view exposes by default.
- Standard & custom actions (within record & in header)
- Search
- Filter
- Sort
- Import
- Export
- Group (1 level grouping)
- Pagination
- Configure layout - including image(s) as part of the layout.
- Saved queries
Talk about the form view, the view layout & how to customize the form view.
Then we talk about different sections of the form view.
- Standard & custom actions
- Chatter / Audit trail
- Message log
- Workflow ribbon
- Breadcrumbs
In this section we will also have to talk about how each field type which was configured in the app builder section manifests itself in the form view.
In this section we talk about the media library & media storage provider.
We need to create a view of all the media that is uploaded in the system, since we have a common table for the media now.
This view can be similar to the Strapi media view.
Again we can create a CRUD interface for the storage providers, and document each storage provider in detail.
Currently we are supporting filesystem & S3.
In this section we first introduce our take on IAM, introducing the user, role & permissions entities.
Talk about the user list view, how you can create & invite new users to the system.
Talk about what roles are, here you need to create a new role and link it to permissions.
Permissions are automatically discovered based on all the controllers present in the codebase, each controller action becomes a permission.
Talk about what record rules are and how they help us achieve data / record level security linked to RBAC.
In this section we need to document all the different ways in which a user can signup & login to the system.
First we can talk about the login workflow in a bit more detail here.
Let's say that:
- Solid backend is located at: solid.website.com, and
- Your app frontend is located at: website.com
Then the workflow works like this:
- The user goes on your frontend app (https://website.com) and clicks on your button to connect with Google.
- The frontend redirects the tab to the backend URL: https://solid.website.com/api/iam/google/connect
- The backend redirects the tab to the Google login page where the user logs in.
- Once done, Google redirects the tab to the backend URL: https://solid.website.com/api/iam/google/connect/callback. When this callback comes, it comes with the user's profile & access token.
- Then, the backend redirects the tab to the url of your choice with the param accessCode (example: http://website.com/connect/google/dummy-redirect?accessCode=eyfvg).
- The frontend (http://website.com/connect/google/dummy-redirect) calls the backend with https://solid.website.com/api/iam/google/auth?accessCode=eyfvg that returns the Solid user profile with its jwt. (Under the hood, the backend asks Google for the user's profile and a match is done on Google user's email address and Solid user's email address).
- The frontend now possesses the user's JWT, which means the user is connected and the frontend can make authenticated requests to the backend!
We then need to document each of the supported providers in more detail.
- Password based authentication
- OTP based authentication (passwordless)
- Meta
- X
- …
- …
- Others can follow.
We can then talk about some of the standard functionalities around authentication.
- Forgot password
- Reset password
- GET User profile
- Token management - access token, refresh token, token cache etc.
Here we talk about our Email & SMS abstraction.
We allow developers to send emails & text messages both template based & otherwise.
We have abstracted template management into 2 entities viz. email_templates & sms_templates.
Create HTML/Text based email templates with placeholders which can be replaced at runtime. Templates also support attachments (static & dynamic).
The dynamic attachments are set up in terms of Report Templates.
Create text based sms templates with placeholders which can be replaced at runtime. We can link into link shortening here later.
We also talk about the different providers we are supporting including Amazon SES & SMTP for Email. For SMS we can support Twilio, Msg91, Gupshup as a going in proposition.
Most importantly, we should document the provider abstraction allowing devs to create their own providers and integrate.
Allows users to configure HTML to PDF report creation with placeholder replacement.
-
App Builder
Allows one to model any resource in terms of modules, models & fields abstraction.
Once modeled & metadata created for the above 3 entities, app builder allows us to generate boilerplate for that resource.
Boilerplate supports CRUD and other standard functionality expected of a resource.App Builder generated code allows RESTful endpoints to do the below.
-
Create & Update:
All field types supported are semantic field types and not necessarily database field types.
-
Delete:
Soft delete is also supported.
-
Retrieve:
A retrieve protocol which is 95% similar to what Strapi supports.
GraphQL support for queries & mutations needs to be created.
We are using TypeORM as the ORM tool internally, so we are able to support multiple RDBMSs (currently we are testing against PG)
Coded
-
user key related functionality
-
soft delete
-
data source agnostic abstraction both in terms of number of data source & type of data sources.
-
media field & storage - allows to store media abstraction using providers filesystem & s3 are supported, azure, SFTP etc to be added. Uploading & saving media to respective storage providers can be done asynchronously.
-
Handling around each field type, especially semantic fields.
Groomed backlog
-
primary key abstraction
-
generic import functionality
-
generic audit functionality
-
generic export functionality
-
generic saved queries
-
Workflow engine
-
Security rules for record rule based access control
Not groomed backlog
-
internationalisation
-
encryption at rest functionality at the field level
-
Metabase style dashboard builder
-
Drag and drop UI builder for layout management of solid core admin backend.
- IAM
Identity & authentication management. This comes with a pre-built abstraction around users, roles & permissions.
This module implements RBAC & permission based access control.
This module also supports standard workflows around
-
User signup
-
User login
-
Forgot password
-
Reset password
Authentication is provided by means of a "Provider" abstraction. Currently we are supporting
-
Password based authentication provider
-
Passwordless authentication provider (OTP based)
-
Google
-
Meta/Facebook (*)
-
X/Twitter (*)
-
…
-
…
All authentication works using JWT tokens only.
We also support use-cases around refresh tokens, token expiry, etc.
Authorization is implemented by means of our own Roles & Permissions tables. One pattern we are following for permissions is that each permission = one controller handler method.
-
Queues
-
Media management