Use UUID models and soft deletion, persist file relationships with deduplicated monthly MinIO objects, and add admin file management. Update mini-program media handling and add local dev configuration.
101 lines
3.0 KiB
Go
101 lines
3.0 KiB
Go
package handler
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"past/internal/httpapi"
|
|
)
|
|
|
|
func registerSongs(r *httpapi.Router) {
|
|
r.Handle("songs_list", songsList)
|
|
r.Handle("songs_add", songsAdd)
|
|
r.Handle("songs_update", songsUpdate)
|
|
r.Handle("songs_delete", songsDelete)
|
|
}
|
|
|
|
func songsList(c *httpapi.Ctx) error {
|
|
ids := coupleUserIds(c, "")
|
|
if len(ids) == 0 {
|
|
return demoListResponse(c, "songs", nil)
|
|
}
|
|
suffix, window := listWindow(c)
|
|
items, err := c.DB.Query("SELECT s.*, u.nickname, u.avatar FROM songs s LEFT JOIN users u ON s.created_by = u.id WHERE s.created_by IN (?, ?) ORDER BY s.created_at DESC, s.id DESC"+suffix, append([]any{ids[0], ids[1]}, window...)...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return listResponse(c, items, countC(c, "SELECT COUNT(*) as c FROM songs WHERE created_by IN (?, ?)", ids[0], ids[1]), nil)
|
|
}
|
|
|
|
func songText(c *httpapi.Ctx) string {
|
|
return strings.TrimSpace(c.InStr("song_name") + " " + c.InStr("artist") + " " + c.InStr("note"))
|
|
}
|
|
|
|
func songsAdd(c *httpapi.Ctx) error {
|
|
if err := c.RequirePOST(); err != nil {
|
|
return err
|
|
}
|
|
cid, err := requireCoupleID(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !c.InBool("song_name") || !c.InBool("artist") {
|
|
return c.Err(400, "请填写歌曲名和歌手名")
|
|
}
|
|
uid := c.UID()
|
|
if err := checkTextOr400(c, songText(c)); err != nil {
|
|
return err
|
|
}
|
|
id, err := c.DB.Insert("INSERT INTO songs (couple_id, song_name, artist, note, created_by) VALUES (?, ?, ?, ?, ?)",
|
|
cid, c.In("song_name"), c.In("artist"), inOr(c, "note", ""), uid)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
name, artist := c.InStr("song_name"), c.InStr("artist")
|
|
actID := logActivity(c.DB, cid, uid, "song_add", "收藏了「"+name+" - "+artist+"」", "")
|
|
if partnerID := partnerUserId(c.DB, uid); partnerID != "" {
|
|
c.App.Wechat.SendSubscribeMessage(partnerID, "notify", map[string]string{
|
|
"thing1": "收藏了新歌曲 🎵", "thing2": mbTruncate(name, 20) + " - " + artist, "date3": today(), "thing4": "点击听听看 💕",
|
|
}, "pages/lovewords/lovewords", actID, uid)
|
|
}
|
|
return c.OK(M{"success": true, "id": fmt.Sprint(id)})
|
|
}
|
|
|
|
func songsUpdate(c *httpapi.Ctx) error {
|
|
if err := c.RequirePOST(); err != nil {
|
|
return err
|
|
}
|
|
ids, err := requireCoupleUserIds(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !c.InBool("id") {
|
|
return c.Err(400, "参数错误")
|
|
}
|
|
if !c.InBool("song_name") || !c.InBool("artist") {
|
|
return c.Err(400, "请填写歌曲名和歌手名")
|
|
}
|
|
if err := checkTextOr400(c, songText(c)); err != nil {
|
|
return err
|
|
}
|
|
if _, err := c.DB.Exec("UPDATE songs SET song_name = ?, artist = ?, note = ? WHERE id = ? AND created_by IN (?, ?)",
|
|
c.In("song_name"), c.In("artist"), inOr(c, "note", ""), c.In("id"), ids[0], ids[1]); err != nil {
|
|
return err
|
|
}
|
|
return c.OK(M{"success": true})
|
|
}
|
|
|
|
func songsDelete(c *httpapi.Ctx) error {
|
|
if err := c.RequirePOST(); err != nil {
|
|
return err
|
|
}
|
|
ids, err := requireCoupleUserIds(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if _, err := c.DB.Exec("DELETE FROM songs WHERE id = ? AND created_by IN (?, ?)", c.In("id"), ids[0], ids[1]); err != nil {
|
|
return err
|
|
}
|
|
return c.OK(M{"success": true})
|
|
}
|