package svg import ( "io" "log" "os" "path/filepath" ) type SvgStorage interface { Create(id string, svg io.Reader) (string, error) Get(id string) (io.Reader, error) CreateTemp(data io.Reader, filetype string) (string, error) CreatePublic(data io.Reader, filetype string) (string, error) } var _ SvgStorage = FileSvgStorage{} type FileSvgStorage struct { basepath string } func (f FileSvgStorage) CreatePublic(data io.Reader, filetype string) (string, error) { path := filepath.Join(f.basepath, "public") if err := os.Mkdir(path, 0755); err != nil { return "", err } file, err := os.CreateTemp(path, "*."+filetype) if err != nil { return "", err } defer file.Close() return file.Name(), nil } func (f FileSvgStorage) CreateTemp(data io.Reader, filetype string) (string, error) { path := filepath.Join(f.basepath, "temp") if err := os.Mkdir(path, 0755); err != nil { return "", err } file, err := os.CreateTemp(path, "*."+filetype) if err != nil { return "", err } defer file.Close() return file.Name(), nil } func NewFileStorage(path string) *FileSvgStorage { err := os.MkdirAll(path, 0755) if err != nil { panic(err) } log.Println("Initialized file storage handler") return &FileSvgStorage{path} } func (f FileSvgStorage) Create(id string, svg io.Reader) (string, error) { file, err := os.Create(filepath.Join(f.basepath, id+".svg")) if err != nil { return "", err } defer file.Close() _, err = io.Copy(file, svg) if err != nil { return "", err } log.Println("Created File: ", file.Name()) return file.Name(), nil } func (f FileSvgStorage) Get(id string) (io.Reader, error) { file, err := os.Open(filepath.Join(f.basepath, "svg", id+".svg")) if err != nil { return nil, err } return file, nil }