diff --git a/.gitignore b/.gitignore
index 319d3e3..ed963c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
target
-.env
\ No newline at end of file
+.env
+.trae
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..b6b1ecf
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,10 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 已忽略包含查询文件的默认文件夹
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
diff --git a/.idea/astarcup-backend.iml b/.idea/astarcup-backend.iml
new file mode 100644
index 0000000..57d45b9
--- /dev/null
+++ b/.idea/astarcup-backend.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..5796d3c
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ postgresql
+ true
+ 本地
+ org.postgresql.Driver
+ jdbc:postgresql://192.168.31.247:5432/postgres
+ $ProjectFileDir$
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..0acf639
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/astarcup/migration/src/m20260211_140546_user.rs b/astarcup/migration/src/m20260211_140546_user.rs
index a3e9d37..592efac 100644
--- a/astarcup/migration/src/m20260211_140546_user.rs
+++ b/astarcup/migration/src/m20260211_140546_user.rs
@@ -1,4 +1,5 @@
use sea_orm_migration::{prelude::*, schema::*};
+use sea_query::extension::postgres::Type;
#[derive(DeriveMigrationName)]
pub struct Migration;
@@ -6,6 +7,21 @@ pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager.create_type(
+ Type::create()
+ .as_enum(Alias::new("userstate"))
+ .values([Alias::new("active"),Alias::new("approved"),Alias::new("banned"),Alias::new("ignored")])
+ .to_owned(),
+ )
+ .await?;
+ manager
+ .create_type(
+ Type::create()
+ .as_enum(Alias::new("usergroup"))
+ .values([Alias::new("player"),Alias::new("admin"),Alias::new("mapooler"),Alias::new("tester")])
+ .to_owned(),
+ )
+ .await?;
manager
.create_table(
Table::create()
@@ -18,7 +34,12 @@ impl MigrationTrait for Migration {
.auto_increment()
.primary_key(),
)
- .col(ColumnDef::new(User::OsuId).string().not_null().unique_key())
+ .col(
+ ColumnDef::new(User::OsuId)
+ .integer()
+ .not_null()
+ .unique_key(),
+ )
.col(
ColumnDef::new(User::Username)
.string()
@@ -33,19 +54,13 @@ impl MigrationTrait for Migration {
.col(ColumnDef::new(User::CountryRank).integer().null())
.col(
ColumnDef::new(User::UserState)
- .enumeration(
- "userstate",
- vec!["active", "approved", "banned", "ignored"],
- )
+ .custom(Alias::new("userstate"))
.not_null()
.default("active"),
)
.col(
ColumnDef::new(User::UserGroup)
- .enumeration(
- "usergroup",
- vec!["player", "admin", "mappooler", "tester"],
- )
+ .custom(Alias::new("usergroup"))
.not_null()
.default("player"),
)
@@ -65,7 +80,6 @@ impl MigrationTrait for Migration {
.not_null()
.default(Expr::current_timestamp()),
)
- .col(ColumnDef::new(User::CreatedAt).timestamp().null())
.to_owned(),
)
.await?;
@@ -74,6 +88,8 @@ impl MigrationTrait for Migration {
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager.drop_type(Type::drop().name(Alias::new("userstate")).to_owned()).await?;
+ manager.drop_type(Type::drop().name(Alias::new("usergroup")).to_owned()).await?;
manager
.drop_table(Table::drop().table(User::Table).to_owned())
.await
@@ -90,11 +106,14 @@ enum User {
AvatarUrl,
Pp,
GlobalRank,
+ CountryCode,
+ CountryRank,
UserState,
UserGroup,
Season,
GuServerUserId,
GuServerUsername,
+ GuServerBindAt,
CreatedAt,
UpdatedAt,
}
diff --git a/astarcup/migration/src/m20260211_140547_map_selections.rs b/astarcup/migration/src/m20260211_140547_map_selections.rs
index e500017..8e49df3 100644
--- a/astarcup/migration/src/m20260211_140547_map_selections.rs
+++ b/astarcup/migration/src/m20260211_140547_map_selections.rs
@@ -1,4 +1,5 @@
use sea_orm_migration::{prelude::*, schema::*};
+use crate::extension::postgres::Type;
#[derive(DeriveMigrationName)]
pub struct Migration;
@@ -6,6 +7,22 @@ pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .create_type(
+ Type::create()
+ .as_enum(Alias::new("mode"))
+ .values([Alias::new("std"),Alias::new("taiko"),Alias::new("ctb"),Alias::new("mania")])
+ .to_owned(),
+ )
+ .await?;
+ manager
+ .create_type(
+ Type::create()
+ .as_enum(Alias::new("category"))
+ .values([Alias::new("qua"),Alias::new("ro16"),Alias::new("qf"),Alias::new("sf"),Alias::new("f"),Alias::new("gf")])
+ .to_owned(),
+ )
+ .await?;
manager
.create_table(
Table::create()
@@ -42,38 +59,71 @@ impl MigrationTrait for Migration {
.col(ColumnDef::new(MapSelections::Cs).decimal().null())
.col(ColumnDef::new(MapSelections::Od).decimal().null())
.col(ColumnDef::new(MapSelections::Hp).decimal().null())
- .col(ColumnDef::new(MapSelections::SelectedMods).json().null())
+ .col(
+ ColumnDef::new(MapSelections::Mode)
+ .custom(Alias::new("mode"))
+ .not_null()
+ .default("std"),
+ )
+ .col(ColumnDef::new(MapSelections::Mods).json().null())
+ .col(
+ ColumnDef::new(MapSelections::SelectedModName)
+ .string()
+ .null(),
+ )
.col(
ColumnDef::new(MapSelections::SelectedModPosition)
.integer()
.null(),
)
- .col(ColumnDef::new(MapSelections::Comment).text().null())
+ .col(ColumnDef::new(MapSelections::Comment).string().null())
.col(ColumnDef::new(MapSelections::SelectedBy).integer().null())
.foreign_key(
ForeignKey::create()
.from(MapSelections::Table, MapSelections::SelectedBy)
- .to(Users::Table, Users::Id),
+ .to(User::Table, User::Id),
)
.col(
ColumnDef::new(MapSelections::SelectedAt)
.timestamp()
.not_null(),
)
- .col(ColumnDef::new(MapSelections::Season).string().not_null())
- .col(ColumnDef::new(MapSelections::Category).string().not_null())
- .col(ColumnDef::new(MapSelections::CoverUrl).text().null())
+ .col(
+ ColumnDef::new(MapSelections::Season)
+ .integer()
+ .not_null()
+ .default(1),
+ )
+ .col(
+ ColumnDef::new(MapSelections::Category)
+ .custom(Alias::new("category"))
+ .not_null()
+ .default("qua"),
+ )
+ .col(ColumnDef::new(MapSelections::CoverUrl).string().null())
.col(
ColumnDef::new(MapSelections::IsApproved)
.boolean()
.null()
- .default(Expr::bool(false)),
+ .default(false),
)
.col(
ColumnDef::new(MapSelections::IsNeedTest)
.boolean()
.null()
- .default(Expr::bool(false)),
+ .default(false),
+ )
+ .col(
+ ColumnDef::new(MapSelections::IsOrigin)
+ .boolean()
+ .null()
+ .default(false),
+ )
+ .col(
+ ColumnDef::new(MapSelections::IsCustome)
+ .boolean()
+ .null()
+ .default(false),
)
.col(
ColumnDef::new(MapSelections::CreatedAt)
@@ -95,6 +145,8 @@ impl MigrationTrait for Migration {
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager.drop_type(Type::drop().name(Alias::new("mode")).to_owned()).await?;
+ manager.drop_type(Type::drop().name(Alias::new("category")).to_owned()).await?;
manager
.drop_table(Table::drop().table(MapSelections::Table).to_owned())
.await
@@ -106,7 +158,7 @@ enum MapSelections {
Table,
Id,
BeatmapId,
- BeatmapsetId,
+ BeatmapSetId,
Title,
TitleUnicode,
Artist,
@@ -121,17 +173,26 @@ enum MapSelections {
Cs,
Od,
Hp,
- SelectedMods,
- ModPosition,
+ Mode,
+ Mods,
+ SelectedModName,
+ SelectedModPosition,
Comment,
SelectedBy,
SelectedAt,
Season,
Category,
- Url,
CoverUrl,
- Approved,
- Padding,
+ IsApproved,
+ IsNeedTest,
+ IsOrigin,
+ IsCustome,
CreatedAt,
UpdatedAt,
}
+
+#[derive(DeriveIden)]
+enum User {
+ Table,
+ Id,
+}
diff --git a/astarcup/migration/src/m20260211_140548_match_rooms.rs b/astarcup/migration/src/m20260211_140548_match_rooms.rs
index a1f491e..e3e04f1 100644
--- a/astarcup/migration/src/m20260211_140548_match_rooms.rs
+++ b/astarcup/migration/src/m20260211_140548_match_rooms.rs
@@ -6,6 +6,10 @@ pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .create_type()
+ .create_enum("status", vec!["available", "scheduled", "completed"])
+ .await?;
manager
.create_table(
Table::create()
@@ -19,10 +23,8 @@ impl MigrationTrait for Migration {
.primary_key(),
)
.col(ColumnDef::new(MatchRooms::RoundNumber).integer().not_null())
- .col(ColumnDef::new(MatchRooms::MatchDate).date().not_null())
- .col(ColumnDef::new(MatchRooms::MatchTime).time().not_null())
+ .col(ColumnDef::new(MatchRooms::MatchTime).timestamp().not_null())
.col(ColumnDef::new(MatchRooms::MatchNumber).integer().not_null())
- .col(ColumnDef::new(MatchRooms::MaxParticipants).integer().null())
.col(
ColumnDef::new(MatchRooms::Status)
.enumeration("status", vec!["available", "scheduled", "completed"])
@@ -51,6 +53,13 @@ impl MigrationTrait for Migration {
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_table(Table::drop().table(MatchRooms::Table).to_owned())
+ .await?;
+ manager
+ .drop_type(
+ sea_orm_migration::prelude::Enum::drop()
+ .enum_name("status")
+ .to_owned(),
+ )
.await
}
}
@@ -61,10 +70,8 @@ enum MatchRooms {
Id,
RoomName,
RoundNumber,
- MatchDate,
MatchTime,
MatchNumber,
- MaxParticipants,
Status,
CreatedBy,
CreatedAt,
diff --git a/astarcup/migration/src/m20260211_140549_match_schedules.rs b/astarcup/migration/src/m20260211_140549_match_schedules.rs
index 8210d48..42256f4 100644
--- a/astarcup/migration/src/m20260211_140549_match_schedules.rs
+++ b/astarcup/migration/src/m20260211_140549_match_schedules.rs
@@ -6,6 +6,10 @@ pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .create_type()
+ .create_enum("status", vec!["available", "scheduled", "completed"])
+ .await?;
manager
.create_table(
Table::create()
@@ -20,24 +24,24 @@ impl MigrationTrait for Migration {
)
.col(ColumnDef::new(MatchSchedules::RoomId).integer().not_null())
.col(
- ColumnDef::new(MatchSchedules::Player1OsuId)
- .string()
+ ColumnDef::new(MatchSchedules::PlayerRedOsuId)
+ .integer()
.not_null(),
)
- .col(
- ColumnDef::new(MatchSchedules::Player1Username)
- .string()
- .not_null(),
+ .foreign_key(
+ ForeignKey::create()
+ .from(MatchSchedules::Table, MatchSchedules::PlayerRedOsuId)
+ .to(User::Table, User::OsuId),
)
.col(
- ColumnDef::new(MatchSchedules::Player2OsuId)
- .string()
+ ColumnDef::new(MatchSchedules::PlayerBlueOsuId)
+ .integer()
.not_null(),
)
- .col(
- ColumnDef::new(MatchSchedules::Player2Username)
- .string()
- .not_null(),
+ .foreign_key(
+ ForeignKey::create()
+ .from(MatchSchedules::Table, MatchSchedules::PlayerBlueOsuId)
+ .to(User::Table, User::OsuId),
)
.col(ColumnDef::new(MatchSchedules::RedScore).integer().null())
.col(ColumnDef::new(MatchSchedules::BlueScore).integer().null())
@@ -78,6 +82,13 @@ impl MigrationTrait for Migration {
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .drop_type(
+ sea_orm_migration::prelude::Enum::drop()
+ .enum_name("status")
+ .to_owned(),
+ )
+ .await?;
manager
.drop_table(Table::drop().table(MatchSchedules::Table).to_owned())
.await
@@ -89,10 +100,8 @@ enum MatchSchedules {
Table,
Id,
RoomId,
- Player1OsuId,
- Player1Username,
- Player2OsuId,
- Player2Username,
+ PlayerRedOsuId,
+ PlayerBlueOsuId,
RedScore,
BlueScore,
Status,
@@ -108,3 +117,8 @@ enum MatchRooms {
Table,
Id,
}
+#[derive(DeriveIden)]
+enum User {
+ Table,
+ OsuId,
+}
diff --git a/astarcup/migration/src/m20260211_140550_player_matchups.rs b/astarcup/migration/src/m20260211_140550_player_matchups.rs
index 3513b03..d6c9033 100644
--- a/astarcup/migration/src/m20260211_140550_player_matchups.rs
+++ b/astarcup/migration/src/m20260211_140550_player_matchups.rs
@@ -6,6 +6,14 @@ pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .create_type()
+ .create_enum("category", vec!["qua", "ro16", "qf", "sf", "f", "gf"])
+ .await?;
+ manager
+ .create_type()
+ .create_enum("status", vec!["available", "scheduled", "completed"])
+ .await?;
manager
.create_table(
Table::create()
@@ -19,22 +27,24 @@ impl MigrationTrait for Migration {
.primary_key(),
)
.col(
- ColumnDef::new(PlayerMatchups::Player1OsuId)
+ ColumnDef::new(PlayerMatchups::Season)
+ .integer()
+ .not_null()
+ .default(1),
+ )
+ .col(
+ ColumnDef::new(PlayerMatchups::Category)
+ .enumeration("category", vec!["qua", "ro16", "qf", "sf", "f", "gf"])
+ .not_null()
+ .default("qua"),
+ )
+ .col(
+ ColumnDef::new(PlayerMatchups::PlayerRedOsuId)
.string()
.not_null(),
)
.col(
- ColumnDef::new(PlayerMatchups::Player1Username)
- .string()
- .not_null(),
- )
- .col(
- ColumnDef::new(PlayerMatchups::Player2OsuId)
- .string()
- .not_null(),
- )
- .col(
- ColumnDef::new(PlayerMatchups::Player2Username)
+ ColumnDef::new(PlayerMatchups::PlayerBlueOsuId)
.string()
.not_null(),
)
@@ -43,11 +53,6 @@ impl MigrationTrait for Migration {
.enumeration("status", vec!["available", "scheduled", "completed"])
.null(),
)
- .col(
- ColumnDef::new(PlayerMatchups::CreatedBy)
- .string()
- .not_null(),
- )
.col(
ColumnDef::new(PlayerMatchups::CreatedAt)
.timestamp()
@@ -68,6 +73,20 @@ impl MigrationTrait for Migration {
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .drop_type(
+ sea_orm_migration::prelude::Enum::drop()
+ .enum_name("category")
+ .to_owned(),
+ )
+ .await?;
+ manager
+ .drop_type(
+ sea_orm_migration::prelude::Enum::drop()
+ .enum_name("status")
+ .to_owned(),
+ )
+ .await?;
manager
.drop_table(Table::drop().table(PlayerMatchups::Table).to_owned())
.await
@@ -78,12 +97,11 @@ impl MigrationTrait for Migration {
enum PlayerMatchups {
Table,
Id,
- Player1OsuId,
- Player1Username,
- Player2OsuId,
- Player2Username,
+ Season,
+ Category,
+ PlayerRedOsuId,
+ PlayerBlueOsuId,
Status,
- CreatedBy,
CreatedAt,
UpdatedAt,
}
diff --git a/astarcup/migration/src/m20260211_140551_messages.rs b/astarcup/migration/src/m20260211_140551_messages.rs
index 24f6552..06e40e9 100644
--- a/astarcup/migration/src/m20260211_140551_messages.rs
+++ b/astarcup/migration/src/m20260211_140551_messages.rs
@@ -6,6 +6,14 @@ pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .create_type()
+ .create_enum("type", vec!["match_invitation", "match_response", "system"])
+ .await?;
+ manager
+ .create_type()
+ .create_enum("status", vec!["available", "scheduled", "completed"])
+ .await?;
manager
.create_table(
Table::create()
@@ -58,6 +66,20 @@ impl MigrationTrait for Migration {
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .drop_type(
+ sea_orm_migration::prelude::Enum::drop()
+ .enum_name("type")
+ .to_owned(),
+ )
+ .await?;
+ manager
+ .drop_type(
+ sea_orm_migration::prelude::Enum::drop()
+ .enum_name("status")
+ .to_owned(),
+ )
+ .await?;
manager
.drop_table(Table::drop().table(Messages::Table).to_owned())
.await
diff --git a/astarcup/migration/src/m20260211_140552_map_comments.rs b/astarcup/migration/src/m20260211_140552_map_comments.rs
index eab2d9b..85fcdcd 100644
--- a/astarcup/migration/src/m20260211_140552_map_comments.rs
+++ b/astarcup/migration/src/m20260211_140552_map_comments.rs
@@ -24,7 +24,11 @@ impl MigrationTrait for Migration {
.not_null(),
)
.col(ColumnDef::new(MapComments::OsuId).string().not_null())
- .col(ColumnDef::new(MapComments::Username).string().not_null())
+ .foreign_key(
+ ForeignKey::create()
+ .from(MapComments::Table, MapComments::OsuId)
+ .to(User::Table, User::OsuId),
+ )
.col(ColumnDef::new(MapComments::Comment).text().null())
.col(
ColumnDef::new(MapComments::CreatedAt)
@@ -74,3 +78,8 @@ enum MapSelections {
Table,
Id,
}
+#[derive(DeriveIden)]
+enum User {
+ Table,
+ OsuId,
+}
diff --git a/astarcup/migration/src/m20260211_140553_tournament_settings.rs b/astarcup/migration/src/m20260211_140553_tournament_settings.rs
index 8964930..c4f99d4 100644
--- a/astarcup/migration/src/m20260211_140553_tournament_settings.rs
+++ b/astarcup/migration/src/m20260211_140553_tournament_settings.rs
@@ -6,6 +6,20 @@ pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .create_type()
+ .create_enum(
+ "tournament_setting_key",
+ vec![
+ "TournamentName",
+ "MaxPpForRegistration",
+ "MinPpForRegistration",
+ "CurrentSeason",
+ "CurrentSeasonStage",
+ "MappoolVisible",
+ ],
+ )
+ .await?;
manager
.create_table(
Table::create()
@@ -19,26 +33,24 @@ impl MigrationTrait for Migration {
.primary_key(),
)
.col(
- ColumnDef::new(TournamentSettings::TournamentName)
- .string()
+ ColumnDef::new(TournamentSettings::Key)
+ .enumeration(
+ "tournament_setting_key",
+ vec![
+ "TournamentName",
+ "MaxPpForRegistration",
+ "MinPpForRegistration",
+ "CurrentSeason",
+ "CurrentSeasonStage",
+ "MappoolVisible",
+ ],
+ )
.not_null(),
)
- .col(ColumnDef::new(TournamentSettings::MaxPpForRegistration).float().null())
- .col(ColumnDef::new(TournamentSettings::MinPpForRegistration).float().null())
- .col(ColumnDef::new(TournamentSettings::CurrentSeason).string().null())
- .col(ColumnDef::new(TournamentSettings::CurrentSeasonStage).string().null())
- .col(ColumnDef::new(TournamentSettings::MappoolVisible).integer().null())
.col(
- ColumnDef::new(TournamentSettings::CreatedAt)
- .timestamp()
- .not_null()
- .default(Expr::current_timestamp()),
- )
- .col(
- ColumnDef::new(TournamentSettings::UpdatedAt)
- .timestamp()
- .not_null()
- .default(Expr::current_timestamp()),
+ ColumnDef::new(TournamentSettings::Value)
+ .string()
+ .not_null(),
)
.to_owned(),
)
@@ -48,6 +60,13 @@ impl MigrationTrait for Migration {
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
+ manager
+ .drop_type(
+ sea_orm_migration::prelude::Enum::drop()
+ .enum_name("tournament_setting_key")
+ .to_owned(),
+ )
+ .await?;
manager
.drop_table(Table::drop().table(TournamentSettings::Table).to_owned())
.await
@@ -58,12 +77,6 @@ impl MigrationTrait for Migration {
enum TournamentSettings {
Table,
Id,
- TournamentName,
- MaxPpForRegistration,
- MinPpForRegistration,
- CurrentSeason,
- CurrentSeasonStage,
- MappoolVisible,
- CreatedAt,
- UpdatedAt,
+ Key,
+ Value,
}