improvements

This commit is contained in:
2023-08-26 02:12:30 +02:00
parent 9848740dbf
commit 3c9e620375
3 changed files with 86 additions and 2 deletions

View File

@@ -2,6 +2,7 @@ package morningalarm
import (
"encoding/json"
"errors"
"os"
"time"
@@ -25,6 +26,11 @@ func (ma *MorningAlarm) nextAlarm() *time.Time {
}
func (ma *MorningAlarm) addAlarm(spec string, name string) (cron.EntryID, error) {
// Check if alarm already exists
if ma.getAlarm(name) != nil {
return 0, errors.New("Alarm already exists")
}
id, err := ma.cr.AddFunc(spec, ma.fireAlarm)
if err != nil {
@@ -89,3 +95,32 @@ func (ma *MorningAlarm) loadAlarms() error {
func (ma *MorningAlarm) fireAlarm() {
ma.playWakeUpMusic()
}
func (ma *MorningAlarm) getAlarm(name string) *alarm {
for _, alarm := range ma.alarms {
if alarm.Name == name {
return &alarm
}
}
return nil
}
func (ma *MorningAlarm) deleteAlarm(name string) bool {
for _, alarm := range ma.alarms {
if alarm.Name == name {
ma.cr.Remove(alarm.id)
for i, a := range ma.alarms {
if a.Name == name {
ma.alarms = append(ma.alarms[:i], ma.alarms[i+1:]...)
break
}
}
return true
}
}
return false
}

View File

@@ -21,6 +21,20 @@ func (ma *MorningAlarm) setupWebserver() {
return
}
// Check if alarm name is valid
if body.Name == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "Alarm name cannot be empty"})
return
}
// Chekc if alarm name contains only alphanumeric characters
for _, char := range body.Name {
if !((char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z') || (char >= '0' && char <= '9')) {
c.JSON(http.StatusBadRequest, gin.H{"error": "Alarm name must contain only alphanumeric characters"})
return
}
}
_, err := ma.addAlarm(body.Time, body.Name)
if err != nil {
@@ -33,10 +47,45 @@ func (ma *MorningAlarm) setupWebserver() {
return
}
c.Header("Location", "/api/alarm/"+body.Name)
c.JSON(http.StatusCreated, gin.H{})
}
})
ma.ro.GET("/api/alarm/:id", func(c *gin.Context) {
id := c.Param("id")
alarm := ma.getAlarm(id)
if alarm == nil {
c.JSON(http.StatusNotFound, gin.H{"error": "Alarm not found"})
return
}
c.JSON(http.StatusOK, alarm)
})
ma.ro.GET("/api/alarm", func(c *gin.Context) {
c.JSON(http.StatusOK, ma.alarms)
})
ma.ro.DELETE("/api/alarm/:id", func(c *gin.Context) {
id := c.Param("id")
if ma.deleteAlarm(id) {
err := ma.saveAlarms()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{})
} else {
c.JSON(http.StatusNotFound, gin.H{"error": "Alarm not found"})
}
})
ma.ro.GET("/api/info", func(c *gin.Context) {
spotifyUser, err := ma.sp.CurrentUser(c)
@@ -56,7 +105,7 @@ func (ma *MorningAlarm) setupWebserver() {
"timezone": zone,
"timezoneOffsetInH": offset / 60 / 60,
"alarms": len(ma.cr.Entries()),
"wakeupContext": ma.config.PlaylistID,
"wakeupPlaylist": ma.config.PlaylistID,
"deviceId": ma.config.DeviceID,
}