🗃️ Update modeling
This commit is contained in:
parent
5e76fa07b7
commit
516f5593de
@ -6,8 +6,12 @@
|
|||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":alien: Change avatar and banner id to string">
|
<list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":alien: Change avatar and banner id to string">
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/pkg/internal/models/unified.go" beforeDir="false" />
|
<change beforePath="$PROJECT_DIR$/pkg/internal/models/accounts.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/models/accounts.go" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/pkg/internal/services/notifications.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/services/notifications.go" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/pkg/internal/models/auth.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/models/auth.go" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/pkg/internal/models/events.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/models/events.go" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/pkg/internal/models/notifications.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/models/notifications.go" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/pkg/internal/server/api/userinfo_api.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/server/api/userinfo_api.go" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/pkg/internal/services/cleaner.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/services/cleaner.go" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
@ -2,11 +2,11 @@ package models
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"gorm.io/datatypes"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/samber/lo"
|
"github.com/samber/lo"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"gorm.io/datatypes"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Account struct {
|
type Account struct {
|
||||||
@ -21,6 +21,12 @@ type Account struct {
|
|||||||
SuspendedAt *time.Time `json:"suspended_at"`
|
SuspendedAt *time.Time `json:"suspended_at"`
|
||||||
PermNodes datatypes.JSONMap `json:"perm_nodes"`
|
PermNodes datatypes.JSONMap `json:"perm_nodes"`
|
||||||
|
|
||||||
|
AutomatedBy *Account `json:"automated_by" gorm:"foreignKey:AutomatedID"`
|
||||||
|
AutomatedID *uint `json:"automated_id"`
|
||||||
|
|
||||||
|
AffiliatedTo *Realm `json:"affiliated_to" gorm:"foreignKey:AffiliatedID"`
|
||||||
|
AffiliatedID *uint `json:"affiliated_id"`
|
||||||
|
|
||||||
Profile AccountProfile `json:"profile,omitempty"`
|
Profile AccountProfile `json:"profile,omitempty"`
|
||||||
Contacts []AccountContact `json:"contacts,omitempty"`
|
Contacts []AccountContact `json:"contacts,omitempty"`
|
||||||
Badges []Badge `json:"badges,omitempty"`
|
Badges []Badge `json:"badges,omitempty"`
|
||||||
@ -28,11 +34,6 @@ type Account struct {
|
|||||||
Tickets []AuthTicket `json:"tickets,omitempty"`
|
Tickets []AuthTicket `json:"tickets,omitempty"`
|
||||||
Factors []AuthFactor `json:"factors,omitempty"`
|
Factors []AuthFactor `json:"factors,omitempty"`
|
||||||
|
|
||||||
Events []ActionEvent `json:"events,omitempty"`
|
|
||||||
|
|
||||||
Notifications []Notification `json:"notifications,omitempty"`
|
|
||||||
NotifySubscribers []NotificationSubscriber `json:"notify_subscribers,omitempty"`
|
|
||||||
|
|
||||||
Relations []AccountRelationship `json:"relations,omitempty" gorm:"foreignKey:AccountID"`
|
Relations []AccountRelationship `json:"relations,omitempty" gorm:"foreignKey:AccountID"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,9 +17,11 @@ const (
|
|||||||
type AuthFactor struct {
|
type AuthFactor struct {
|
||||||
BaseModel
|
BaseModel
|
||||||
|
|
||||||
Type int8 `json:"type"`
|
Type int8 `json:"type"`
|
||||||
Secret string `json:"-"`
|
Secret string `json:"-"`
|
||||||
Config JSONMap `json:"config"`
|
Config JSONMap `json:"config"`
|
||||||
|
|
||||||
|
Account Account `json:"account"`
|
||||||
AccountID uint `json:"account_id"`
|
AccountID uint `json:"account_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,7 +43,11 @@ type AuthTicket struct {
|
|||||||
LastGrantAt *time.Time `json:"last_grant_at"`
|
LastGrantAt *time.Time `json:"last_grant_at"`
|
||||||
Nonce *string `json:"nonce"`
|
Nonce *string `json:"nonce"`
|
||||||
ClientID *uint `json:"client_id"`
|
ClientID *uint `json:"client_id"`
|
||||||
AccountID uint `json:"account_id"`
|
|
||||||
|
Account Account `json:"account"`
|
||||||
|
AccountID uint `json:"account_id"`
|
||||||
|
|
||||||
|
IsApiKey bool `json:"is_api_key"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v AuthTicket) IsAvailable() error {
|
func (v AuthTicket) IsAvailable() error {
|
||||||
|
@ -8,5 +8,7 @@ type ActionEvent struct {
|
|||||||
Location string `json:"location"`
|
Location string `json:"location"`
|
||||||
IpAddress string `json:"ip_address"`
|
IpAddress string `json:"ip_address"`
|
||||||
UserAgent string `json:"user_agent"`
|
UserAgent string `json:"user_agent"`
|
||||||
AccountID uint `json:"account_id"`
|
|
||||||
|
Account Account `json:"account"`
|
||||||
|
AccountID uint `json:"account_id"`
|
||||||
}
|
}
|
||||||
|
@ -7,15 +7,17 @@ import (
|
|||||||
type Notification struct {
|
type Notification struct {
|
||||||
BaseModel
|
BaseModel
|
||||||
|
|
||||||
Topic string `json:"topic"`
|
Topic string `json:"topic"`
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
Subtitle *string `json:"subtitle"`
|
Subtitle *string `json:"subtitle"`
|
||||||
Body string `json:"body"`
|
Body string `json:"body"`
|
||||||
Metadata datatypes.JSONMap `json:"metadata"`
|
Metadata datatypes.JSONMap `json:"metadata"`
|
||||||
Avatar *string `json:"avatar"`
|
Avatar *string `json:"avatar"`
|
||||||
Picture *string `json:"picture"`
|
Picture *string `json:"picture"`
|
||||||
AccountID uint `json:"account_id"`
|
SenderID *uint `json:"sender_id"`
|
||||||
SenderID *uint `json:"sender_id"`
|
|
||||||
|
Account Account `json:"account"`
|
||||||
|
AccountID uint `json:"account_id"`
|
||||||
|
|
||||||
IsRealtime bool `json:"is_realtime" gorm:"-"`
|
IsRealtime bool `json:"is_realtime" gorm:"-"`
|
||||||
IsForcePush bool `json:"is_force_push" gorm:"-"`
|
IsForcePush bool `json:"is_force_push" gorm:"-"`
|
||||||
@ -33,5 +35,7 @@ type NotificationSubscriber struct {
|
|||||||
Provider string `json:"provider"`
|
Provider string `json:"provider"`
|
||||||
DeviceID string `json:"device_id" gorm:"uniqueIndex"`
|
DeviceID string `json:"device_id" gorm:"uniqueIndex"`
|
||||||
DeviceToken string `json:"device_token"`
|
DeviceToken string `json:"device_token"`
|
||||||
AccountID uint `json:"account_id"`
|
|
||||||
|
Account Account `json:"account"`
|
||||||
|
AccountID uint `json:"account_id"`
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
"gorm.io/gorm"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.solsynth.dev/hydrogen/passport/pkg/internal/database"
|
"git.solsynth.dev/hydrogen/passport/pkg/internal/database"
|
||||||
@ -17,7 +19,10 @@ func getOtherUserinfo(c *fiber.Ctx) error {
|
|||||||
if err := database.C.
|
if err := database.C.
|
||||||
Where(&models.Account{Name: alias}).
|
Where(&models.Account{Name: alias}).
|
||||||
Preload("Profile").
|
Preload("Profile").
|
||||||
Preload("Badges").
|
Preload("Badges", func(db *gorm.DB) *gorm.DB {
|
||||||
|
prefix := viper.GetString("database.prefix")
|
||||||
|
return db.Order(fmt.Sprintf("%sbadges.type DESC", prefix))
|
||||||
|
}).
|
||||||
First(&account).Error; err != nil {
|
First(&account).Error; err != nil {
|
||||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,9 @@ package services
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"git.solsynth.dev/hydrogen/passport/pkg/internal/database"
|
"git.solsynth.dev/hydrogen/passport/pkg/internal/database"
|
||||||
|
"git.solsynth.dev/hydrogen/passport/pkg/internal/models"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func DoAutoDatabaseCleanup() {
|
func DoAutoDatabaseCleanup() {
|
||||||
@ -17,5 +19,8 @@ func DoAutoDatabaseCleanup() {
|
|||||||
count += tx.RowsAffected
|
count += tx.RowsAffected
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deadline := time.Now().Add(-30 * 24 * time.Hour)
|
||||||
|
database.C.Unscoped().Where("created_at <= ?", deadline).Delete(&models.Notification{})
|
||||||
|
|
||||||
log.Debug().Int64("affected", count).Msg("Clean up entire database accomplished.")
|
log.Debug().Int64("affected", count).Msg("Clean up entire database accomplished.")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user