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 }