package storage import ( "encoding/base64" "encoding/json" "fmt" "io" "io/fs" "os" "path" "strings" "gosimplenpm/internal/serviceidos" "path/filepath" "github.com/sirupsen/logrus" ) type FSStorage struct{} func (f *FSStorage) GetIndexJsonFromStore(packageName string, registryPath string, log *logrus.Logger) (string, bool, error) { fileToServe := "" found := false err := filepath.WalkDir(registryPath, func(fp string, info fs.DirEntry, e error) error { if strings.Contains(fp, path.Join(packageName, "index.json")) { fileToServe = fp found = true } return e }) if err != nil { log.WithFields(logrus.Fields{ "function": "get-index-json-from-store", }).Errorf("List files error: +%v\n", err) return fileToServe, found, err } if fileToServe == "" && !found { fileToServe = path.Join(registryPath, packageName, "index.json") } return fileToServe, found, nil } func (f *FSStorage) GetTarFromStore(packageName string, tarFileName string, registryPath string, log *logrus.Logger) (string, error) { fileToServe := "" err := filepath.WalkDir(registryPath, func(fp string, info fs.DirEntry, e error) error { if strings.Contains(fp, path.Join(packageName, tarFileName)) { fileToServe = fp } return e }) if err != nil { log.WithFields(logrus.Fields{ "function": "get-tar-from-store", }).Errorf("List files error: +%v\n", err) return fileToServe, err } if fileToServe == "" { return fileToServe, fmt.Errorf("file %s is not found for package %s", tarFileName, packageName) } file, err := os.Open(fileToServe) if err != nil { log.WithFields(logrus.Fields{ "function": "get-tar-from-store", }).Errorf("Open error: %s\n", fileToServe) return "", err } defer file.Close() bs, err := io.ReadAll(file) if err != nil { log.WithFields(logrus.Fields{ "function": "get-tar-from-store", }).Errorf("File Read error: %s\n", fileToServe) return "", err } return base64.StdEncoding.EncodeToString(bs), err } func (f *FSStorage) ReadIndexJson(fPath string, res *serviceidos.IndexJson, log *logrus.Logger) error { jsonFile, err := os.Open(fPath) if err != nil { log.WithFields(logrus.Fields{ "function": "read-index-json", }).Errorf("File Not found: %s\n", fPath) return err } defer jsonFile.Close() err = json.NewDecoder(jsonFile).Decode(res) if err != nil { log.WithFields(logrus.Fields{ "function": "read-index-json", }).Errorf("Unmarshalerror: %+v\n", err) return err } return nil } func (f *FSStorage) WriteIndexJson(fPath string, res *serviceidos.IndexJson, log *logrus.Logger) error { // Need to create the directory first parent := path.Dir(fPath) err := os.MkdirAll(parent, os.ModePerm) if err != nil { log.WithFields(logrus.Fields{ "function": "write-index-json", }).Errorf("Folder (%s) creation failed.\n", fPath) return err } // Create the file jsonFile, err := os.Create(fPath) if err != nil { log.WithFields(logrus.Fields{ "function": "write-index-json", }).Errorf("Creation error for path(%s): %+v\n ", fPath, err) return err } defer jsonFile.Close() err = json.NewEncoder(jsonFile).Encode(res) if err != nil { log.WithFields(logrus.Fields{ "function": "write-index-json", }).Debugf("Marshalerror: %+v\n", err) return err } return nil } func (f *FSStorage) WritePackageToStore(fPath string, data string, log *logrus.Logger) error { dec, err := base64.StdEncoding.DecodeString(data) if err != nil { log.WithFields(logrus.Fields{ "function": "write-package-to-store", }).Errorf("Base64 Decode error: %+v\n", err) return err } dataFile, err := os.Create(fPath) if err != nil { log.WithFields(logrus.Fields{ "function": "write-package-to-store", }).Errorf("Creation error: %s\n", fPath) return err } defer dataFile.Close() _, err = dataFile.Write(dec) if err != nil { log.WithFields(logrus.Fields{ "function": "write-package-to-store", }).Errorf("Write error: %s\n", fPath) return err } err = dataFile.Sync() if err != nil { log.WithFields(logrus.Fields{ "function": "write-package-to-store", }).Errorf("Sync error: %s\n", fPath) return err } return nil }