121 lines
2.5 KiB
Go
121 lines
2.5 KiB
Go
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
|
|
}
|