use crate::db::migration::sea_orm::timestamp::Timestamps;
use sea_orm_migration::{prelude::*, schema::*};
pub fn table<T: IntoTableRef>(name: T) -> TableCreateStatement {
timestamps(Table::create().table(name).if_not_exists().to_owned())
}
pub fn timestamps(mut table: TableCreateStatement) -> TableCreateStatement {
table
.col(timestamp_with_time_zone(Timestamps::CreatedAt).default(Expr::current_timestamp()))
.col(timestamp_with_time_zone(Timestamps::UpdatedAt).default(Expr::current_timestamp()))
.to_owned()
}
fn pk_bigint<T>(name: T) -> ColumnDef
where
T: IntoIden,
{
big_integer(name).primary_key().to_owned()
}
pub fn pk_bigint_identity<T>(name: T) -> ColumnDef
where
T: IntoIden,
{
pk_bigint(name)
.extra("GENERATED ALWAYS AS IDENTITY")
.to_owned()
}
#[derive(bon::Builder)]
pub struct IdentityOptions {
#[builder(default = true)]
always: bool,
#[builder(default = 1)]
start: i64,
#[builder(default = 1)]
increment: i64,
}
pub fn pk_bigint_identity_options<T>(name: T, options: IdentityOptions) -> ColumnDef
where
T: IntoIden,
{
let always = if options.always { " ALWAYS" } else { "" };
let generated = format!(
"GENERATED{} AS IDENTITY (START WITH {} INCREMENT BY {})",
always, options.start, options.increment
);
pk_bigint(name).extra(generated).to_owned()
}
pub fn pk_uuid<T>(name: T) -> ColumnDef
where
T: IntoIden,
{
uuid(name).primary_key().to_owned()
}
pub fn uuid_v4<T>(name: T) -> ColumnDef
where
T: IntoIden,
{
uuid_default(name, Expr::cust("uuid_generate_v4()"))
}
pub fn pk_uuid_v4<T>(name: T) -> ColumnDef
where
T: IntoIden,
{
uuid_v4(name).primary_key().to_owned()
}
pub fn uuid_v7<T>(name: T) -> ColumnDef
where
T: IntoIden,
{
uuid_default(name, Expr::cust("uuid_generate_v7()"))
}
pub fn pk_uuid_v7<T>(name: T) -> ColumnDef
where
T: IntoIden,
{
uuid_v7(name).primary_key().to_owned()
}
pub fn uuid_default<T, D>(name: T, default: D) -> ColumnDef
where
T: IntoIden,
D: Into<SimpleExpr>,
{
uuid(name).default(default).to_owned()
}
pub fn pk_uuid_default<T, D>(name: T, default: D) -> ColumnDef
where
T: IntoIden,
D: Into<SimpleExpr>,
{
uuid_default(name, default).primary_key().to_owned()
}
#[cfg(test)]
mod tests {
use super::*;
use crate::testing::snapshot::TestCase;
use insta::assert_snapshot;
use rstest::{fixture, rstest};
#[derive(DeriveIden)]
pub(crate) enum Foo {
Table,
Bar,
}
#[fixture]
#[cfg_attr(coverage_nightly, coverage(off))]
fn case() -> TestCase {
Default::default()
}
#[fixture]
#[cfg_attr(coverage_nightly, coverage(off))]
fn table_stmt() -> TableCreateStatement {
Table::create().table(Foo::Table).to_owned()
}
#[test]
#[cfg_attr(coverage_nightly, coverage(off))]
fn table() {
let statement = super::table(Foo::Table);
assert_snapshot!(statement.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn timestamps(_case: TestCase, table_stmt: TableCreateStatement) {
let table_stmt = super::timestamps(table_stmt);
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn pk_bigint(_case: TestCase, mut table_stmt: TableCreateStatement) {
table_stmt.col(super::pk_bigint(Foo::Bar));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn pk_bigint_identity(_case: TestCase, mut table_stmt: TableCreateStatement) {
table_stmt.col(super::pk_bigint_identity(Foo::Bar));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[case(true, 1, 1)]
#[case(false, 1, 1)]
#[case(true, -100, 1)]
#[case(true, 0, 1)]
#[cfg_attr(coverage_nightly, coverage(off))]
fn pk_bigint_identity_options(
_case: TestCase,
mut table_stmt: TableCreateStatement,
#[case] always: bool,
#[case] start: i64,
#[case] increment: i64,
) {
let options = IdentityOptions::builder()
.always(always)
.start(start)
.increment(increment)
.build();
table_stmt.col(super::pk_bigint_identity_options(Foo::Bar, options));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn pk_uuid(_case: TestCase, mut table_stmt: TableCreateStatement) {
table_stmt.col(super::pk_uuid(Foo::Bar));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn uuid_v4(_case: TestCase, mut table_stmt: TableCreateStatement) {
table_stmt.col(super::uuid_v4(Foo::Bar));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn pk_uuid_v4(_case: TestCase, mut table_stmt: TableCreateStatement) {
table_stmt.col(super::pk_uuid_v4(Foo::Bar));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn uuid_v7(_case: TestCase, mut table_stmt: TableCreateStatement) {
table_stmt.col(super::uuid_v7(Foo::Bar));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn pk_uuid_v7(_case: TestCase, mut table_stmt: TableCreateStatement) {
table_stmt.col(super::pk_uuid_v7(Foo::Bar));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn uuid_default(_case: TestCase, mut table_stmt: TableCreateStatement) {
table_stmt.col(super::uuid_default(
Foo::Bar,
Expr::cust("custom_uuid_fn()"),
));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
#[rstest]
#[cfg_attr(coverage_nightly, coverage(off))]
fn pk_uuid_default(_case: TestCase, mut table_stmt: TableCreateStatement) {
table_stmt.col(super::pk_uuid_default(
Foo::Bar,
Expr::cust("custom_uuid_fn()"),
));
assert_snapshot!(table_stmt.to_string(PostgresQueryBuilder));
}
}