課題作成時にもTelegram/LINEに通知する機能を追加
This commit is contained in:
@@ -15,11 +15,13 @@ import (
|
|||||||
|
|
||||||
type AssignmentHandler struct {
|
type AssignmentHandler struct {
|
||||||
assignmentService *service.AssignmentService
|
assignmentService *service.AssignmentService
|
||||||
|
notificationService *service.NotificationService
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAssignmentHandler() *AssignmentHandler {
|
func NewAssignmentHandler(notificationService *service.NotificationService) *AssignmentHandler {
|
||||||
return &AssignmentHandler{
|
return &AssignmentHandler{
|
||||||
assignmentService: service.NewAssignmentService(),
|
assignmentService: service.NewAssignmentService(),
|
||||||
|
notificationService: notificationService,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,7 +231,7 @@ func (h *AssignmentHandler) Create(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_, err = h.assignmentService.Create(userID, title, description, subject, priority, dueDate, reminderEnabled, reminderAt, urgentReminderEnabled)
|
assignment, err := h.assignmentService.Create(userID, title, description, subject, priority, dueDate, reminderEnabled, reminderAt, urgentReminderEnabled)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
role, _ := c.Get(middleware.UserRoleKey)
|
role, _ := c.Get(middleware.UserRoleKey)
|
||||||
name, _ := c.Get(middleware.UserNameKey)
|
name, _ := c.Get(middleware.UserNameKey)
|
||||||
@@ -245,6 +247,10 @@ func (h *AssignmentHandler) Create(c *gin.Context) {
|
|||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if h.notificationService != nil {
|
||||||
|
go h.notificationService.SendAssignmentCreatedNotification(userID, assignment)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Redirect(http.StatusFound, "/assignments")
|
c.Redirect(http.StatusFound, "/assignments")
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ func (h *ProfileHandler) UpdateNotificationSettings(c *gin.Context) {
|
|||||||
TelegramChatID: c.PostForm("telegram_chat_id"),
|
TelegramChatID: c.PostForm("telegram_chat_id"),
|
||||||
LineEnabled: c.PostForm("line_enabled") == "on",
|
LineEnabled: c.PostForm("line_enabled") == "on",
|
||||||
LineNotifyToken: c.PostForm("line_token"),
|
LineNotifyToken: c.PostForm("line_token"),
|
||||||
|
NotifyOnCreate: c.PostForm("notify_on_create") == "on",
|
||||||
}
|
}
|
||||||
|
|
||||||
err := h.notificationService.UpdateUserSettings(userID, settings)
|
err := h.notificationService.UpdateUserSettings(userID, settings)
|
||||||
@@ -172,4 +173,3 @@ func (h *ProfileHandler) UpdateNotificationSettings(c *gin.Context) {
|
|||||||
"notifySettings": notifySettings,
|
"notifySettings": notifySettings,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ type UserNotificationSettings struct {
|
|||||||
TelegramChatID string `json:"telegram_chat_id"`
|
TelegramChatID string `json:"telegram_chat_id"`
|
||||||
LineEnabled bool `gorm:"default:false" json:"line_enabled"`
|
LineEnabled bool `gorm:"default:false" json:"line_enabled"`
|
||||||
LineNotifyToken string `json:"-"`
|
LineNotifyToken string `json:"-"`
|
||||||
|
NotifyOnCreate bool `gorm:"default:true" json:"notify_on_create"`
|
||||||
CreatedAt time.Time `json:"created_at"`
|
CreatedAt time.Time `json:"created_at"`
|
||||||
UpdatedAt time.Time `json:"updated_at"`
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ func Setup(cfg *config.Config) *gin.Engine {
|
|||||||
notificationService.StartReminderScheduler()
|
notificationService.StartReminderScheduler()
|
||||||
|
|
||||||
authHandler := handler.NewAuthHandler()
|
authHandler := handler.NewAuthHandler()
|
||||||
assignmentHandler := handler.NewAssignmentHandler()
|
assignmentHandler := handler.NewAssignmentHandler(notificationService)
|
||||||
adminHandler := handler.NewAdminHandler()
|
adminHandler := handler.NewAdminHandler()
|
||||||
profileHandler := handler.NewProfileHandler(notificationService)
|
profileHandler := handler.NewProfileHandler(notificationService)
|
||||||
apiHandler := handler.NewAPIHandler()
|
apiHandler := handler.NewAPIHandler()
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ func NewNotificationService(telegramBotToken string) *NotificationService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (s *NotificationService) GetUserSettings(userID uint) (*models.UserNotificationSettings, error) {
|
func (s *NotificationService) GetUserSettings(userID uint) (*models.UserNotificationSettings, error) {
|
||||||
var settings models.UserNotificationSettings
|
var settings models.UserNotificationSettings
|
||||||
result := database.GetDB().Where("user_id = ?", userID).First(&settings)
|
result := database.GetDB().Where("user_id = ?", userID).First(&settings)
|
||||||
@@ -153,6 +152,63 @@ func (s *NotificationService) SendAssignmentReminder(userID uint, assignment *mo
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *NotificationService) SendAssignmentCreatedNotification(userID uint, assignment *models.Assignment) error {
|
||||||
|
settings, err := s.GetUserSettings(userID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !settings.NotifyOnCreate {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if !settings.TelegramEnabled && !settings.LineEnabled {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
message := fmt.Sprintf(
|
||||||
|
"新しい課題が追加されました\n\n【%s】\n科目: %s\n優先度: %s\n期限: %s\n\n%s",
|
||||||
|
assignment.Title,
|
||||||
|
assignment.Subject,
|
||||||
|
getPriorityLabel(assignment.Priority),
|
||||||
|
assignment.DueDate.Format("2006/01/02 15:04"),
|
||||||
|
assignment.Description,
|
||||||
|
)
|
||||||
|
|
||||||
|
var errors []string
|
||||||
|
|
||||||
|
if settings.TelegramEnabled && settings.TelegramChatID != "" {
|
||||||
|
if err := s.SendTelegramNotification(settings.TelegramChatID, message); err != nil {
|
||||||
|
errors = append(errors, fmt.Sprintf("Telegram: %v", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if settings.LineEnabled && settings.LineNotifyToken != "" {
|
||||||
|
if err := s.SendLineNotification(settings.LineNotifyToken, message); err != nil {
|
||||||
|
errors = append(errors, fmt.Sprintf("LINE: %v", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(errors) > 0 {
|
||||||
|
return fmt.Errorf("notification errors: %s", strings.Join(errors, "; "))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPriorityLabel(priority string) string {
|
||||||
|
switch priority {
|
||||||
|
case "high":
|
||||||
|
return "大"
|
||||||
|
case "medium":
|
||||||
|
return "中"
|
||||||
|
case "low":
|
||||||
|
return "小"
|
||||||
|
default:
|
||||||
|
return priority
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (s *NotificationService) SendUrgentReminder(userID uint, assignment *models.Assignment) error {
|
func (s *NotificationService) SendUrgentReminder(userID uint, assignment *models.Assignment) error {
|
||||||
settings, err := s.GetUserSettings(userID)
|
settings, err := s.GetUserSettings(userID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -301,4 +357,3 @@ func (s *NotificationService) StartReminderScheduler() {
|
|||||||
}()
|
}()
|
||||||
log.Println("Reminder scheduler started (one-time + urgent reminders)")
|
log.Println("Reminder scheduler started (one-time + urgent reminders)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,6 +112,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<hr class="my-3">
|
||||||
|
<div class="form-check form-switch mb-3">
|
||||||
|
<input class="form-check-input" type="checkbox" id="notify_on_create" name="notify_on_create"
|
||||||
|
{{if .notifySettings.NotifyOnCreate}}checked{{end}}>
|
||||||
|
<label class="form-check-label" for="notify_on_create">
|
||||||
|
<i class="bi bi-plus-circle me-1"></i>課題追加時に通知する
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
<button type="submit" class="btn btn-primary"><i class="bi bi-check-lg me-1"></i>通知設定を保存</button>
|
<button type="submit" class="btn btn-primary"><i class="bi bi-check-lg me-1"></i>通知設定を保存</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user