feat: 添加核心金融模型、通知模型以及路由和通知仓库的基础结构
This commit is contained in:
@@ -835,35 +835,6 @@ func (AllocationRecordDetail) TableName() string {
|
|||||||
return "allocation_record_details"
|
return "allocation_record_details"
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotificationType represents the type of notification
|
|
||||||
type NotificationType string
|
|
||||||
|
|
||||||
const (
|
|
||||||
NotificationTypeBudgetAlert NotificationType = "budget_alert" // 预算超支提醒
|
|
||||||
NotificationTypeRecurring NotificationType = "recurring" // 周期交易提醒
|
|
||||||
NotificationTypeSystem NotificationType = "system" // 系统公告
|
|
||||||
NotificationTypePaymentReminder NotificationType = "payment_reminder" // 还款提醒
|
|
||||||
NotificationTypeSavingsGoal NotificationType = "savings_goal" // 储蓄目标提醒
|
|
||||||
)
|
|
||||||
|
|
||||||
// Notification represents a user notification
|
|
||||||
// Feature: notification-center
|
|
||||||
type Notification struct {
|
|
||||||
ID uint `gorm:"primarykey" json:"id"`
|
|
||||||
UserID uint `gorm:"not null;index" json:"user_id"`
|
|
||||||
Type NotificationType `gorm:"size:30;not null;index" json:"type"`
|
|
||||||
Title string `gorm:"size:200;not null" json:"title"`
|
|
||||||
Content string `gorm:"size:1000;not null" json:"content"`
|
|
||||||
IsRead bool `gorm:"default:false;index" json:"is_read"`
|
|
||||||
RelatedID *uint `gorm:"index" json:"related_id,omitempty"` // 关联实体 ID (如预算、周期交易等)
|
|
||||||
CreatedAt time.Time `json:"created_at"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TableName specifies the table name for Notification
|
|
||||||
func (Notification) TableName() string {
|
|
||||||
return "notifications"
|
|
||||||
}
|
|
||||||
|
|
||||||
// AllModels returns all models for database migration
|
// AllModels returns all models for database migration
|
||||||
func AllModels() []interface{} {
|
func AllModels() []interface{} {
|
||||||
return []interface{}{
|
return []interface{}{
|
||||||
|
|||||||
@@ -8,21 +8,26 @@ import (
|
|||||||
type NotificationType string
|
type NotificationType string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
NotificationTypeSystem NotificationType = "system"
|
NotificationTypeSystem NotificationType = "system"
|
||||||
NotificationTypeAlert NotificationType = "alert"
|
NotificationTypeAlert NotificationType = "alert"
|
||||||
NotificationTypeInfo NotificationType = "info"
|
NotificationTypeInfo NotificationType = "info"
|
||||||
|
NotificationTypeBudgetAlert NotificationType = "budget_alert" // 预算超支提醒
|
||||||
|
NotificationTypeRecurring NotificationType = "recurring" // 周期交易提醒
|
||||||
|
NotificationTypePaymentReminder NotificationType = "payment_reminder" // 还款提醒
|
||||||
|
NotificationTypeSavingsGoal NotificationType = "savings_goal" // 储蓄目标提醒
|
||||||
)
|
)
|
||||||
|
|
||||||
// Notification represents a system notification for a user
|
// Notification represents a system notification for a user
|
||||||
type Notification struct {
|
type Notification struct {
|
||||||
BaseModel
|
BaseModel
|
||||||
UserID uint `gorm:"not null;index" json:"user_id"`
|
UserID uint `gorm:"not null;index" json:"user_id"`
|
||||||
Title string `gorm:"size:200;not null" json:"title"`
|
Title string `gorm:"size:200;not null" json:"title"`
|
||||||
Content string `gorm:"type:text;not null" json:"content"`
|
Content string `gorm:"type:text;not null" json:"content"`
|
||||||
Type NotificationType `gorm:"size:20;not null;default:'system'" json:"type"`
|
Type NotificationType `gorm:"size:30;not null;default:'system';index" json:"type"`
|
||||||
IsRead bool `gorm:"default:false" json:"is_read"`
|
IsRead bool `gorm:"default:false;index" json:"is_read"`
|
||||||
Link string `gorm:"size:255" json:"link,omitempty"` // Optional link to redirect
|
Link string `gorm:"size:255" json:"link,omitempty"` // Optional link to redirect
|
||||||
ReadAt *time.Time `json:"read_at,omitempty"`
|
ReadAt *time.Time `json:"read_at,omitempty"`
|
||||||
|
RelatedID *uint `gorm:"index" json:"related_id,omitempty"` // 关联实体 ID (如预算、周期交易等)
|
||||||
|
|
||||||
// Relationships
|
// Relationships
|
||||||
User User `gorm:"foreignKey:UserID" json:"-"`
|
User User `gorm:"foreignKey:UserID" json:"-"`
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package repository
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"accounting-app/internal/models"
|
"accounting-app/internal/models"
|
||||||
|
|
||||||
@@ -119,20 +120,12 @@ func (r *NotificationRepository) MarkAsRead(userID uint, id uint) error {
|
|||||||
|
|
||||||
// MarkAllAsRead marks all notifications as read for a user
|
// MarkAllAsRead marks all notifications as read for a user
|
||||||
func (r *NotificationRepository) MarkAllAsRead(userID uint) error {
|
func (r *NotificationRepository) MarkAllAsRead(userID uint) error {
|
||||||
<<<<<<< HEAD
|
return r.db.Model(&models.Notification{}).
|
||||||
return r.db.Model(&models.Notification{}).
|
|
||||||
Where("user_id = ? AND is_read = ?", userID, false).
|
|
||||||
Updates(map[string]interface{}{
|
|
||||||
"is_read": true,
|
|
||||||
"read_at": time.Now(),
|
|
||||||
}).Error
|
|
||||||
=======
|
|
||||||
if err := r.db.Model(&models.Notification{}).
|
|
||||||
Where("user_id = ? AND is_read = ?", userID, false).
|
Where("user_id = ? AND is_read = ?", userID, false).
|
||||||
Update("is_read", true).Error; err != nil {
|
Updates(map[string]interface{}{
|
||||||
return fmt.Errorf("failed to mark all notifications as read: %w", err)
|
"is_read": true,
|
||||||
}
|
"read_at": time.Now(),
|
||||||
return nil
|
}).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete deletes a notification by its ID
|
// Delete deletes a notification by its ID
|
||||||
@@ -156,5 +149,4 @@ func (r *NotificationRepository) GetUnreadCount(userID uint) (int64, error) {
|
|||||||
return 0, fmt.Errorf("failed to count unread notifications: %w", err)
|
return 0, fmt.Errorf("failed to count unread notifications: %w", err)
|
||||||
}
|
}
|
||||||
return count, nil
|
return count, nil
|
||||||
>>>>>>> 2dc66d478cbe3aafaae601f0939ab448b690365e
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,9 +92,6 @@ func Setup(db *gorm.DB, yunAPIClient *service.YunAPIClient, cfg *config.Config)
|
|||||||
interestService := service.NewInterestService(accountRepo, transactionRepo, db)
|
interestService := service.NewInterestService(accountRepo, transactionRepo, db)
|
||||||
userSettingsServiceWithAccounts := service.NewUserSettingsServiceWithAccountRepo(userSettingsRepo, accountRepo)
|
userSettingsServiceWithAccounts := service.NewUserSettingsServiceWithAccountRepo(userSettingsRepo, accountRepo)
|
||||||
|
|
||||||
// Feature: notification-center - Initialize notification service
|
|
||||||
notificationService := service.NewNotificationService(notificationRepo)
|
|
||||||
|
|
||||||
// Feature: health-score - Initialize health score service
|
// Feature: health-score - Initialize health score service
|
||||||
healthScoreService := service.NewHealthScoreService(reportRepo, accountRepo, budgetRepo)
|
healthScoreService := service.NewHealthScoreService(reportRepo, accountRepo, budgetRepo)
|
||||||
|
|
||||||
@@ -128,9 +125,6 @@ func Setup(db *gorm.DB, yunAPIClient *service.YunAPIClient, cfg *config.Config)
|
|||||||
defaultAccountHandler := handler.NewDefaultAccountHandler(userSettingsServiceWithAccounts)
|
defaultAccountHandler := handler.NewDefaultAccountHandler(userSettingsServiceWithAccounts)
|
||||||
interestHandler := handler.NewInterestHandler(interestService, nil)
|
interestHandler := handler.NewInterestHandler(interestService, nil)
|
||||||
|
|
||||||
// Feature: notification-center - Initialize notification handler
|
|
||||||
notificationHandler := handler.NewNotificationHandler(notificationService)
|
|
||||||
|
|
||||||
// Feature: health-score - Initialize health score handler
|
// Feature: health-score - Initialize health score handler
|
||||||
healthScoreHandler := handler.NewHealthScoreHandler(healthScoreService)
|
healthScoreHandler := handler.NewHealthScoreHandler(healthScoreService)
|
||||||
|
|
||||||
@@ -258,6 +252,9 @@ func Setup(db *gorm.DB, yunAPIClient *service.YunAPIClient, cfg *config.Config)
|
|||||||
|
|
||||||
// Register notification routes
|
// Register notification routes
|
||||||
notificationHandler.RegisterRoutes(protected)
|
notificationHandler.RegisterRoutes(protected)
|
||||||
|
|
||||||
|
// Register health score routes
|
||||||
|
healthScoreHandler.RegisterRoutes(protected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user