package api import ( "encoding/json" "os" "path" "github.com/julienschmidt/httprouter" ) var TeamsDir string func init() { router.GET("/api/public.json", apiHandler(getPublic)) router.DELETE("/api/public.json", apiHandler(deletePublic)) router.PUT("/api/public.json", apiHandler(savePublic)) } type FICPublicScene struct { Type string `json:"type"` Params map[string]interface{} `json:"params"` } func readPublic(path string) ([]FICPublicScene, error) { var s []FICPublicScene if fd, err := os.Open(path); err != nil { return s, err } else { defer fd.Close() jdec := json.NewDecoder(fd) if err := jdec.Decode(&s); err != nil { return s, err } return s, nil } } func savePublicTo(path string, s []FICPublicScene) error { if fd, err := os.Create(path); err != nil { return err } else { defer fd.Close() jenc := json.NewEncoder(fd) if err := jenc.Encode(s); err != nil { return err } return nil } } func getPublic(_ httprouter.Params, body []byte) (interface{}, error) { if _, err := os.Stat(path.Join(TeamsDir, "_public", "public.json")); !os.IsNotExist(err) { return readPublic(path.Join(TeamsDir, "_public", "public.json")) } else { return []FICPublicScene{}, nil } } func deletePublic(_ httprouter.Params, body []byte) (interface{}, error) { if err := savePublicTo(path.Join(TeamsDir, "_public", "public.json"), []FICPublicScene{}); err != nil { return nil, err } else { return []FICPublicScene{}, err } } func savePublic(_ httprouter.Params, body []byte) (interface{}, error) { var scenes []FICPublicScene if err := json.Unmarshal(body, &scenes); err != nil { return nil, err } if _, err := os.Stat(path.Join(TeamsDir, "_public")); os.IsNotExist(err) { if err := os.Mkdir(path.Join(TeamsDir, "_public"), 0750); err != nil { return nil, err } } if err := savePublicTo(path.Join(TeamsDir, "_public", "public.json"), scenes); err != nil { return nil, err } else { return scenes, err } }