Finished backend work

Added last of the web REST endpoints.
Added processing lock to ensure that only one project cycle is running
at a time.

Basically all that's left is the web front end
This commit is contained in:
Tim Shannon
2016-04-13 20:53:49 +00:00
parent d3850c24f8
commit 05eb182419
6 changed files with 127 additions and 21 deletions

@@ -83,3 +83,44 @@ func (k TimeKey) UUID() string {
func (k TimeKey) Bytes() []byte {
return []byte(k[:])
}
// String returns the string representation of a timekey
func (k TimeKey) String() string {
return k.UUID()
}
// MarshalJSON implements JSON marshaler
func (k *TimeKey) MarshalJSON() ([]byte, error) {
return []byte(`"` + k.String() + `"`), nil
}
// UnmarshalJSON implements JSON unmarshaler
func (k *TimeKey) UnmarshalJSON(buf []byte) error {
// drop quotes
buf = buf[1 : len(buf)-1]
_, err := hex.Decode(k[0:4], buf[0:8])
if err != nil {
return err
}
_, err = hex.Decode(k[4:6], buf[9:13])
if err != nil {
return err
}
_, err = hex.Decode(k[6:8], buf[14:18])
if err != nil {
return err
}
_, err = hex.Decode(k[8:10], buf[19:23])
if err != nil {
return err
}
_, err = hex.Decode(k[10:], buf[24:])
if err != nil {
return err
}
return nil
}

@@ -53,11 +53,11 @@ func (ds *Store) AddRelease(version, fileName string, fileData []byte) error {
// ReleaseFile returns a specific file from a release for the given file key
func (ds *Store) ReleaseFile(fileKey TimeKey) ([]byte, error) {
var fileData []byte
err := ds.get(bucketFiles, fileKey.Bytes(), &fileData)
err := ds.get(bucketFiles, fileKey.Bytes(), fileData)
if err != nil {
return nil, err
}
return fileData, nil
}
@@ -100,12 +100,15 @@ func (ds *Store) Releases() ([]*Release, error) {
// LastRelease lists the last release for a project
func (ds *Store) LastRelease() (*Release, error) {
var r *Release
r := &Release{}
err := ds.bolt.View(func(tx *bolt.Tx) error {
c := tx.Bucket([]byte(bucketReleases)).Cursor()
_, v := c.Last()
if v == nil {
return ErrNotFound
}
err := json.Unmarshal(v, r)
if err != nil {
@@ -119,9 +122,5 @@ func (ds *Store) LastRelease() (*Release, error) {
return nil, err
}
if r == nil {
return nil, ErrNotFound
}
return r, nil
}