Implement more endpoints & overhaul [2/n]

Drop LevelDB and move all the things to SQLite.

Implemented endpoints:
/api <unit, accessoryMaterialAll>
/api <unit, accessoryTab>
/live/continue
/live/partyList
/unit/favoriteAccessory (WIP)
/unit/sale

Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
2026-04-28 11:44:56 +08:00
parent 1500821f3e
commit 150ce674ad
218 changed files with 2993 additions and 2160 deletions
+11
View File
@@ -0,0 +1,11 @@
package accessorymodel
type Accessory struct {
AccessoryID int `xorm:"accessory_id pk"`
Exp int `xorm:"exp"`
SmileMax int `xorm:"smile_max"`
PureMax int `xorm:"pure_max"`
CoolMax int `xorm:"cool_max"`
DefaultMaxLevel int `xorm:"default_max_level"`
MaxLevel int `xorm:"max_level"`
}
+7
View File
@@ -0,0 +1,7 @@
package ghomemodel
type DeviceKey struct {
ID int `xorm:"id pk autoincr"`
DeviceID string `xorm:"device_id"`
RandKey string `xorm:"rand_key"`
}
+9
View File
@@ -0,0 +1,9 @@
package loginmodel
type AuthKey struct {
ID int `xorm:"id pk autoincr"`
AuthorizeToken string `xorm:"authorize_token"`
ClientToken string `xorm:"client_token"`
ServerToken string `xorm:"server_token"`
InsertDate string `xorm:"insert_date"`
}
+70
View File
@@ -0,0 +1,70 @@
package unitmodel
type CommonUnitData struct {
ID int `xorm:"id pk autoincr" json:"-"`
UnitNumber int `xorm:"unit_number" json:"-"`
UnitID int `xorm:"unit_id" json:"unit_id"`
UnitTypeID int `xorm:"unit_type_id" json:"unit_type_id"`
Name string `xorm:"name" json:"name"`
Eponym string `xorm:"eponym" json:"eponym"`
Rarity int `xorm:"rarity" json:"rarity"`
Attribute int `xorm:"attribute" json:"attribute"`
Smile int `xorm:"smile" json:"smile"`
Cute int `xorm:"cute" json:"cute"`
Cool int `xorm:"cool" json:"cool"`
Exp int `xorm:"exp" json:"exp"`
Level int `xorm:"level" json:"level"`
MaxLevel int `xorm:"max_level" json:"max_level"`
LevelLimitID int `xorm:"level_limit_id" json:"level_limit_id"`
Rank int `xorm:"rank" json:"rank"`
MaxRank int `xorm:"max_rank" json:"max_rank"`
Love int `xorm:"love" json:"love"`
MaxLove int `xorm:"max_love" json:"max_love"`
UnitSkillExp int `xorm:"unit_skill_exp" json:"unit_skill_exp"`
UnitSkillLevel int `xorm:"unit_skill_level" json:"unit_skill_level"`
MaxHp int `xorm:"max_hp" json:"max_hp"`
UnitRemovableSkillCapacity int `xorm:"unit_removable_skill_capacity" json:"unit_removable_skill_capacity"`
IsRankMax bool `xorm:"is_rank_max" json:"is_rank_max"`
IsLoveMax bool `xorm:"is_love_max" json:"is_love_max"`
IsLevelMax bool `xorm:"is_level_max" json:"is_level_max"`
IsSigned bool `xorm:"is_signed" json:"is_signed"`
IsSkillLevelMax bool `xorm:"is_skill_level_max" json:"is_skill_level_max"`
IsRemovableSkillCapacityMax bool `xorm:"is_removable_skill_capacity_max" json:"is_removable_skill_capacity_max"`
InsertDate int64 `xorm:"insert_date" json:"insert_date"`
}
type UnitDataMap struct {
UnitOwningUserID int `xorm:"unit_owning_user_id pk autoincr"`
FavoriteFlag bool `xorm:"favorite_flag"`
DisplayRank int `xorm:"display_rank"`
ID int `xorm:"id pk autoincr" json:"-"`
UnitID int `xorm:"unit_id" json:"unit_id"`
UnitTypeID int `xorm:"unit_type_id" json:"unit_type_id"`
Name string `xorm:"name" json:"name"`
Eponym string `xorm:"eponym" json:"eponym"`
Rarity int `xorm:"rarity" json:"rarity"`
Attribute int `xorm:"attribute" json:"attribute"`
Smile int `xorm:"smile" json:"smile"`
Cute int `xorm:"cute" json:"cute"`
Cool int `xorm:"cool" json:"cool"`
Exp int `xorm:"exp" json:"exp"`
Level int `xorm:"level" json:"level"`
MaxLevel int `xorm:"max_level" json:"max_level"`
LevelLimitID int `xorm:"level_limit_id" json:"level_limit_id"`
Rank int `xorm:"rank" json:"rank"`
MaxRank int `xorm:"max_rank" json:"max_rank"`
Love int `xorm:"love" json:"love"`
MaxLove int `xorm:"max_love" json:"max_love"`
UnitSkillExp int `xorm:"unit_skill_exp" json:"unit_skill_exp"`
UnitSkillLevel int `xorm:"unit_skill_level" json:"unit_skill_level"`
MaxHp int `xorm:"max_hp" json:"max_hp"`
UnitRemovableSkillCapacity int `xorm:"unit_removable_skill_capacity" json:"unit_removable_skill_capacity"`
IsRankMax bool `xorm:"is_rank_max" json:"is_rank_max"`
IsLoveMax bool `xorm:"is_love_max" json:"is_love_max"`
IsLevelMax bool `xorm:"is_level_max" json:"is_level_max"`
IsSigned bool `xorm:"is_signed" json:"is_signed"`
IsSkillLevelMax bool `xorm:"is_skill_level_max" json:"is_skill_level_max"`
IsRemovableSkillCapacityMax bool `xorm:"is_removable_skill_capacity_max" json:"is_removable_skill_capacity_max"`
InsertDate int64 `xorm:"insert_date" json:"insert_date"`
}
+38
View File
@@ -0,0 +1,38 @@
package unitmodel
type UnitM struct {
UnitId int `xorm:"unit_id pk"`
UnitNumber int `xorm:"unit_number"`
UnitTypeId int `xorm:"unit_type_id"`
AlbumSeriesId *int `xorm:"album_series_id"`
Eponym *string `xorm:"eponym"`
EponymEn string `xorm:"eponym_en"`
Name string `xorm:"name"`
NameEn *string `xorm:"name_en"`
NormalCardId int `xorm:"normal_card_id"`
RankMaxCardId int `xorm:"rank_max_card_id"`
NormalIconAsset string `xorm:"normal_icon_asset"`
NormalIconAssetEn *string `xorm:"normal_icon_asset_en"`
RankMaxIconAsset string `xorm:"rank_max_icon_asset"`
RankMaxIconAssetEn *string `xorm:"rank_max_icon_asset_en"`
NormalUnitNaviAssetId int `xorm:"normal_unit_navi_asset_id"`
RankMaxUnitNaviAssetId int `xorm:"rank_max_unit_navi_asset_id"`
Rarity int `xorm:"rarity"`
AttributeId int `xorm:"attribute_id"`
DefaultUnitSkillId *int `xorm:"default_unit_skill_id"`
SkillAssetVoiceId *int `xorm:"skill_asset_voice_id"`
DefaultLeaderSkillId *int `xorm:"default_leader_skill_id"`
DefaultRemovableSkillCapacity int `xorm:"default_removable_skill_capacity"`
MaxRemovableSkillCapacity int `xorm:"max_removable_skill_capacity"`
DisableRankUp int `xorm:"disable_rank_up"`
RankMin int `xorm:"rank_min"`
RankMax int `xorm:"rank_max"`
UnitLevelUpPatternId int `xorm:"unit_level_up_pattern_id"`
HpMax int `xorm:"hp_max"`
SmileMax int `xorm:"smile_max"`
PureMax int `xorm:"pure_max"`
CoolMax int `xorm:"cool_max"`
ReinforceItemRankUpCost *int `xorm:"reinforce_item_rank_up_cost"`
SubUnitTypeId *int `xorm:"sub_unit_type_id"`
ReleaseTag *string `xorm:"release_tag"`
}
+1 -1
View File
@@ -1,4 +1,4 @@
package user
package usermodel
type UserAccessoryWear struct {
ID int `xorm:"id pk autoincr"`
+1 -1
View File
@@ -1,4 +1,4 @@
package user
package usermodel
type UserDeck struct {
ID int `xorm:"id pk autoincr"`
+6 -5
View File
@@ -1,4 +1,4 @@
package user
package usermodel
type UserDeckUnit struct {
ID int `xorm:"id pk autoincr"`
@@ -11,12 +11,13 @@ type UserDeckUnit struct {
DisplayRank int `xorm:"display_rank"`
Love int `xorm:"love"`
UnitSkillLevel int `xorm:"unit_skill_level"`
IsRankMax int `xorm:"is_rank_max"`
IsLoveMax int `xorm:"is_love_max"`
IsLevelMax int `xorm:"is_level_max"`
IsSigned int `xorm:"is_signed"`
IsRankMax bool `xorm:"is_rank_max"`
IsLoveMax bool `xorm:"is_love_max"`
IsLevelMax bool `xorm:"is_level_max"`
IsSigned bool `xorm:"is_signed"`
BeforeLove int `xorm:"before_love"`
MaxLove int `xorm:"max_love"`
UserID int `xorm:"user_id"`
InsertDate int64 `xorm:"insert_date"`
}
+1 -1
View File
@@ -1,4 +1,4 @@
package user
package usermodel
type UserKey struct {
ID int `xorm:"id pk autoincr"`
+11
View File
@@ -0,0 +1,11 @@
package usermodel
import "honoka-chan/internal/constant"
type UserLiveGoal struct {
ID int `xorm:"id pk autoincr"`
LiveDifficultyID int `xorm:"live_difficulty_id"`
UserID int `xorm:"user_id"`
GoalType constant.LiveGoalType `xorm:"goal_type"`
CompletedAt int64 `xorm:"completed_at"`
}
@@ -0,0 +1,7 @@
package usermodel
type UserLiveInProgress struct {
ID int `xorm:"id pk autoincr"`
DeckID int `xorm:"deck_id"`
UserID int `xorm:"user_id"`
}
+144
View File
@@ -0,0 +1,144 @@
package usermodel
type UserLiveRecord struct {
ID int `xorm:"id pk autoincr"`
LiveDifficultyID int `xorm:"live_difficulty_id"`
DeckID int `xorm:"deck_id"`
TotalScore int `xorm:"total_score"` //
PerfectCnt int `xorm:"perfect_cnt"` //
GreatCnt int `xorm:"great_cnt"` //
GoodCnt int `xorm:"good_cnt"` //
BadCnt int `xorm:"bad_cnt"` //
MissCnt int `xorm:"miss_cnt"` //
MaxCombo int `xorm:"max_combo"`
IsSkillOn bool `xorm:"is_skill_on"`
LiveInfoJSON string `xorm:"live_info_json"`
PreciseListJSON string `xorm:"precise_list_json"`
DeckInfoJSON string `xorm:"deck_info_json"`
TapAdjust int `xorm:"tap_adjust"`
LiveSettingJSON string `xorm:"live_setting_json"`
CanReplay bool `xorm:"can_replay"`
TriggerLogJSON string `xorm:"trigger_log_json"`
UserID int `xorm:"user_id"`
UpdateDate string `xorm:"insert_date"`
}
// TODO: 转移到 schema 下
type NotesList struct {
TimingSec float64 `json:"timing_sec"`
NotesAttribute int `json:"notes_attribute"`
NotesLevel int `json:"notes_level"`
Effect int `json:"effect"`
EffectValue int `json:"effect_value"`
Position int `json:"position"`
}
type LiveInfo struct {
LiveDifficultyID int `json:"live_difficulty_id"`
IsRandom bool `json:"is_random"`
AcFlag int `json:"ac_flag"`
SwingFlag int `json:"swing_flag"`
NotesList []NotesList `json:"notes_list"`
}
// TODO: 转移到 schema 下
type PreciseList struct {
Count int `json:"count"`
Effect int `json:"effect"`
Accuracy int `json:"accuracy"`
Tap float64 `json:"tap"`
IsSame bool `json:"is_same"`
Release any `json:"release"`
Position int `json:"position"`
NoteNumber int `json:"note_number"`
FirstTouch any `json:"first_touch"`
Tp bool `json:"tp"`
Tpf any `json:"tpf"`
}
// TODO: 转移到 schema 下
type TotalStatus struct {
Hp int `json:"hp"`
Smile int `json:"smile"`
Cute int `json:"cute"`
Cool int `json:"cool"`
}
type CenterBonus struct {
Hp int `json:"hp"`
Smile int `json:"smile"`
Cute int `json:"cute"`
Cool int `json:"cool"`
}
type SiBonus struct {
Hp int `json:"hp"`
Smile int `json:"smile"`
Cute int `json:"cute"`
Cool int `json:"cool"`
}
type AccessoryInfo struct {
AccessoryOwningUserID int `json:"accessory_owning_user_id"`
AccessoryID int `json:"accessory_id"`
Exp int `json:"exp"`
NextExp int `json:"next_exp"`
Level int `json:"level"`
MaxLevel int `json:"max_level"`
RankUpCount int `json:"rank_up_count"`
FavoriteFlag bool `json:"favorite_flag"`
}
type UnitList struct {
UnitID int `json:"unit_id"`
Position int `json:"position"`
Level int `json:"level"`
LevelLimitID int `json:"level_limit_id"`
DisplayRank int `json:"display_rank"`
Love int `json:"love"`
UnitSkillLevel int `json:"unit_skill_level"`
IsRankMax bool `json:"is_rank_max"`
IsLoveMax bool `json:"is_love_max"`
IsLevelMax bool `json:"is_level_max"`
IsSigned bool `json:"is_signed"`
Rank int `json:"rank"`
MaxHp int `json:"max_hp"`
UnitRemovableSkillCapacity int `json:"unit_removable_skill_capacity"`
RemovableSkillIds []int `json:"removable_skill_ids"`
TotalStatus TotalStatus `json:"total_status"`
SiBonus SiBonus `json:"si_bonus"`
AccessoryInfo *AccessoryInfo `json:"accessory_info,omitempty"`
}
type DeckInfo struct {
LiveDifficultyID int `json:"live_difficulty_id"`
TotalStatus TotalStatus `json:"total_status"`
CenterBonus CenterBonus `json:"center_bonus"`
SiBonus SiBonus `json:"si_bonus"`
UnitList []UnitList `json:"unit_list"`
}
// TODO: 转移到 schema 下
type Icon struct {
NormalID int `json:"normal_id"`
JustID int `json:"just_id"`
SlideID int `json:"slide_id"`
}
type LiveSetting struct {
NotesSpeed float64 `json:"notes_speed"`
CutinBrightness int `json:"cutin_brightness"`
CutinType int `json:"cutin_type"`
EffectFlag bool `json:"effect_flag"`
StringSize int `json:"string_size"`
SeID int `json:"se_id"`
Icon Icon `json:"icon"`
BackgroundID int `json:"background_id"`
RandomValue int `json:"random_value"`
}
// TODO: 转移到 schema 下
type TriggerLog struct {
Position int `json:"position"`
ActivationRate int `json:"activation_rate"`
}
+1 -1
View File
@@ -1,4 +1,4 @@
package user
package usermodel
type UserPref struct {
ID int `xorm:"id pk autoincr"`
+1 -1
View File
@@ -1,4 +1,4 @@
package user
package usermodel
type Users struct {
ID int `xorm:"id pk autoincr"`
+1 -1
View File
@@ -1,4 +1,4 @@
package user
package usermodel
type UserUnit struct {
ID int `xorm:"id pk autoincr"`
+11
View File
@@ -0,0 +1,11 @@
package usermodel
type UserUnitData struct {
UnitOwningUserID int `xorm:"unit_owning_user_id pk autoincr"`
UnitID int `xorm:"unit_id"`
FavoriteFlag bool `xorm:"favorite_flag"`
DisplayRank int `xorm:"display_rank"`
UserID int `xorm:"user_id"`
InsertDate int64 `xorm:"insert_date"`
UpdateDate int64 `xorm:"update_date"`
}
+1 -1
View File
@@ -1,4 +1,4 @@
package user
package usermodel
type UserUnitSkillEquip struct {
ID int `xorm:"id pk autoincr"`