From 413441e2f2266db58094bbf305ba736e5586708f Mon Sep 17 00:00:00 2001 From: Aspen Smith Date: Sat, 13 Apr 2024 10:31:55 -0400 Subject: feat(web/panettone): Create users table Create a (currently unused) table to store information about users. I'll be manually migrating over all the information about users into this table, then will make a subsequent CL to make the rest of the tables foreign-key into this table Change-Id: I1b1c4b50c4a61326df3382809f701947a2caf536 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11411 Autosubmit: aspen Tested-by: BuildkiteCI Reviewed-by: sterni --- .../migrations/3921488651-create-users-table.lisp | 6 ++++ web/panettone/src/model.lisp | 32 ++++++++++++++++++++-- web/panettone/src/packages.lisp | 5 ++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 web/panettone/src/migrations/3921488651-create-users-table.lisp diff --git a/web/panettone/src/migrations/3921488651-create-users-table.lisp b/web/panettone/src/migrations/3921488651-create-users-table.lisp new file mode 100644 index 0000000000..2598ab101e --- /dev/null +++ b/web/panettone/src/migrations/3921488651-create-users-table.lisp @@ -0,0 +1,6 @@ +"Add a table to store information about users, load the initial set of users +from the authentication provider, and change fks for other tables" + +(defun up () + (panettone.model:create-table-if-not-exists + 'panettone.model:user)) diff --git a/web/panettone/src/model.lisp b/web/panettone/src/model.lisp index 15fe4815be..a106e9479b 100644 --- a/web/panettone/src/model.lisp +++ b/web/panettone/src/model.lisp @@ -39,6 +39,22 @@ initialised at launch time.") ;;; Schema ;;; +(defclass user () + ((sub :col-type uuid :initarg :sub :accessor sub + :documentation + "ID for the user in the authentication provider. Taken from the `:SUB' + field in the JWT when the user first logged in") + (username :col-type string :initarg :username :accessor username) + (email :col-type string :initarg :email :accessor email)) + (:metaclass dao-class) + (:keys sub) + (:table-name users) + (:documentation + "Panettone users. Uses an external authentication provider.")) + +(deftable (user "users") + (!dao-def)) + (defclass user-settings () ((user-dn :col-type string :initarg :user-dn :accessor user-dn) (enable-email-notifications @@ -219,6 +235,17 @@ its new value will be formatted using ~A into NEW-VALUE")) (:documentation "Migration scripts that have been run on the database")) (deftable migration (!dao-def)) +;;; +;;; Utils +;;; + +(defun create-table-if-not-exists (name) + " Takes the name of a dao-class and creates the table identified by symbol by +executing all forms in its definition as found in the *tables* list, if it does +not already exist." + (unless (table-exists-p (dao-table-name name)) + (create-table name))) + ;;; ;;; Migrations ;;; @@ -571,8 +598,9 @@ explicitly subscribing to / unsubscribing from individual issues." ;; Creating new migrations (setq *migrations-dir* (merge-pathnames "migrations/")) - (generate-migration "add-issue-tsv" - :documentation "Add tsvector for full-text search of issues") + (generate-migration "create-users-table" + :documentation "Add a table to store information about users") + (load-migrations) ;; Running migrations (with-connection *pg-spec* diff --git a/web/panettone/src/packages.lisp b/web/panettone/src/packages.lisp index cc53be6cb0..8e77c0ff2b 100644 --- a/web/panettone/src/packages.lisp +++ b/web/panettone/src/packages.lisp @@ -42,6 +42,11 @@ :migrate :*pg-spec* + :create-table-if-not-exists + + :user + :sub :username :email + :user-settings :user-dn :enable-email-notifications-p :settings-for-user :update-user-settings :enable-email-notifications -- cgit 1.4.1