Refactoring bolt package

pull/10616/head
Leonardo Di Donato 2018-07-25 14:34:17 +02:00 committed by Leonardo Di Donato
parent ae9e7c0087
commit 16f92c41cd
10 changed files with 79 additions and 70 deletions

View File

@ -1,7 +1,6 @@
package bolt
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -28,7 +27,7 @@ func (c *Client) initializeAuthorizations(ctx context.Context, tx *bolt.Tx) erro
}
func (c *Client) setUserOnAuthorization(ctx context.Context, tx *bolt.Tx, a *platform.Authorization) error {
u, err := c.findUserByID(ctx, tx, a.UserID)
u, err := c.findUserByID(ctx, tx, *a.UserID)
if err != nil {
return err
}
@ -59,7 +58,7 @@ func (c *Client) FindAuthorizationByID(ctx context.Context, id platform.ID) (*pl
func (c *Client) findAuthorizationByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Authorization, error) {
var a platform.Authorization
v := tx.Bucket(authorizationBucket).Get(id)
v := tx.Bucket(authorizationBucket).Get(id.Encode())
if len(v) == 0 {
// TODO: Make standard error
@ -94,14 +93,17 @@ func (c *Client) FindAuthorizationByToken(ctx context.Context, n string) (*platf
}
func (c *Client) findAuthorizationByToken(ctx context.Context, tx *bolt.Tx, n string) (*platform.Authorization, error) {
id := tx.Bucket(authorizationIndex).Get(authorizationIndexKey(n))
return c.findAuthorizationByID(ctx, tx, platform.ID(id))
var id platform.ID
if err := id.Decode(tx.Bucket(authorizationIndex).Get(authorizationIndexKey(n))); err != nil {
return nil, err
}
return c.findAuthorizationByID(ctx, tx, id)
}
func filterAuthorizationsFn(filter platform.AuthorizationFilter) func(a *platform.Authorization) bool {
if filter.ID != nil {
return func(a *platform.Authorization) bool {
return bytes.Equal(a.ID, *filter.ID)
return a.ID != nil && *a.ID == *filter.ID
}
}
@ -113,7 +115,7 @@ func filterAuthorizationsFn(filter platform.AuthorizationFilter) func(a *platfor
if filter.UserID != nil {
return func(a *platform.Authorization) bool {
return bytes.Equal(a.UserID, *filter.UserID)
return a.UserID != nil && *a.UserID == *filter.UserID
}
}
@ -166,7 +168,7 @@ func (c *Client) findAuthorizations(ctx context.Context, tx *bolt.Tx, f platform
if err != nil {
return nil, err
}
f.UserID = &u.ID
f.UserID = u.ID
}
as := []*platform.Authorization{}
@ -187,7 +189,7 @@ func (c *Client) findAuthorizations(ctx context.Context, tx *bolt.Tx, f platform
// CreateAuthorization creates a platform authorization and sets b.ID, and b.UserID if not provided.
func (c *Client) CreateAuthorization(ctx context.Context, a *platform.Authorization) error {
return c.db.Update(func(tx *bolt.Tx) error {
if len(a.UserID) == 0 {
if a.UserID == nil {
u, err := c.findUserByName(ctx, tx, a.User)
if err != nil {
return err
@ -228,10 +230,10 @@ func (c *Client) putAuthorization(ctx context.Context, tx *bolt.Tx, a *platform.
return err
}
if err := tx.Bucket(authorizationIndex).Put(authorizationIndexKey(a.Token), a.ID); err != nil {
if err := tx.Bucket(authorizationIndex).Put(authorizationIndexKey(a.Token), a.ID.Encode()); err != nil {
return err
}
if err := tx.Bucket(authorizationBucket).Put(a.ID, v); err != nil {
if err := tx.Bucket(authorizationBucket).Put(a.ID.Encode(), v); err != nil {
}
return c.setUserOnAuthorization(ctx, tx, a)
}
@ -265,9 +267,9 @@ func (c *Client) uniqueAuthorizationToken(ctx context.Context, tx *bolt.Tx, a *p
}
// DeleteAuthorization deletes a authorization and prunes it from the index.
func (c *Client) DeleteAuthorization(ctx context.Context, id platform.ID) error {
func (c *Client) DeleteAuthorization(ctx context.Context, id *platform.ID) error {
return c.db.Update(func(tx *bolt.Tx) error {
return c.deleteAuthorization(ctx, tx, id)
return c.deleteAuthorization(ctx, tx, *id)
})
}
@ -279,5 +281,5 @@ func (c *Client) deleteAuthorization(ctx context.Context, tx *bolt.Tx, id platfo
if err := tx.Bucket(authorizationIndex).Delete(authorizationIndexKey(a.Token)); err != nil {
return err
}
return tx.Bucket(authorizationBucket).Delete(id)
return tx.Bucket(authorizationBucket).Delete(id.Encode())
}

View File

@ -29,7 +29,7 @@ func initAuthorizationService(f platformtesting.AuthorizationFields, t *testing.
return c, func() {
defer closeFn()
for _, u := range f.Users {
if err := c.DeleteUser(ctx, u.ID); err != nil {
if err := c.DeleteUser(ctx, *u.ID); err != nil {
t.Logf("failed to remove user: %v", err)
}
}

View File

@ -1,7 +1,6 @@
package bolt
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -26,7 +25,7 @@ func (c *Client) initializeBuckets(ctx context.Context, tx *bolt.Tx) error {
}
func (c *Client) setOrganizationOnBucket(ctx context.Context, tx *bolt.Tx, b *platform.Bucket) error {
o, err := c.findOrganizationByID(ctx, tx, b.OrganizationID)
o, err := c.findOrganizationByID(ctx, tx, *b.OrganizationID)
if err != nil {
return err
}
@ -57,7 +56,7 @@ func (c *Client) FindBucketByID(ctx context.Context, id platform.ID) (*platform.
func (c *Client) findBucketByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Bucket, error) {
var b platform.Bucket
v := tx.Bucket(bucketBucket).Get(id)
v := tx.Bucket(bucketBucket).Get(id.Encode())
if len(v) == 0 {
// TODO: Make standard error
@ -94,11 +93,14 @@ func (c *Client) FindBucketByName(ctx context.Context, orgID platform.ID, n stri
func (c *Client) findBucketByName(ctx context.Context, tx *bolt.Tx, orgID platform.ID, n string) (*platform.Bucket, error) {
b := &platform.Bucket{
OrganizationID: orgID,
OrganizationID: &orgID,
Name: n,
}
id := tx.Bucket(bucketIndex).Get(bucketIndexKey(b))
return c.findBucketByID(ctx, tx, platform.ID(id))
var id platform.ID
if err := id.Decode(tx.Bucket(bucketIndex).Get(bucketIndexKey(b))); err != nil {
return nil, err
}
return c.findBucketByID(ctx, tx, id)
}
// FindBucket retrives a bucket using an arbitrary bucket filter.
@ -120,7 +122,7 @@ func (c *Client) FindBucket(ctx context.Context, filter platform.BucketFilter) (
if err != nil {
return err
}
filter.OrganizationID = &o.ID
filter.OrganizationID = o.ID
}
filterFn := filterBucketsFn(filter)
@ -147,13 +149,13 @@ func (c *Client) FindBucket(ctx context.Context, filter platform.BucketFilter) (
func filterBucketsFn(filter platform.BucketFilter) func(b *platform.Bucket) bool {
if filter.ID != nil {
return func(b *platform.Bucket) bool {
return bytes.Equal(b.ID, *filter.ID)
return b.ID != nil && *b.ID == *filter.ID
}
}
if filter.Name != nil && filter.OrganizationID != nil {
return func(b *platform.Bucket) bool {
return bytes.Equal(b.OrganizationID, *filter.OrganizationID) && b.Name == *filter.Name
return b.Name == *filter.Name && b.OrganizationID != nil && *b.OrganizationID == *filter.OrganizationID
}
}
@ -165,7 +167,7 @@ func filterBucketsFn(filter platform.BucketFilter) func(b *platform.Bucket) bool
if filter.OrganizationID != nil {
return func(b *platform.Bucket) bool {
return bytes.Equal(b.OrganizationID, *filter.OrganizationID)
return b.OrganizationID != nil && *b.OrganizationID == *filter.OrganizationID
}
}
@ -218,7 +220,7 @@ func (c *Client) findBuckets(ctx context.Context, tx *bolt.Tx, filter platform.B
if err != nil {
return nil, err
}
filter.OrganizationID = &o.ID
filter.OrganizationID = o.ID
}
filterFn := filterBucketsFn(filter)
@ -239,7 +241,7 @@ func (c *Client) findBuckets(ctx context.Context, tx *bolt.Tx, filter platform.B
// CreateBucket creates a platform bucket and sets b.ID.
func (c *Client) CreateBucket(ctx context.Context, b *platform.Bucket) error {
return c.db.Update(func(tx *bolt.Tx) error {
if len(b.OrganizationID) == 0 {
if b.OrganizationID == nil {
o, err := c.findOrganizationByName(ctx, tx, b.Organization)
if err != nil {
return err
@ -274,19 +276,21 @@ func (c *Client) putBucket(ctx context.Context, tx *bolt.Tx, b *platform.Bucket)
return err
}
if err := tx.Bucket(bucketIndex).Put(bucketIndexKey(b), b.ID); err != nil {
if err := tx.Bucket(bucketIndex).Put(bucketIndexKey(b), b.ID.Encode()); err != nil {
return err
}
if err := tx.Bucket(bucketBucket).Put(b.ID, v); err != nil {
if err := tx.Bucket(bucketBucket).Put(b.ID.Encode(), v); err != nil {
return err
}
return c.setOrganizationOnBucket(ctx, tx, b)
}
func bucketIndexKey(b *platform.Bucket) []byte {
k := make([]byte, len(b.OrganizationID)+len(b.Name))
copy(k, b.OrganizationID)
copy(k[len(b.OrganizationID):], []byte(b.Name))
orgID := b.OrganizationID.Encode()
lenOrgID := len(orgID)
k := make([]byte, lenOrgID+len(b.Name))
copy(k, orgID)
copy(k[lenOrgID:], []byte(b.Name))
return k
}
@ -375,5 +379,5 @@ func (c *Client) deleteBucket(ctx context.Context, tx *bolt.Tx, id platform.ID)
if err := tx.Bucket(bucketIndex).Delete(bucketIndexKey(b)); err != nil {
return err
}
return tx.Bucket(bucketBucket).Delete(id)
return tx.Bucket(bucketBucket).Delete(id.Encode())
}

View File

@ -28,12 +28,12 @@ func initBucketService(f platformtesting.BucketFields, t *testing.T) (platform.B
return c, func() {
defer closeFn()
for _, o := range f.Organizations {
if err := c.DeleteOrganization(ctx, o.ID); err != nil {
if err := c.DeleteOrganization(ctx, *o.ID); err != nil {
t.Logf("failed to remove organization: %v", err)
}
}
for _, b := range f.Buckets {
if err := c.DeleteBucket(ctx, b.ID); err != nil {
if err := c.DeleteBucket(ctx, *b.ID); err != nil {
t.Logf("failed to remove bucket: %v", err)
}
}

View File

@ -1,7 +1,6 @@
package bolt
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -22,7 +21,7 @@ func (c *Client) initializeDashboards(ctx context.Context, tx *bolt.Tx) error {
}
func (c *Client) setOrganizationOnDashboard(ctx context.Context, tx *bolt.Tx, d *platform.Dashboard) error {
o, err := c.findOrganizationByID(ctx, tx, d.OrganizationID)
o, err := c.findOrganizationByID(ctx, tx, *d.OrganizationID)
if err != nil {
return err
}
@ -53,7 +52,7 @@ func (c *Client) FindDashboardByID(ctx context.Context, id platform.ID) (*platfo
func (c *Client) findDashboardByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Dashboard, error) {
var d platform.Dashboard
v := tx.Bucket(dashboardBucket).Get(id)
v := tx.Bucket(dashboardBucket).Get(id.Encode())
if len(v) == 0 {
// TODO: Make standard error
@ -86,7 +85,7 @@ func (c *Client) FindDashboard(ctx context.Context, filter platform.DashboardFil
if err != nil {
return err
}
filter.OrganizationID = &o.ID
filter.OrganizationID = o.ID
}
filterFn := filterDashboardsFn(filter)
@ -113,13 +112,13 @@ func (c *Client) FindDashboard(ctx context.Context, filter platform.DashboardFil
func filterDashboardsFn(filter platform.DashboardFilter) func(d *platform.Dashboard) bool {
if filter.ID != nil {
return func(d *platform.Dashboard) bool {
return bytes.Equal(d.ID, *filter.ID)
return d.ID != nil && *d.ID == *filter.ID
}
}
if filter.OrganizationID != nil {
return func(d *platform.Dashboard) bool {
return bytes.Equal(d.OrganizationID, *filter.OrganizationID)
return d.OrganizationID != nil && *d.OrganizationID == *filter.OrganizationID
}
}
@ -173,7 +172,7 @@ func (c *Client) findDashboards(ctx context.Context, tx *bolt.Tx, filter platfor
if err != nil {
return nil, err
}
filter.OrganizationID = &o.ID
filter.OrganizationID = o.ID
}
filterFn := filterDashboardsFn(filter)
@ -194,7 +193,7 @@ func (c *Client) findDashboards(ctx context.Context, tx *bolt.Tx, filter platfor
// CreateDashboard creates a platform dashboard and sets d.ID.
func (c *Client) CreateDashboard(ctx context.Context, d *platform.Dashboard) error {
return c.db.Update(func(tx *bolt.Tx) error {
if len(d.OrganizationID) == 0 {
if d.OrganizationID == nil {
o, err := c.findOrganizationByName(ctx, tx, d.Organization)
if err != nil {
return err
@ -226,7 +225,7 @@ func (c *Client) putDashboard(ctx context.Context, tx *bolt.Tx, d *platform.Dash
if err != nil {
return err
}
if err := tx.Bucket(dashboardBucket).Put(d.ID, v); err != nil {
if err := tx.Bucket(dashboardBucket).Put(d.ID.Encode(), v); err != nil {
return err
}
return c.setOrganizationOnDashboard(ctx, tx, d)
@ -299,7 +298,7 @@ func (c *Client) deleteDashboard(ctx context.Context, tx *bolt.Tx, id platform.I
if err != nil {
return err
}
return tx.Bucket(dashboardBucket).Delete(id)
return tx.Bucket(dashboardBucket).Delete(id.Encode())
}
// AddDashboardCell adds a cell to a dashboard.
@ -324,7 +323,7 @@ func (c *Client) ReplaceDashboardCell(ctx context.Context, dashboardID platform.
}
idx := -1
for i, cell := range d.Cells {
if bytes.Equal(dc.ID, cell.ID) {
if dc.ID != nil && cell.ID != nil && *dc.ID == *cell.ID {
idx = i
break
}
@ -349,7 +348,7 @@ func (c *Client) RemoveDashboardCell(ctx context.Context, dashboardID platform.I
}
idx := -1
for i, cell := range d.Cells {
if bytes.Equal(cellID, cell.ID) {
if cell.ID != nil && cellID == *cell.ID {
idx = i
break
}

View File

@ -28,12 +28,12 @@ func initDashboardService(f platformtesting.DashboardFields, t *testing.T) (plat
return c, func() {
defer closeFn()
for _, o := range f.Organizations {
if err := c.DeleteOrganization(ctx, o.ID); err != nil {
if err := c.DeleteOrganization(ctx, *o.ID); err != nil {
t.Logf("failed to remove organization: %v", err)
}
}
for _, b := range f.Dashboards {
if err := c.DeleteDashboard(ctx, b.ID); err != nil {
if err := c.DeleteDashboard(ctx, *b.ID); err != nil {
t.Logf("failed to remove dashboard: %v", err)
}
}

View File

@ -1,7 +1,6 @@
package bolt
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -50,7 +49,7 @@ func (c *Client) FindOrganizationByID(ctx context.Context, id platform.ID) (*pla
func (c *Client) findOrganizationByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.Organization, error) {
var o platform.Organization
v := tx.Bucket(organizationBucket).Get(id)
v := tx.Bucket(organizationBucket).Get(id.Encode())
if len(v) == 0 {
// TODO: Make standard error
@ -81,8 +80,11 @@ func (c *Client) FindOrganizationByName(ctx context.Context, n string) (*platfor
}
func (c *Client) findOrganizationByName(ctx context.Context, tx *bolt.Tx, n string) (*platform.Organization, error) {
id := tx.Bucket(organizationIndex).Get(organizationIndexKey(n))
return c.findOrganizationByID(ctx, tx, platform.ID(id))
var id platform.ID
if err := id.Decode(tx.Bucket(organizationIndex).Get(organizationIndexKey(n))); err != nil {
return nil, err
}
return c.findOrganizationByID(ctx, tx, id)
}
// FindOrganization retrives a organization using an arbitrary organization filter.
@ -124,7 +126,7 @@ func (c *Client) FindOrganization(ctx context.Context, filter platform.Organizat
func filterOrganizationsFn(filter platform.OrganizationFilter) func(o *platform.Organization) bool {
if filter.ID != nil {
return func(o *platform.Organization) bool {
return bytes.Equal(o.ID, *filter.ID)
return o.ID != nil && *o.ID == *filter.ID
}
}
@ -206,10 +208,10 @@ func (c *Client) putOrganization(ctx context.Context, tx *bolt.Tx, o *platform.O
return err
}
if err := tx.Bucket(organizationIndex).Put(organizationIndexKey(o.Name), o.ID); err != nil {
if err := tx.Bucket(organizationIndex).Put(organizationIndexKey(o.Name), o.ID.Encode()); err != nil {
return err
}
return tx.Bucket(organizationBucket).Put(o.ID, v)
return tx.Bucket(organizationBucket).Put(o.ID.Encode(), v)
}
func organizationIndexKey(n string) []byte {
@ -292,7 +294,7 @@ func (c *Client) deleteOrganization(ctx context.Context, tx *bolt.Tx, id platfor
if err := tx.Bucket(organizationIndex).Delete(organizationIndexKey(o.Name)); err != nil {
return err
}
return tx.Bucket(organizationBucket).Delete(id)
return tx.Bucket(organizationBucket).Delete(id.Encode())
}
func (c *Client) deleteOrganizationsBuckets(ctx context.Context, tx *bolt.Tx, id platform.ID) error {
@ -304,7 +306,7 @@ func (c *Client) deleteOrganizationsBuckets(ctx context.Context, tx *bolt.Tx, id
return err
}
for _, b := range bs {
if err := c.deleteBucket(ctx, tx, b.ID); err != nil {
if err := c.deleteBucket(ctx, tx, *b.ID); err != nil {
return err
}
}

View File

@ -22,8 +22,8 @@ func initOrganizationService(f platformtesting.OrganizationFields, t *testing.T)
}
return c, func() {
defer closeFn()
for _, u := range f.Organizations {
if err := c.DeleteOrganization(ctx, u.ID); err != nil {
for _, o := range f.Organizations {
if err := c.DeleteOrganization(ctx, *o.ID); err != nil {
t.Logf("failed to remove organizations: %v", err)
}
}

View File

@ -1,7 +1,6 @@
package bolt
import (
"bytes"
"context"
"encoding/json"
"fmt"
@ -50,7 +49,7 @@ func (c *Client) FindUserByID(ctx context.Context, id platform.ID) (*platform.Us
func (c *Client) findUserByID(ctx context.Context, tx *bolt.Tx, id platform.ID) (*platform.User, error) {
var u platform.User
v := tx.Bucket(userBucket).Get(id)
v := tx.Bucket(userBucket).Get(id.Encode())
if len(v) == 0 {
// TODO: Make standard error
@ -81,8 +80,11 @@ func (c *Client) FindUserByName(ctx context.Context, n string) (*platform.User,
}
func (c *Client) findUserByName(ctx context.Context, tx *bolt.Tx, n string) (*platform.User, error) {
id := tx.Bucket(userIndex).Get(userIndexKey(n))
return c.findUserByID(ctx, tx, platform.ID(id))
var id platform.ID
if err := id.Decode(tx.Bucket(userIndex).Get(userIndexKey(n))); err != nil {
return nil, err
}
return c.findUserByID(ctx, tx, id)
}
// FindUser retrives a user using an arbitrary user filter.
@ -124,7 +126,7 @@ func (c *Client) FindUser(ctx context.Context, filter platform.UserFilter) (*pla
func filterUsersFn(filter platform.UserFilter) func(u *platform.User) bool {
if filter.ID != nil {
return func(u *platform.User) bool {
return bytes.Equal(u.ID, *filter.ID)
return u.ID != nil && *u.ID == *filter.ID
}
}
@ -206,10 +208,10 @@ func (c *Client) putUser(ctx context.Context, tx *bolt.Tx, u *platform.User) err
return err
}
if err := tx.Bucket(userIndex).Put(userIndexKey(u.Name), u.ID); err != nil {
if err := tx.Bucket(userIndex).Put(userIndexKey(u.Name), u.ID.Encode()); err != nil {
return err
}
return tx.Bucket(userBucket).Put(u.ID, v)
return tx.Bucket(userBucket).Put(u.ID.Encode(), v)
}
func userIndexKey(n string) []byte {
@ -293,7 +295,7 @@ func (c *Client) deleteUser(ctx context.Context, tx *bolt.Tx, id platform.ID) er
if err := tx.Bucket(userIndex).Delete(userIndexKey(u.Name)); err != nil {
return err
}
return tx.Bucket(userBucket).Delete(id)
return tx.Bucket(userBucket).Delete(id.Encode())
}
func (c *Client) deleteUsersAuthorizations(ctx context.Context, tx *bolt.Tx, id platform.ID) error {
@ -305,7 +307,7 @@ func (c *Client) deleteUsersAuthorizations(ctx context.Context, tx *bolt.Tx, id
return err
}
for _, a := range as {
if err := c.deleteAuthorization(ctx, tx, a.ID); err != nil {
if err := c.deleteAuthorization(ctx, tx, *a.ID); err != nil {
return err
}
}

View File

@ -23,7 +23,7 @@ func initUserService(f platformtesting.UserFields, t *testing.T) (platform.UserS
return c, func() {
defer closeFn()
for _, u := range f.Users {
if err := c.DeleteUser(ctx, u.ID); err != nil {
if err := c.DeleteUser(ctx, *u.ID); err != nil {
t.Logf("failed to remove users: %v", err)
}
}