🗃️ Update modeling
This commit is contained in:
		
							
								
								
									
										8
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								.idea/workspace.xml
									
									
									
										generated
									
									
									
								
							| @@ -6,8 +6,12 @@ | ||||
|   <component name="ChangeListManager"> | ||||
|     <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$/pkg/internal/models/unified.go" beforeDir="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/accounts.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/models/accounts.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> | ||||
|     <option name="SHOW_DIALOG" value="false" /> | ||||
|     <option name="HIGHLIGHT_CONFLICTS" value="true" /> | ||||
|   | ||||
| @@ -2,11 +2,11 @@ package models | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"gorm.io/datatypes" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/samber/lo" | ||||
| 	"github.com/spf13/viper" | ||||
| 	"gorm.io/datatypes" | ||||
| ) | ||||
|  | ||||
| type Account struct { | ||||
| @@ -21,6 +21,12 @@ type Account struct { | ||||
| 	SuspendedAt *time.Time        `json:"suspended_at"` | ||||
| 	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"` | ||||
| 	Contacts []AccountContact `json:"contacts,omitempty"` | ||||
| 	Badges   []Badge          `json:"badges,omitempty"` | ||||
| @@ -28,11 +34,6 @@ type Account struct { | ||||
| 	Tickets []AuthTicket `json:"tickets,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"` | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -17,9 +17,11 @@ const ( | ||||
| type AuthFactor struct { | ||||
| 	BaseModel | ||||
|  | ||||
| 	Type      int8    `json:"type"` | ||||
| 	Secret    string  `json:"-"` | ||||
| 	Config    JSONMap `json:"config"` | ||||
| 	Type   int8    `json:"type"` | ||||
| 	Secret string  `json:"-"` | ||||
| 	Config JSONMap `json:"config"` | ||||
|  | ||||
| 	Account   Account `json:"account"` | ||||
| 	AccountID uint    `json:"account_id"` | ||||
| } | ||||
|  | ||||
| @@ -41,7 +43,11 @@ type AuthTicket struct { | ||||
| 	LastGrantAt         *time.Time                  `json:"last_grant_at"` | ||||
| 	Nonce               *string                     `json:"nonce"` | ||||
| 	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 { | ||||
|   | ||||
| @@ -8,5 +8,7 @@ type ActionEvent struct { | ||||
| 	Location  string `json:"location"` | ||||
| 	IpAddress string `json:"ip_address"` | ||||
| 	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 { | ||||
| 	BaseModel | ||||
|  | ||||
| 	Topic     string            `json:"topic"` | ||||
| 	Title     string            `json:"title"` | ||||
| 	Subtitle  *string           `json:"subtitle"` | ||||
| 	Body      string            `json:"body"` | ||||
| 	Metadata  datatypes.JSONMap `json:"metadata"` | ||||
| 	Avatar    *string           `json:"avatar"` | ||||
| 	Picture   *string           `json:"picture"` | ||||
| 	AccountID uint              `json:"account_id"` | ||||
| 	SenderID  *uint             `json:"sender_id"` | ||||
| 	Topic    string            `json:"topic"` | ||||
| 	Title    string            `json:"title"` | ||||
| 	Subtitle *string           `json:"subtitle"` | ||||
| 	Body     string            `json:"body"` | ||||
| 	Metadata datatypes.JSONMap `json:"metadata"` | ||||
| 	Avatar   *string           `json:"avatar"` | ||||
| 	Picture  *string           `json:"picture"` | ||||
| 	SenderID *uint             `json:"sender_id"` | ||||
|  | ||||
| 	Account   Account `json:"account"` | ||||
| 	AccountID uint    `json:"account_id"` | ||||
|  | ||||
| 	IsRealtime  bool `json:"is_realtime" gorm:"-"` | ||||
| 	IsForcePush bool `json:"is_force_push" gorm:"-"` | ||||
| @@ -33,5 +35,7 @@ type NotificationSubscriber struct { | ||||
| 	Provider    string `json:"provider"` | ||||
| 	DeviceID    string `json:"device_id" gorm:"uniqueIndex"` | ||||
| 	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 ( | ||||
| 	"fmt" | ||||
| 	"github.com/spf13/viper" | ||||
| 	"gorm.io/gorm" | ||||
| 	"strings" | ||||
|  | ||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/internal/database" | ||||
| @@ -17,7 +19,10 @@ func getOtherUserinfo(c *fiber.Ctx) error { | ||||
| 	if err := database.C. | ||||
| 		Where(&models.Account{Name: alias}). | ||||
| 		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 { | ||||
| 		return fiber.NewError(fiber.StatusBadRequest, err.Error()) | ||||
| 	} | ||||
|   | ||||
| @@ -2,7 +2,9 @@ package services | ||||
|  | ||||
| import ( | ||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/internal/database" | ||||
| 	"git.solsynth.dev/hydrogen/passport/pkg/internal/models" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| func DoAutoDatabaseCleanup() { | ||||
| @@ -17,5 +19,8 @@ func DoAutoDatabaseCleanup() { | ||||
| 		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.") | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user