diff --git a/api/resource.go b/api/resource.go index b833f913..292b46cd 100644 --- a/api/resource.go +++ b/api/resource.go @@ -9,10 +9,11 @@ type Resource struct { UpdatedTs int64 `json:"updatedTs"` // Domain specific fields - Filename string `json:"filename"` - Blob []byte `json:"-"` - Type string `json:"type"` - Size int64 `json:"size"` + Filename string `json:"filename"` + Blob []byte `json:"-"` + Type string `json:"type"` + Size int64 `json:"size"` + Visibility Visibility `json:"visibility"` // Related fields LinkedMemoAmount int `json:"linkedMemoAmount"` @@ -23,10 +24,11 @@ type ResourceCreate struct { CreatorID int // Domain specific fields - Filename string `json:"filename"` - Blob []byte `json:"blob"` - Type string `json:"type"` - Size int64 `json:"size"` + Filename string `json:"filename"` + Blob []byte `json:"blob"` + Type string `json:"type"` + Size int64 `json:"size"` + Visibility Visibility `json:"visibility"` } type ResourceFind struct { @@ -36,8 +38,9 @@ type ResourceFind struct { CreatorID *int `json:"creatorId"` // Domain specific fields - Filename *string `json:"filename"` - MemoID *int + Filename *string `json:"filename"` + MemoID *int + Visibility *Visibility `json:"visibility"` } type ResourcePatch struct { @@ -47,7 +50,8 @@ type ResourcePatch struct { UpdatedTs *int64 // Domain specific fields - Filename *string `json:"filename"` + Filename *string `json:"filename"` + Visibility *Visibility `json:"visibility"` } type ResourceDelete struct { diff --git a/store/db/migration/dev/LATEST__SCHEMA.sql b/store/db/migration/dev/LATEST__SCHEMA.sql index a5ac821a..60ba74c5 100644 --- a/store/db/migration/dev/LATEST__SCHEMA.sql +++ b/store/db/migration/dev/LATEST__SCHEMA.sql @@ -75,7 +75,8 @@ CREATE TABLE resource ( blob BLOB DEFAULT NULL, external_link TEXT NOT NULL DEFAULT '', type TEXT NOT NULL DEFAULT '', - size INTEGER NOT NULL DEFAULT 0 + size INTEGER NOT NULL DEFAULT 0, + visibility TEXT NOT NULL CHECK (visibility IN ('PUBLIC', 'PROTECTED', 'PRIVATE')) DEFAULT 'PRIVATE' ); -- memo_resource diff --git a/store/db/migration/prod/0.9/00__resource_visibility.sql b/store/db/migration/prod/0.9/00__resource_visibility.sql new file mode 100644 index 00000000..a2c2e05e --- /dev/null +++ b/store/db/migration/prod/0.9/00__resource_visibility.sql @@ -0,0 +1,2 @@ +-- Add visibility field to resource +ALTER TABLE resource ADD COLUMN visibility TEXT NOT NULL CHECK (visibility IN ('PUBLIC', 'PROTECTED' 'PRIVATE')) DEFAULT 'PRIVATE'; diff --git a/store/resource.go b/store/resource.go index eb8703b9..2b0ef6c2 100644 --- a/store/resource.go +++ b/store/resource.go @@ -22,10 +22,11 @@ type resourceRaw struct { UpdatedTs int64 // Domain specific fields - Filename string - Blob []byte - Type string - Size int64 + Filename string + Blob []byte + Type string + Size int64 + Visibility api.Visibility } func (raw *resourceRaw) toResource() *api.Resource { @@ -38,10 +39,11 @@ func (raw *resourceRaw) toResource() *api.Resource { UpdatedTs: raw.UpdatedTs, // Domain specific fields - Filename: raw.Filename, - Blob: raw.Blob, - Type: raw.Type, - Size: raw.Size, + Filename: raw.Filename, + Blob: raw.Blob, + Type: raw.Type, + Size: raw.Size, + Visibility: raw.Visibility, } } @@ -217,18 +219,20 @@ func createResource(ctx context.Context, tx *sql.Tx, create *api.ResourceCreate) blob, type, size, + visibility, creator_id ) - VALUES (?, ?, ?, ?, ?) - RETURNING id, filename, blob, type, size, creator_id, created_ts, updated_ts + VALUES (?, ?, ?, ?, ?, ?) + RETURNING id, filename, blob, type, size, visibility, creator_id, created_ts, updated_ts ` var resourceRaw resourceRaw - if err := tx.QueryRowContext(ctx, query, create.Filename, create.Blob, create.Type, create.Size, create.CreatorID).Scan( + if err := tx.QueryRowContext(ctx, query, create.Filename, create.Blob, create.Type, create.Size, create.Visibility, create.CreatorID).Scan( &resourceRaw.ID, &resourceRaw.Filename, &resourceRaw.Blob, &resourceRaw.Type, &resourceRaw.Size, + &resourceRaw.Visibility, &resourceRaw.CreatorID, &resourceRaw.CreatedTs, &resourceRaw.UpdatedTs, @@ -248,6 +252,9 @@ func patchResource(ctx context.Context, tx *sql.Tx, patch *api.ResourcePatch) (* if v := patch.Filename; v != nil { set, args = append(set, "filename = ?"), append(args, *v) } + if v := patch.Visibility; v != nil { + set, args = append(set, "visibility = ?"), append(args, *v) + } args = append(args, patch.ID) @@ -255,7 +262,7 @@ func patchResource(ctx context.Context, tx *sql.Tx, patch *api.ResourcePatch) (* UPDATE resource SET ` + strings.Join(set, ", ") + ` WHERE id = ? - RETURNING id, filename, blob, type, size, creator_id, created_ts, updated_ts + RETURNING id, filename, blob, type, size, visibility, creator_id, created_ts, updated_ts ` var resourceRaw resourceRaw if err := tx.QueryRowContext(ctx, query, args...).Scan( @@ -264,6 +271,7 @@ func patchResource(ctx context.Context, tx *sql.Tx, patch *api.ResourcePatch) (* &resourceRaw.Blob, &resourceRaw.Type, &resourceRaw.Size, + &resourceRaw.Visibility, &resourceRaw.CreatorID, &resourceRaw.CreatedTs, &resourceRaw.UpdatedTs, @@ -286,6 +294,9 @@ func findResourceList(ctx context.Context, tx *sql.Tx, find *api.ResourceFind) ( if v := find.Filename; v != nil { where, args = append(where, "filename = ?"), append(args, *v) } + if v := find.Visibility; v != nil { + where, args = append(where, "visibility = ?"), append(args, *v) + } if v := find.MemoID; v != nil { where, args = append(where, "id in (SELECT resource_id FROM memo_resource WHERE memo_id = ?)"), append(args, *v) } @@ -297,6 +308,7 @@ func findResourceList(ctx context.Context, tx *sql.Tx, find *api.ResourceFind) ( blob, type, size, + visibility, creator_id, created_ts, updated_ts @@ -319,6 +331,7 @@ func findResourceList(ctx context.Context, tx *sql.Tx, find *api.ResourceFind) ( &resourceRaw.Blob, &resourceRaw.Type, &resourceRaw.Size, + &resourceRaw.Visibility, &resourceRaw.CreatorID, &resourceRaw.CreatedTs, &resourceRaw.UpdatedTs,