chore: remove workspace and workspace tables

This commit is contained in:
Steven
2023-06-21 08:32:57 +08:00
parent c3ce03ffe5
commit 895cd8e38c
12 changed files with 147 additions and 948 deletions

View File

@ -4,28 +4,10 @@ CREATE TABLE migration_history (
created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now'))
);
-- workspace
CREATE TABLE workspace (
id INTEGER PRIMARY KEY AUTOINCREMENT,
created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
updated_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
row_status TEXT NOT NULL CHECK (row_status IN ('NORMAL', 'ARCHIVED')) DEFAULT 'NORMAL',
resource_id TEXT NOT NULL UNIQUE,
title TEXT NOT NULL,
description TEXT NOT NULL DEFAULT ''
);
INSERT INTO
sqlite_sequence (name, seq)
VALUES
('workspace', 1);
-- workspace_setting
CREATE TABLE workspace_setting (
workspace_id INTEGER NOT NULL,
key TEXT NOT NULL,
value TEXT NOT NULL,
UNIQUE(workspace_id, key)
key TEXT NOT NULL UNIQUE,
value TEXT NOT NULL
);
-- user
@ -41,11 +23,6 @@ CREATE TABLE user (
role TEXT NOT NULL CHECK (role IN ('ADMIN', 'USER')) DEFAULT 'USER'
);
INSERT INTO
sqlite_sequence (name, seq)
VALUES
('user', 10);
-- user_setting
CREATE TABLE user_setting (
user_id INTEGER NOT NULL,
@ -54,14 +31,6 @@ CREATE TABLE user_setting (
UNIQUE(user_id, key)
);
-- workspace_user
CREATE TABLE workspace_user (
workspace_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
role TEXT NOT NULL CHECK (role IN ('ADMIN', 'USER')) DEFAULT 'USER',
UNIQUE(workspace_id, user_id)
);
-- shortcut
CREATE TABLE shortcut (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@ -69,15 +38,8 @@ CREATE TABLE shortcut (
created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
updated_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
row_status TEXT NOT NULL CHECK (row_status IN ('NORMAL', 'ARCHIVED')) DEFAULT 'NORMAL',
workspace_id INTEGER NOT NULL,
name TEXT NOT NULL,
name TEXT NOT NULL UNIQUE,
link TEXT NOT NULL,
description TEXT NOT NULL DEFAULT '',
visibility TEXT NOT NULL CHECK (visibility IN ('PRIVATE', 'WORKSPACE', 'PUBLIC')) DEFAULT 'PRIVATE',
UNIQUE(workspace_id, name)
visibility TEXT NOT NULL CHECK (visibility IN ('PRIVATE', 'WORKSPACE', 'PUBLIC')) DEFAULT 'PRIVATE'
);
INSERT INTO
sqlite_sequence (name, seq)
VALUES
('shortcut', 100);

View File

@ -4,28 +4,10 @@ CREATE TABLE migration_history (
created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now'))
);
-- workspace
CREATE TABLE workspace (
id INTEGER PRIMARY KEY AUTOINCREMENT,
created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
updated_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
row_status TEXT NOT NULL CHECK (row_status IN ('NORMAL', 'ARCHIVED')) DEFAULT 'NORMAL',
resource_id TEXT NOT NULL UNIQUE,
title TEXT NOT NULL,
description TEXT NOT NULL DEFAULT ''
);
INSERT INTO
sqlite_sequence (name, seq)
VALUES
('workspace', 1);
-- workspace_setting
CREATE TABLE workspace_setting (
workspace_id INTEGER NOT NULL,
key TEXT NOT NULL,
value TEXT NOT NULL,
UNIQUE(workspace_id, key)
key TEXT NOT NULL UNIQUE,
value TEXT NOT NULL
);
-- user
@ -41,11 +23,6 @@ CREATE TABLE user (
role TEXT NOT NULL CHECK (role IN ('ADMIN', 'USER')) DEFAULT 'USER'
);
INSERT INTO
sqlite_sequence (name, seq)
VALUES
('user', 10);
-- user_setting
CREATE TABLE user_setting (
user_id INTEGER NOT NULL,
@ -54,14 +31,6 @@ CREATE TABLE user_setting (
UNIQUE(user_id, key)
);
-- workspace_user
CREATE TABLE workspace_user (
workspace_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
role TEXT NOT NULL CHECK (role IN ('ADMIN', 'USER')) DEFAULT 'USER',
UNIQUE(workspace_id, user_id)
);
-- shortcut
CREATE TABLE shortcut (
id INTEGER PRIMARY KEY AUTOINCREMENT,
@ -69,15 +38,8 @@ CREATE TABLE shortcut (
created_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
updated_ts BIGINT NOT NULL DEFAULT (strftime('%s', 'now')),
row_status TEXT NOT NULL CHECK (row_status IN ('NORMAL', 'ARCHIVED')) DEFAULT 'NORMAL',
workspace_id INTEGER NOT NULL,
name TEXT NOT NULL,
name TEXT NOT NULL UNIQUE,
link TEXT NOT NULL,
description TEXT NOT NULL DEFAULT '',
visibility TEXT NOT NULL CHECK (visibility IN ('PRIVATE', 'WORKSPACE', 'PUBLIC')) DEFAULT 'PRIVATE',
UNIQUE(workspace_id, name)
visibility TEXT NOT NULL CHECK (visibility IN ('PRIVATE', 'WORKSPACE', 'PUBLIC')) DEFAULT 'PRIVATE'
);
INSERT INTO
sqlite_sequence (name, seq)
VALUES
('shortcut', 100);

View File

@ -41,7 +41,6 @@ type Shortcut struct {
RowStatus RowStatus
// Domain specific fields
WorkspaceID int
Name string
Link string
Description string
@ -62,7 +61,6 @@ type FindShortcut struct {
ID *int
CreatorID *int
RowStatus *RowStatus
WorkspaceID *int
Name *string
VisibilityList []Visibility
}
@ -78,9 +76,9 @@ func (s *Store) CreateShortcut(ctx context.Context, create *Shortcut) (*Shortcut
}
defer tx.Rollback()
set := []string{"creator_id", "workspace_id", "name", "link", "description", "visibility"}
args := []any{create.CreatorID, create.WorkspaceID, create.Name, create.Link, create.Description, create.Visibility}
placeholder := []string{"?", "?", "?", "?", "?", "?"}
set := []string{"creator_id", "name", "link", "description", "visibility"}
args := []any{create.CreatorID, create.Name, create.Link, create.Description, create.Visibility}
placeholder := []string{"?", "?", "?", "?", "?"}
query := `
INSERT INTO shortcut (
@ -140,7 +138,7 @@ func (s *Store) UpdateShortcut(ctx context.Context, update *UpdateShortcut) (*Sh
` + strings.Join(set, ", ") + `
WHERE
id = ?
RETURNING id, creator_id, created_ts, updated_ts, workspace_id, row_status, name, link, description, visibility
RETURNING id, creator_id, created_ts, updated_ts, row_status, name, link, description, visibility
`
var shortcut Shortcut
if err := tx.QueryRowContext(ctx, query, args...).Scan(
@ -148,7 +146,6 @@ func (s *Store) UpdateShortcut(ctx context.Context, update *UpdateShortcut) (*Sh
&shortcut.CreatorID,
&shortcut.CreatedTs,
&shortcut.UpdatedTs,
&shortcut.WorkspaceID,
&shortcut.RowStatus,
&shortcut.Name,
&shortcut.Link,
@ -239,9 +236,6 @@ func listShortcuts(ctx context.Context, tx *sql.Tx, find *FindShortcut) ([]*Shor
if v := find.RowStatus; v != nil {
where, args = append(where, "row_status = ?"), append(args, *v)
}
if v := find.WorkspaceID; v != nil {
where, args = append(where, "workspace_id = ?"), append(args, *v)
}
if v := find.Name; v != nil {
where, args = append(where, "name = ?"), append(args, *v)
}
@ -261,7 +255,6 @@ func listShortcuts(ctx context.Context, tx *sql.Tx, find *FindShortcut) ([]*Shor
created_ts,
updated_ts,
row_status,
workspace_id,
name,
link,
description,
@ -284,7 +277,6 @@ func listShortcuts(ctx context.Context, tx *sql.Tx, find *FindShortcut) ([]*Shor
&shortcut.CreatorID,
&shortcut.CreatedTs,
&shortcut.UpdatedTs,
&shortcut.WorkspaceID,
&shortcut.RowStatus,
&shortcut.Name,
&shortcut.Link,

View File

@ -7,6 +7,16 @@ import (
"strings"
)
// Role is the type of a role.
type Role string
const (
// RoleAdmin is the ADMIN role.
RoleAdmin Role = "ADMIN"
// RoleUser is the USER role.
RoleUser Role = "USER"
)
type User struct {
ID int

View File

@ -1 +0,0 @@
package store

View File

@ -1,254 +0,0 @@
package store
import (
"context"
"database/sql"
"errors"
"fmt"
"strings"
)
type Workspace struct {
ID int
// Standard fields
CreatedTs int64
UpdatedTs int64
RowStatus RowStatus
// Domain specific fields
ResourceID string
Title string
Description string
}
type UpdateWorkspace struct {
ID int
// Standard fields
RowStatus *RowStatus
// Domain specific fields
ResourceID *string
Title *string
Description *string
}
type FindWorkspace struct {
ID *int
RowStatus *RowStatus
ResourceID *string
}
type DeleteWorkspace struct {
ID int
}
func (s *Store) CreateWorkspace(ctx context.Context, create *Workspace) (*Workspace, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
query := `
INSERT INTO workspace (
resource_id,
title,
description
)
VALUES (?, ?, ?)
RETURNING id, created_ts, updated_ts, row_status
`
if err := tx.QueryRowContext(ctx, query,
create.ResourceID,
create.Title,
create.Description,
).Scan(
&create.ID,
&create.CreatedTs,
&create.UpdatedTs,
&create.RowStatus,
); err != nil {
return nil, err
}
if err := tx.Commit(); err != nil {
return nil, err
}
workspace := create
return workspace, nil
}
func (s *Store) UpdateWorkspace(ctx context.Context, update *UpdateWorkspace) (*Workspace, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
set, args := []string{}, []any{}
if v := update.RowStatus; v != nil {
set, args = append(set, "row_status = ?"), append(args, *v)
}
if v := update.ResourceID; v != nil {
set, args = append(set, "resource_id = ?"), append(args, *v)
}
if v := update.Title; v != nil {
set, args = append(set, "title = ?"), append(args, *v)
}
if v := update.Description; v != nil {
set, args = append(set, "description = ?"), append(args, *v)
}
args = append(args, update.ID)
query := `
UPDATE workspace
SET ` + strings.Join(set, ", ") + `
WHERE id = ?
RETURNING id, created_ts, updated_ts, row_status, resource_id, title, description
`
row, err := tx.QueryContext(ctx, query, args...)
if err != nil {
return nil, err
}
defer row.Close()
if !row.Next() {
return nil, errors.New(fmt.Sprint("workspace ID not found: ", update.ID))
}
workspace := &Workspace{}
if err := row.Scan(
&workspace.ID,
&workspace.CreatedTs,
&workspace.UpdatedTs,
&workspace.RowStatus,
&workspace.ResourceID,
&workspace.Title,
&workspace.Description,
); err != nil {
return nil, err
}
if err := row.Err(); err != nil {
return nil, err
}
if err := tx.Commit(); err != nil {
return nil, err
}
return workspace, nil
}
func (s *Store) ListWorkspaces(ctx context.Context, find *FindWorkspace) ([]*Workspace, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
list, err := listWorkspaces(ctx, tx, find)
if err != nil {
return nil, err
}
return list, nil
}
func (s *Store) GetWorkspace(ctx context.Context, find *FindWorkspace) (*Workspace, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
list, err := listWorkspaces(ctx, tx, find)
if err != nil {
return nil, err
}
if len(list) == 0 {
return nil, nil
}
return list[0], nil
}
func (s *Store) DeleteWorkspace(ctx context.Context, delete *DeleteWorkspace) error {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return err
}
defer tx.Rollback()
if _, err := tx.ExecContext(ctx, `
DELETE FROM workspace WHERE id = ?
`, delete.ID); err != nil {
return err
}
if err := tx.Commit(); err != nil {
// do nothing here to prevent linter warning.
return err
}
return nil
}
func listWorkspaces(ctx context.Context, tx *sql.Tx, find *FindWorkspace) ([]*Workspace, error) {
where, args := []string{"1 = 1"}, []any{}
if v := find.ID; v != nil {
where, args = append(where, "id = ?"), append(args, *v)
}
if v := find.RowStatus; v != nil {
where, args = append(where, "row_status = ?"), append(args, *v)
}
if v := find.ResourceID; v != nil {
where, args = append(where, "resource_id = ?"), append(args, *v)
}
query := `
SELECT
id,
created_ts,
updated_ts,
row_status,
resource_id,
title,
description
FROM workspace
WHERE ` + strings.Join(where, " AND ") + `
ORDER BY created_ts DESC, row_status DESC
`
rows, err := tx.QueryContext(ctx, query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
list := make([]*Workspace, 0)
for rows.Next() {
var workspace Workspace
if err := rows.Scan(
&workspace.ID,
&workspace.CreatedTs,
&workspace.UpdatedTs,
&workspace.RowStatus,
&workspace.ResourceID,
&workspace.Title,
&workspace.Description,
); err != nil {
return nil, err
}
list = append(list, &workspace)
}
if err := rows.Err(); err != nil {
return nil, err
}
return list, nil
}

116
store/workspace_setting.go Normal file
View File

@ -0,0 +1,116 @@
package store
import (
"context"
"database/sql"
"strings"
)
type WorkspaceSetting struct {
Key string
Value string
}
type FindWorkspaceSetting struct {
Key string
}
func (s *Store) UpsertWorkspaceSetting(ctx context.Context, upsert *WorkspaceSetting) (*WorkspaceSetting, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
query := `
INSERT INTO workspace_setting (
key,
value
)
VALUES (?, ?)
ON CONFLICT(key) DO UPDATE
SET value = EXCLUDED.value
`
if _, err := tx.ExecContext(ctx, query, upsert.Key, upsert.Value); err != nil {
return nil, err
}
if err := tx.Commit(); err != nil {
return nil, err
}
workspaceSetting := upsert
return workspaceSetting, nil
}
func (s *Store) ListWorkspaceSettings(ctx context.Context, find *FindWorkspaceSetting) ([]*WorkspaceSetting, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
list, err := listWorkspaceSettings(ctx, tx, find)
if err != nil {
return nil, err
}
if err := tx.Commit(); err != nil {
return nil, err
}
return list, nil
}
func (s *Store) GetWorkspaceSetting(ctx context.Context, find *FindWorkspaceSetting) (*WorkspaceSetting, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
list, err := listWorkspaceSettings(ctx, tx, find)
if err != nil {
return nil, err
}
if len(list) == 0 {
return nil, nil
}
workspaceSetting := list[0]
return workspaceSetting, nil
}
func listWorkspaceSettings(ctx context.Context, tx *sql.Tx, find *FindWorkspaceSetting) ([]*WorkspaceSetting, error) {
where, args := []string{"1 = 1"}, []any{}
if find.Key != "" {
where, args = append(where, "key = ?"), append(args, find.Key)
}
query := `
SELECT
key,
value
FROM workspace_setting
WHERE ` + strings.Join(where, " AND ")
rows, err := tx.QueryContext(ctx, query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
list := []*WorkspaceSetting{}
for rows.Next() {
workspaceSetting := &WorkspaceSetting{}
if err := rows.Scan(
&workspaceSetting.Key,
&workspaceSetting.Value,
); err != nil {
return nil, err
}
list = append(list, workspaceSetting)
}
return list, nil
}

View File

@ -1,172 +0,0 @@
package store
import (
"context"
"database/sql"
"strings"
)
// Role is the type of a role.
type Role string
const (
// RoleAdmin is the ADMIN role.
RoleAdmin Role = "ADMIN"
// RoleUser is the USER role.
RoleUser Role = "USER"
)
type WorkspaceUser struct {
WorkspaceID int
UserID int
Role Role
}
type FindWorkspaceUser struct {
WorkspaceID *int
UserID *int
Role *Role
}
type DeleteWorkspaceUser struct {
WorkspaceID int
UserID int
}
func (s *Store) UpsertWorkspaceUser(ctx context.Context, upsert *WorkspaceUser) (*WorkspaceUser, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
set := []string{"workspace_id", "user_id", "role"}
args := []any{upsert.WorkspaceID, upsert.UserID, upsert.Role}
placeholder := []string{"?", "?", "?"}
query := `
INSERT INTO workspace_user (
` + strings.Join(set, ", ") + `
)
VALUES (` + strings.Join(placeholder, ",") + `)
ON CONFLICT(workspace_id, user_id) DO UPDATE
SET
role = EXCLUDED.role
`
if _, err := tx.ExecContext(ctx, query, args...); err != nil {
return nil, err
}
if err := tx.Commit(); err != nil {
return nil, err
}
workspaceUser := upsert
return workspaceUser, nil
}
func (s *Store) ListWorkspaceUsers(ctx context.Context, find *FindWorkspaceUser) ([]*WorkspaceUser, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
list, err := listWorkspaceUsers(ctx, tx, find)
if err != nil {
return nil, err
}
if err := tx.Commit(); err != nil {
return nil, err
}
return list, nil
}
func (s *Store) GetWorkspaceUser(ctx context.Context, find *FindWorkspaceUser) (*WorkspaceUser, error) {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return nil, err
}
defer tx.Rollback()
list, err := listWorkspaceUsers(ctx, tx, find)
if err != nil {
return nil, err
}
if len(list) == 0 {
return nil, nil
}
workspaceUser := list[0]
return workspaceUser, nil
}
func (s *Store) DeleteWorkspaceUser(ctx context.Context, delete *DeleteWorkspaceUser) error {
tx, err := s.db.BeginTx(ctx, nil)
if err != nil {
return err
}
defer tx.Rollback()
if _, err := tx.ExecContext(ctx, `
DELETE FROM workspace_user WHERE workspace_id = ? AND user_id = ?
`, delete.WorkspaceID, delete.UserID); err != nil {
return err
}
if err := tx.Commit(); err != nil {
// do nothing here to prevent linter warning.
return err
}
return nil
}
func listWorkspaceUsers(ctx context.Context, tx *sql.Tx, find *FindWorkspaceUser) ([]*WorkspaceUser, error) {
where, args := []string{"1 = 1"}, []any{}
if v := find.WorkspaceID; v != nil {
where, args = append(where, "workspace_id = ?"), append(args, *v)
}
if v := find.UserID; v != nil {
where, args = append(where, "user_id = ?"), append(args, *v)
}
if v := find.Role; v != nil {
where, args = append(where, "role = ?"), append(args, *v)
}
query := `
SELECT
workspace_id,
user_id,
role
FROM workspace_user
WHERE ` + strings.Join(where, " AND ")
rows, err := tx.QueryContext(ctx, query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
list := make([]*WorkspaceUser, 0)
for rows.Next() {
var workspaceUser WorkspaceUser
if err := rows.Scan(
&workspaceUser.WorkspaceID,
&workspaceUser.UserID,
&workspaceUser.Role,
); err != nil {
return nil, err
}
list = append(list, &workspaceUser)
}
if err := rows.Err(); err != nil {
return nil, err
}
return list, nil
}