migrator/migrations/
m20241025030906_users.rs1use sqlx::{Acquire, PgConnection, Postgres};
2use sqlx_migrator::Operation;
3use sqlx_migrator::error::Error;
4use sqlx_migrator::migration;
5use sqlx_migrator::vec_box;
6
7pub(crate) struct Users;
8migration!(
9 Postgres,
10 Users,
11 "backend",
12 "20241025030906_users",
13 vec_box![],
14 vec_box![MigrationOperation]
15);
16
17struct MigrationOperation;
18#[async_trait::async_trait]
19impl Operation<Postgres> for MigrationOperation {
20 async fn up(&self, conn: &mut PgConnection) -> Result<(), Error> {
21 let mut tx = conn.begin().await?;
22
23 sqlx::query(
24 "
25 CREATE TABLE users (
26 id TEXT PRIMARY KEY,
27 created TIMESTAMPTZ NOT NULL,
28 signed_in TIMESTAMPTZ NOT NULL,
29 username TEXT UNIQUE,
30 display_name TEXT
31 );
32 ",
33 )
34 .execute(&mut *tx)
35 .await?;
36
37 sqlx::query(
38 "
39 CREATE TYPE permission_level AS ENUM ('read', 'write', 'maintain', 'own');
40 ",
41 )
42 .execute(&mut *tx)
43 .await?;
44
45 sqlx::query(
46 "
47 CREATE TABLE permissions (
48 subject TEXT REFERENCES users (id),
49 object UUID NOT NULL REFERENCES refs (id),
50 level permission_level NOT NULL,
51 CONSTRAINT permissions_is_relation UNIQUE (subject, object)
52 );
53 ",
54 )
55 .execute(&mut *tx)
56 .await?;
57
58 sqlx::query(
59 "
60 CREATE INDEX ON permissions (object);
61 ",
62 )
63 .execute(&mut *tx)
64 .await?;
65
66 tx.commit().await?;
67 Ok(())
68 }
69
70 async fn down(&self, conn: &mut PgConnection) -> Result<(), Error> {
71 let mut tx = conn.begin().await?;
72
73 sqlx::query(
74 "
75 DROP TABLE permissions, users;
76 ",
77 )
78 .execute(&mut *tx)
79 .await?;
80
81 sqlx::query(
82 "
83 DROP TYPE permission_level;
84 ",
85 )
86 .execute(&mut *tx)
87 .await?;
88
89 tx.commit().await?;
90 Ok(())
91 }
92}