aboutsummaryrefslogtreecommitdiff
path: root/migration/src/m0_init_tables.rs
blob: 6ce86e17af8445149ca6e36d007338dc68365a2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
use sea_orm_migration::{
    prelude::{extension::postgres::Type, *},
    schema::*,
    sea_orm::{EnumIter, Iterable},
};

#[derive(DeriveIden)]
enum Users {
    Table,
    Id,
    Username,
    PasswordHash,
    PasswordIssueDate,
    FirstName,
    LastName,
}

#[derive(DeriveIden)]
enum Queues {
    Table,
    Id,
    OwnerId,
    Name,
}

#[derive(DeriveIden)]
enum InviteTokens {
    Table,
    Id,
    Token,
    QueueId,
    Name,
    ExpirationDate,
}

#[derive(DeriveIden)]
enum AccessToQueue {
    Table,
    UserId,
    QueueId,
    InviteTokenId,
}

#[derive(DeriveIden)]
enum QueueElements {
    Table,
    Id,
    QueueId,
    UserId,
    Position,
    Status,
}

mod queue_element_status {
    use super::*;

    #[derive(DeriveIden)]
    #[sea_orm(iden = "queue_element_status_enum")]
    pub struct Iden;

    #[derive(Iden, EnumIter)]
    pub enum Items {
        Passed,
        Waiting,
    }
}

#[derive(DeriveMigrationName)]
pub struct Migration;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .create_table(
                Table::create()
                    .table(Users::Table)
                    .if_not_exists()
                    .col(pk_auto(Users::Id).big_integer())
                    .col(string(Users::Username).unique_key())
                    .col(string(Users::PasswordHash))
                    .col(timestamp(Users::PasswordIssueDate))
                    .col(string(Users::FirstName))
                    .col(string(Users::LastName))
                    .to_owned(),
            )
            .await?;

        manager
            .create_table(
                Table::create()
                    .table(Queues::Table)
                    .if_not_exists()
                    .col(pk_auto(Queues::Id).big_integer())
                    .col(big_integer(Queues::OwnerId))
                    .foreign_key(
                        ForeignKey::create()
                            .from(Queues::Table, Queues::OwnerId)
                            .to(Users::Table, Users::Id)
                            .on_delete(ForeignKeyAction::Cascade)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .col(string(Queues::Name))
                    .to_owned(),
            )
            .await?;

        manager
            .create_table(
                Table::create()
                    .table(InviteTokens::Table)
                    .if_not_exists()
                    .col(pk_auto(InviteTokens::Id).big_integer())
                    .col(uuid(InviteTokens::Token))
                    .col(big_integer(InviteTokens::QueueId))
                    .foreign_key(
                        ForeignKey::create()
                            .from(InviteTokens::Table, InviteTokens::QueueId)
                            .to(Queues::Table, Queues::Id)
                            .on_delete(ForeignKeyAction::Cascade)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .col(string(InviteTokens::Name))
                    .col(timestamp_null(InviteTokens::ExpirationDate))
                    .to_owned(),
            )
            .await?;

        manager
            .create_table(
                Table::create()
                    .table(AccessToQueue::Table)
                    .if_not_exists()
                    .col(big_integer(AccessToQueue::UserId))
                    .col(big_integer(AccessToQueue::QueueId))
                    .foreign_key(
                        ForeignKey::create()
                            .from(AccessToQueue::Table, AccessToQueue::UserId)
                            .to(Users::Table, Users::Id)
                            .on_delete(ForeignKeyAction::Cascade)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .foreign_key(
                        ForeignKey::create()
                            .from(AccessToQueue::Table, AccessToQueue::QueueId)
                            .to(Queues::Table, Queues::Id)
                            .on_delete(ForeignKeyAction::Cascade)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .col(big_integer(AccessToQueue::InviteTokenId))
                    .foreign_key(
                        ForeignKey::create()
                            .from(AccessToQueue::Table, AccessToQueue::InviteTokenId)
                            .to(InviteTokens::Table, InviteTokens::Id)
                            .on_delete(ForeignKeyAction::Cascade)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .primary_key(
                        Index::create()
                            .col(AccessToQueue::UserId)
                            .col(AccessToQueue::QueueId),
                    )
                    .to_owned(),
            )
            .await?;

        manager
            .create_type(
                Type::create()
                    .as_enum(queue_element_status::Iden)
                    .values(queue_element_status::Items::iter())
                    .to_owned(),
            )
            .await?;

        manager
            .create_table(
                Table::create()
                    .table(QueueElements::Table)
                    .if_not_exists()
                    .col(pk_auto(QueueElements::Id).big_integer())
                    .col(big_integer(QueueElements::QueueId))
                    .col(big_integer(QueueElements::UserId))
                    .col(
                        big_integer(QueueElements::Position)
                            .unique_key()
                            .auto_increment(),
                    )
                    .col(enumeration(
                        QueueElements::Status,
                        queue_element_status::Iden,
                        queue_element_status::Items::iter(),
                    ))
                    .foreign_key(
                        ForeignKey::create()
                            .from(QueueElements::Table, QueueElements::UserId)
                            .to(Users::Table, Users::Id)
                            .on_delete(ForeignKeyAction::Cascade)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .foreign_key(
                        ForeignKey::create()
                            .from(QueueElements::Table, QueueElements::QueueId)
                            .to(Queues::Table, Queues::Id)
                            .on_delete(ForeignKeyAction::Cascade)
                            .on_update(ForeignKeyAction::Cascade),
                    )
                    .to_owned(),
            )
            .await?;

        Ok(())
    }

    async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .drop_table(Table::drop().table(Users::Table).to_owned())
            .await?;

        manager
            .drop_table(Table::drop().table(Queues::Table).to_owned())
            .await?;

        manager
            .drop_table(Table::drop().table(InviteTokens::Table).to_owned())
            .await?;

        manager
            .drop_table(Table::drop().table(AccessToQueue::Table).to_owned())
            .await?;

        manager
            .drop_table(Table::drop().table(QueueElements::Table).to_owned())
            .await?;

        Ok(())
    }
}