beancount-gs/service/events.go

121 lines
2.7 KiB
Go
Raw Normal View History

2023-12-05 09:57:48 +00:00
package service
2023-12-05 16:29:38 +00:00
import (
"fmt"
"github.com/beancount-gs/script"
"github.com/gin-gonic/gin"
2024-03-10 15:29:20 +00:00
"sort"
2023-12-05 16:29:38 +00:00
"strings"
)
2023-12-05 09:57:48 +00:00
type Event struct {
2024-03-10 14:30:56 +00:00
Date string `form:"date" binding:"required" json:"date"`
Stage string `form:"stage" json:"stage"`
Type string `form:"type" json:"type"`
Types []string `form:"types" json:"types"`
Description string `form:"description" binding:"required" json:"description"`
2023-12-05 09:57:48 +00:00
}
2024-03-10 15:29:20 +00:00
// Events 切片包含多个事件
type Events []Event
func (e Events) Len() int {
return len(e)
}
func (e Events) Less(i, j int) bool {
return strings.Compare(e[i].Date, e[j].Date) < 0
}
func (e Events) Swap(i, j int) {
e[i], e[j] = e[j], e[i]
}
2023-12-05 09:57:48 +00:00
func GetAllEvents(c *gin.Context) {
2023-12-05 16:29:38 +00:00
ledgerConfig := script.GetLedgerConfigFromContext(c)
2024-03-10 14:30:56 +00:00
beanFilePath := script.GetLedgerEventsFilePath(ledgerConfig.DataPath)
bytes, err := script.ReadFile(beanFilePath)
if err != nil {
InternalError(c, err.Error())
return
}
lines := strings.Split(string(bytes), "\n")
2024-03-10 15:29:20 +00:00
events := Events{}
2023-12-05 16:29:38 +00:00
// foreach lines
2024-03-10 14:30:56 +00:00
for _, line := range lines {
2023-12-05 16:29:38 +00:00
if strings.Trim(line, " ") == "" {
continue
}
// split line by " "
words := strings.Fields(line)
2024-03-10 14:30:56 +00:00
if words[1] != "event" {
continue
}
2023-12-05 16:29:38 +00:00
events = append(events, Event{
Date: words[0],
2024-03-10 14:30:56 +00:00
Type: strings.ReplaceAll(words[2], "\"", ""),
Description: strings.ReplaceAll(words[3], "\"", ""),
2023-12-05 16:29:38 +00:00
})
}
2024-03-10 15:29:20 +00:00
// events 按时间倒序排列
sort.Sort(sort.Reverse(events))
2023-12-05 16:29:38 +00:00
OK(c, events)
2023-12-05 09:57:48 +00:00
}
func AddEvent(c *gin.Context) {
2023-12-05 16:29:38 +00:00
var event Event
if err := c.ShouldBindJSON(&event); err != nil {
BadRequest(c, err.Error())
return
}
ledgerConfig := script.GetLedgerConfigFromContext(c)
filePath := script.GetLedgerEventsFilePath(ledgerConfig.DataPath)
2024-03-10 14:30:56 +00:00
if event.Type != "" {
event.Types = []string{event.Type}
2023-12-05 16:29:38 +00:00
}
2024-03-10 14:30:56 +00:00
// 定义Event类型的数组
events := make([]Event, 0)
if event.Types != nil {
for _, t := range event.Types {
events = append(events, Event{
Date: event.Date,
Type: t,
Description: event.Description,
})
line := fmt.Sprintf("%s event \"%s\" \"%s\"", event.Date, t, event.Description)
// 写入文件
err := script.AppendFileInNewLine(filePath, line)
if err != nil {
InternalError(c, err.Error())
return
}
}
}
OK(c, events)
2023-12-05 16:29:38 +00:00
}
func DeleteEvent(c *gin.Context) {
var event Event
if err := c.ShouldBindJSON(&event); err != nil {
BadRequest(c, err.Error())
return
}
ledgerConfig := script.GetLedgerConfigFromContext(c)
filePath := script.GetLedgerEventsFilePath(ledgerConfig.DataPath)
line := fmt.Sprintf("%s event \"%s\" \"%s\"", event.Date, event.Type, event.Description)
err := script.DeleteLinesWithText(filePath, line)
if err != nil {
InternalError(c, err.Error())
return
}
2023-12-05 09:57:48 +00:00
OK(c, nil)
}