about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAspen Smith <root@gws.fyi>2024-04-13T14·31-0400
committeraspen <root@gws.fyi>2024-04-19T18·42+0000
commit413441e2f2266db58094bbf305ba736e5586708f (patch)
treee3af48dba4c2e4644ef317c72e987e02243c5cfb
parent594600cd4a253d652ff0dddd914c4fba4465a5e6 (diff)
feat(web/panettone): Create users table r/7963
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 <root@gws.fyi>
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
-rw-r--r--web/panettone/src/migrations/3921488651-create-users-table.lisp6
-rw-r--r--web/panettone/src/model.lisp32
-rw-r--r--web/panettone/src/packages.lisp5
3 files changed, 41 insertions, 2 deletions
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
@@ -220,6 +236,17 @@ its new value will be formatted using ~A into NEW-VALUE"))
 (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