web3-proxy/migration/src/m20220101_000001_create_table.rs

216 lines
6.6 KiB
Rust
Raw Normal View History

2022-07-26 07:53:38 +03:00
use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
2022-08-04 01:23:01 +03:00
// users
2022-08-03 03:27:26 +03:00
manager
.create_table(
Table::create()
.table(User::Table)
.col(
2022-08-04 20:18:54 +03:00
ColumnDef::new(User::Uuid)
.uuid()
2022-08-03 03:27:26 +03:00
.not_null()
2022-08-04 20:18:54 +03:00
.extra("DEFAULT (UUID_TO_BIN(UUID()))".to_string())
2022-08-03 03:27:26 +03:00
.primary_key(),
)
.col(
ColumnDef::new(User::Address)
.string_len(42)
.not_null()
.unique_key(),
)
.col(ColumnDef::new(User::Description).string().not_null())
2022-08-04 02:17:02 +03:00
.col(ColumnDef::new(User::Email).string())
2022-08-03 03:27:26 +03:00
.to_owned(),
)
.await?;
2022-07-26 07:53:38 +03:00
2022-08-04 01:23:01 +03:00
// secondary users
2022-07-26 07:53:38 +03:00
manager
.create_table(
Table::create()
2022-08-03 03:27:26 +03:00
.table(SecondaryUser::Table)
2022-07-26 07:53:38 +03:00
.col(
2022-08-04 20:18:54 +03:00
ColumnDef::new(SecondaryUser::Uuid)
.uuid()
2022-07-26 07:53:38 +03:00
.not_null()
2022-08-04 20:18:54 +03:00
.extra("DEFAULT (UUID_TO_BIN(UUID()))".to_string())
2022-07-26 07:53:38 +03:00
.primary_key(),
)
2022-08-04 20:18:54 +03:00
.col(ColumnDef::new(SecondaryUser::UserId).uuid().not_null())
2022-08-04 01:23:01 +03:00
.col(
ColumnDef::new(SecondaryUser::Address)
.string_len(42)
.not_null(),
)
2022-08-03 03:27:26 +03:00
.col(
ColumnDef::new(SecondaryUser::Description)
.string()
.not_null(),
)
.col(ColumnDef::new(SecondaryUser::Email).string().not_null())
.col(
ColumnDef::new(SecondaryUser::Role)
.enumeration("role", ["owner", "admin", "collaborator"])
.not_null(),
)
2022-08-04 20:18:54 +03:00
.index(sea_query::Index::create().col(SecondaryUser::Address))
2022-08-04 01:23:01 +03:00
.foreign_key(
sea_query::ForeignKey::create()
.from(SecondaryUser::Table, SecondaryUser::UserId)
2022-08-04 20:18:54 +03:00
.to(User::Table, User::Uuid),
2022-08-04 01:23:01 +03:00
)
2022-07-26 07:53:38 +03:00
.to_owned(),
)
2022-08-03 03:27:26 +03:00
.await?;
2022-08-04 01:23:01 +03:00
// block list for the transaction firewall
2022-08-03 03:27:26 +03:00
manager
.create_table(
Table::create()
.table(BlockList::Table)
.col(
2022-08-04 20:18:54 +03:00
ColumnDef::new(BlockList::Uuid)
.uuid()
2022-08-03 03:27:26 +03:00
.not_null()
2022-08-04 20:18:54 +03:00
.extra("DEFAULT (UUID_TO_BIN(UUID()))".to_string())
2022-08-03 03:27:26 +03:00
.primary_key(),
)
2022-08-04 01:23:01 +03:00
.col(
ColumnDef::new(BlockList::Address)
.string()
.not_null()
.unique_key(),
)
2022-08-03 03:27:26 +03:00
.col(ColumnDef::new(BlockList::Description).string().not_null())
.to_owned(),
)
.await?;
2022-08-04 01:23:01 +03:00
// api keys
2022-08-03 03:27:26 +03:00
manager
.create_table(
Table::create()
.table(UserKeys::Table)
.col(
2022-08-04 20:18:54 +03:00
ColumnDef::new(UserKeys::Uuid)
.uuid()
2022-08-03 03:27:26 +03:00
.not_null()
2022-08-04 20:18:54 +03:00
.extra("DEFAULT (UUID_TO_BIN(UUID()))".to_string())
2022-08-03 03:27:26 +03:00
.primary_key(),
)
2022-08-04 20:18:54 +03:00
.col(ColumnDef::new(UserKeys::UserUuid).uuid().not_null())
2022-08-04 01:23:01 +03:00
.col(
ColumnDef::new(UserKeys::ApiKey)
.string_len(32)
.not_null()
.unique_key(),
)
2022-08-03 03:27:26 +03:00
.col(ColumnDef::new(UserKeys::Description).string().not_null())
.col(
ColumnDef::new(UserKeys::PrivateTxs)
.boolean()
.default(true)
.not_null(),
)
.col(
ColumnDef::new(UserKeys::Active)
.boolean()
.default(true)
.not_null(),
)
2022-08-04 20:18:54 +03:00
.index(sea_query::Index::create().col(UserKeys::Active))
2022-08-04 01:23:01 +03:00
.foreign_key(
sea_query::ForeignKey::create()
2022-08-04 20:18:54 +03:00
.from(UserKeys::Table, UserKeys::UserUuid)
.to(User::Table, User::Uuid),
2022-08-04 01:23:01 +03:00
)
2022-08-03 03:27:26 +03:00
.to_owned(),
)
.await?;
2022-08-04 01:23:01 +03:00
// it worked!
2022-08-03 03:27:26 +03:00
Ok(())
2022-07-26 07:53:38 +03:00
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
2022-08-03 03:27:26 +03:00
.drop_table(Table::drop().table(User::Table).to_owned())
.await?;
manager
.drop_table(Table::drop().table(SecondaryUser::Table).to_owned())
.await?;
manager
.drop_table(Table::drop().table(BlockList::Table).to_owned())
.await?;
manager
.drop_table(Table::drop().table(UserKeys::Table).to_owned())
.await?;
Ok(())
2022-07-26 07:53:38 +03:00
}
}
/// Learn more at https://docs.rs/sea-query#iden
#[derive(Iden)]
2022-08-03 03:27:26 +03:00
enum User {
Table,
2022-08-04 20:18:54 +03:00
Uuid,
2022-08-03 03:27:26 +03:00
Address,
Description,
Email,
}
/*
-- TODO: foreign keys
-- TODO: how should we store addresses?
-- TODO: creation time?
-- TODO: permissions. likely similar to infura
// TODO: creation time?
*/
#[derive(Iden)]
enum SecondaryUser {
Table,
2022-08-04 20:18:54 +03:00
Uuid,
2022-08-03 03:27:26 +03:00
UserId,
Address,
Description,
Email,
Role,
}
// TODO: creation time?
#[derive(Iden)]
enum BlockList {
Table,
2022-08-04 20:18:54 +03:00
Uuid,
2022-08-03 03:27:26 +03:00
Address,
Description,
}
/*
-- TODO: foreign keys
-- TODO: index on api_key
-- TODO: what size for api_key
-- TODO: track active with a timestamp?
-- TODO: creation time?
-- TODO: requests_per_second INT,
-- TODO: requests_per_day INT,
-- TODO: more security features. likely similar to infura
*/
#[derive(Iden)]
enum UserKeys {
2022-07-26 07:53:38 +03:00
Table,
2022-08-04 20:18:54 +03:00
Uuid,
UserUuid,
2022-08-03 03:27:26 +03:00
ApiKey,
Description,
PrivateTxs,
Active,
2022-07-26 07:53:38 +03:00
}