Add basic library code to manage projects, activities and times.
This commit is contained in:
parent
529efb3668
commit
fb576f3d51
7 changed files with 663 additions and 0 deletions
121
lib/activities.go
Normal file
121
lib/activities.go
Normal 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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue