package main import ( "bytes" "errors" "io/ioutil" "net/http" "git.makerforce.io/photos/photos/internal/httphelpers" lib "git.makerforce.io/photos/photos/pkg/bucket" "git.makerforce.io/photos/photos/pkg/credentials" ) // TODO: handle errors nicer func getPhotos(bucket lib.Bucket, cred credentials.Credential) ([]lib.Photo, error) { unsignedReq, err := http.NewRequest(http.MethodGet, bucket.ListURL(10000, "").String(), nil) if err != nil { return nil, err } signedReq := sig.Sign(unsignedReq, cred) resp, err := http.DefaultClient.Do(signedReq) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, httphelpers.ErrorFromStatus(resp.StatusCode) } buf, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } return lib.BucketListUnmarshal(buf) } func getPhotoMetadataSize(bucket lib.Bucket, cred credentials.Credential, photo lib.Photo) (lib.PhotoMetadataSize, error) { buf, err := getPhotoMetadata(bucket, cred, photo.MetadataSize()) if err != nil { return lib.PhotoMetadataSize{}, err } return lib.PhotoMetadataSizeUnmarshal(buf) } func getPhotoMetadataTitle(bucket lib.Bucket, cred credentials.Credential, photo lib.Photo) (lib.PhotoMetadataTitle, error) { buf, err := getPhotoMetadata(bucket, cred, photo.MetadataTitle()) if errors.Is(err, httphelpers.ErrorNotFound) { return lib.PhotoMetadataTitle(""), nil } if err != nil { return "", err } return lib.PhotoMetadataTitle(buf), nil } func getPhotoMetadataTags(bucket lib.Bucket, cred credentials.Credential, photo lib.Photo) (lib.PhotoMetadataTags, error) { buf, err := getPhotoMetadata(bucket, cred, photo.MetadataTags()) if errors.Is(err, httphelpers.ErrorNotFound) { return lib.PhotoMetadataTags([]string{}), nil } if err != nil { return nil, err } return lib.PhotoMetadataTagsUnmarshal(buf) } func getPhotoMetadata(bucket lib.Bucket, cred credentials.Credential, photoMetadata lib.PhotoMetadata) ([]byte, error) { unsignedReq, err := http.NewRequest(http.MethodGet, bucket.URL(photoMetadata).String(), nil) if err != nil { return nil, err } signedReq := sig.Sign(unsignedReq, cred) resp, err := http.DefaultClient.Do(signedReq) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, httphelpers.ErrorFromStatus(resp.StatusCode) } return ioutil.ReadAll(resp.Body) } func getBucketMetadataTitle(bucket lib.Bucket, cred credentials.Credential) (lib.BucketMetadataTitle, error) { buf, err := getBucketMetadata(bucket, cred, bucket.MetadataTitle()) return lib.BucketMetadataTitle(buf), err } func getBucketMetadata(bucket lib.Bucket, cred credentials.Credential, bucketMetadata lib.BucketMetadata) ([]byte, error) { unsignedReq, err := http.NewRequest(http.MethodGet, bucket.URL(bucketMetadata).String(), nil) if err != nil { return nil, err } signedReq := sig.Sign(unsignedReq, cred) resp, err := http.DefaultClient.Do(signedReq) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, httphelpers.ErrorFromStatus(resp.StatusCode) } return ioutil.ReadAll(resp.Body) } func putBucketView(bucket lib.Bucket, cred credentials.Credential, buf []byte) error { unsignedReq, err := http.NewRequest(http.MethodPut, bucket.ViewURL().String(), bytes.NewBuffer(buf)) if err != nil { return err } unsignedReq.Header.Set("Content-Type", "text/html") signedReq := sig.Sign(unsignedReq, cred) resp, err := http.DefaultClient.Do(signedReq) if err != nil { return err } defer resp.Body.Close() return httphelpers.ErrorFromStatus(resp.StatusCode) } func putBucketManage(bucket lib.Bucket, cred credentials.Credential, buf []byte) error { unsignedReq, err := http.NewRequest(http.MethodPut, bucket.ManageURL().String(), bytes.NewBuffer(buf)) if err != nil { return err } unsignedReq.Header.Set("Content-Type", "text/html") signedReq := sig.Sign(unsignedReq, cred) resp, err := http.DefaultClient.Do(signedReq) if err != nil { return err } defer resp.Body.Close() return httphelpers.ErrorFromStatus(resp.StatusCode) }