Add basic library code to manage projects, activities and times.

This commit is contained in:
Olli 2025-08-29 11:56:45 +02:00
commit fb576f3d51
7 changed files with 663 additions and 0 deletions

121
lib/activities.go Normal file
View file

@ -0,0 +1,121 @@
package lib
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
)
// Activity entity as defined by the specification.
type Activity struct {
ID string `json:"id"`
Title string `json:"title"`
}
// GetActivities retrieves all stored activity instances of a project.
func GetActivities(project *Project) ([]*Activity, error) {
folder, folderErr := getActivitiesFolder(project.ID)
if folderErr != nil {
return nil, folderErr
}
dirErr := os.MkdirAll(folder, 0o750)
if dirErr != nil {
return nil, dirErr
}
files, filesErr := os.ReadDir(folder)
if filesErr != nil {
return nil, filesErr
}
activities := []*Activity{}
for _, file := range files {
activity, fileErr := readActivity(filepath.Join(folder, file.Name()))
if fileErr != nil {
return nil, fileErr
}
activities = append(activities, activity)
}
return activities, nil
}
// SetActivity persists an activity.
func SetActivity(project *Project, activity *Activity) error {
uuid, uuidErr := newUUID()
if uuidErr != nil {
return uuidErr
}
activity.ID = uuid
file, fileErr := getActivityFile(project.ID, uuid)
if fileErr != nil {
return fileErr
}
return writeActivity(file, activity)
}
// readActivity reads an activity from a file and converts it into an entity instance.
func readActivity(filename string) (*Activity, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
project := Activity{}
if err := json.NewDecoder(file).Decode(&project); err != nil {
return nil, err
}
return &project, nil
}
// writeActivity writes an activity instance to a file.
func writeActivity(filename string, activity *Activity) error {
dirErr := os.MkdirAll(filepath.Dir(filename), 0o750)
if dirErr != nil {
return dirErr
}
fmt.Println("success")
file, fileErr := os.Create(filename)
if fileErr != nil {
return fileErr
}
defer file.Close()
encoder := json.NewEncoder(file)
encoder.SetIndent("", " ")
jsonErr := encoder.Encode(activity)
if jsonErr != nil {
return jsonErr
}
return nil
}
// getActivitiesFolder returns the folder to store activity entity files in.
func getActivitiesFolder(projectID string) (string, error) {
folder, err := getDataDir("activities")
if err != nil {
return "", err
}
return filepath.Join(folder, projectID), nil
}
// getActivityFile returns the file name for an activity entity instance.
func getActivityFile(projectID string, name string) (string, error) {
folder, err := getActivitiesFolder(projectID)
if err != nil {
return "", err
}
return filepath.Join(folder, name+".json"), nil
}