feat: 添加核心金融模型、通知模型以及路由和通知仓库的基础结构

This commit is contained in:
2026-01-28 08:38:18 +08:00
parent 5d834204dd
commit 0414401ada
4 changed files with 24 additions and 59 deletions

View File

@@ -835,35 +835,6 @@ func (AllocationRecordDetail) TableName() string {
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
func AllModels() []interface{} {
return []interface{}{

View File

@@ -11,6 +11,10 @@ const (
NotificationTypeSystem NotificationType = "system"
NotificationTypeAlert NotificationType = "alert"
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
@@ -19,10 +23,11 @@ type Notification struct {
UserID uint `gorm:"not null;index" json:"user_id"`
Title string `gorm:"size:200;not null" json:"title"`
Content string `gorm:"type:text;not null" json:"content"`
Type NotificationType `gorm:"size:20;not null;default:'system'" json:"type"`
IsRead bool `gorm:"default:false" json:"is_read"`
Type NotificationType `gorm:"size:30;not null;default:'system';index" json:"type"`
IsRead bool `gorm:"default:false;index" json:"is_read"`
Link string `gorm:"size:255" json:"link,omitempty"` // Optional link to redirect
ReadAt *time.Time `json:"read_at,omitempty"`
RelatedID *uint `gorm:"index" json:"related_id,omitempty"` // 关联实体 ID (如预算、周期交易等)
// Relationships
User User `gorm:"foreignKey:UserID" json:"-"`

View File

@@ -3,6 +3,7 @@ package repository
import (
"errors"
"fmt"
"time"
"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
func (r *NotificationRepository) MarkAllAsRead(userID uint) error {
<<<<<<< HEAD
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).
Update("is_read", true).Error; err != nil {
return fmt.Errorf("failed to mark all notifications as read: %w", err)
}
return nil
}
// 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 count, nil
>>>>>>> 2dc66d478cbe3aafaae601f0939ab448b690365e
}

View File

@@ -92,9 +92,6 @@ func Setup(db *gorm.DB, yunAPIClient *service.YunAPIClient, cfg *config.Config)
interestService := service.NewInterestService(accountRepo, transactionRepo, db)
userSettingsServiceWithAccounts := service.NewUserSettingsServiceWithAccountRepo(userSettingsRepo, accountRepo)
// Feature: notification-center - Initialize notification service
notificationService := service.NewNotificationService(notificationRepo)
// Feature: health-score - Initialize health score service
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)
interestHandler := handler.NewInterestHandler(interestService, nil)
// Feature: notification-center - Initialize notification handler
notificationHandler := handler.NewNotificationHandler(notificationService)
// Feature: health-score - Initialize health score handler
healthScoreHandler := handler.NewHealthScoreHandler(healthScoreService)
@@ -258,6 +252,9 @@ func Setup(db *gorm.DB, yunAPIClient *service.YunAPIClient, cfg *config.Config)
// Register notification routes
notificationHandler.RegisterRoutes(protected)
// Register health score routes
healthScoreHandler.RegisterRoutes(protected)
}
}