You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
4.4 KiB
197 lines
4.4 KiB
package mysql
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"encoding/json"
|
|
"git.aiterp.net/stufflog3/stufflog3/entities"
|
|
"git.aiterp.net/stufflog3/stufflog3/models"
|
|
"git.aiterp.net/stufflog3/stufflog3/ports/mysql/mysqlcore"
|
|
)
|
|
|
|
type scopeRepository struct {
|
|
db *sql.DB
|
|
q *mysqlcore.Queries
|
|
}
|
|
|
|
func (r *scopeRepository) Find(ctx context.Context, id int) (*entities.Scope, error) {
|
|
row, err := r.q.GetScope(ctx, id)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, models.NotFoundError("Scope")
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
customLabels := make(map[string]string, 0)
|
|
if row.CustomLabels.Valid {
|
|
_ = json.Unmarshal(row.CustomLabels.RawMessage, &customLabels)
|
|
}
|
|
|
|
return &entities.Scope{
|
|
ID: row.ID,
|
|
Name: row.Name,
|
|
Abbreviation: row.Abbreviation,
|
|
CustomLabels: customLabels,
|
|
}, nil
|
|
}
|
|
|
|
func (r *scopeRepository) List(ctx context.Context) ([]entities.Scope, error) {
|
|
rows, err := r.q.ListScopes(ctx)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return []entities.Scope{}, nil
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
res := make([]entities.Scope, 0, len(rows))
|
|
for _, row := range rows {
|
|
customLabels := make(map[string]string, 0)
|
|
if row.CustomLabels.Valid {
|
|
_ = json.Unmarshal(row.CustomLabels.RawMessage, &customLabels)
|
|
}
|
|
|
|
res = append(res, entities.Scope{
|
|
ID: row.ID,
|
|
Name: row.Name,
|
|
Abbreviation: row.Abbreviation,
|
|
CustomLabels: customLabels,
|
|
})
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
func (r *scopeRepository) ListUser(ctx context.Context, userID string) ([]entities.Scope, error) {
|
|
rows, err := r.q.ListScopesByUser(ctx, userID)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return []entities.Scope{}, nil
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
res := make([]entities.Scope, 0, len(rows))
|
|
for _, row := range rows {
|
|
customLabels := make(map[string]string, 0)
|
|
if row.CustomLabels.Valid {
|
|
_ = json.Unmarshal(row.CustomLabels.RawMessage, &customLabels)
|
|
}
|
|
|
|
res = append(res, entities.Scope{
|
|
ID: row.ID,
|
|
Name: row.Name,
|
|
Abbreviation: row.Abbreviation,
|
|
CustomLabels: customLabels,
|
|
})
|
|
}
|
|
|
|
return res, nil
|
|
}
|
|
|
|
func (r *scopeRepository) Create(ctx context.Context, scope entities.Scope, ownerID string) (*entities.Scope, error) {
|
|
//TODO implement me
|
|
panic("implement me")
|
|
}
|
|
|
|
func (r *scopeRepository) Update(ctx context.Context, scope entities.Scope, update models.ScopeUpdate) error {
|
|
//TODO implement me
|
|
panic("implement me")
|
|
}
|
|
|
|
func (r *scopeRepository) Delete(ctx context.Context, scope entities.Scope) error {
|
|
tx, err := r.db.BeginTx(ctx, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer tx.Rollback()
|
|
q := r.q.WithTx(tx)
|
|
|
|
err = q.DeleteAllScopeMembers(ctx, scope.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = q.DeleteScope(ctx, scope.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// TODO: Wipe everything
|
|
|
|
return tx.Commit()
|
|
}
|
|
|
|
func (r *scopeRepository) ListMembers(ctx context.Context, scopeIDs ...int) ([]entities.ScopeMember, error) {
|
|
res := make([]entities.ScopeMember, 0, 8)
|
|
if len(scopeIDs) == 1 {
|
|
rows, err := r.q.ListScopeMembers(ctx, scopeIDs[0])
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return []entities.ScopeMember{}, nil
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
for _, row := range rows {
|
|
res = append(res, entities.ScopeMember{
|
|
ScopeID: row.ScopeID,
|
|
UserID: row.UserID,
|
|
Name: row.Name,
|
|
Owner: row.Owner,
|
|
})
|
|
}
|
|
} else {
|
|
for i := 0; i < len(scopeIDs); i += 6 {
|
|
ids := []int{-1, -2, -3, -4, -5, -6}
|
|
copy(ids, scopeIDs[i:])
|
|
|
|
rows, err := r.q.ListScopeMembersMulti(ctx, mysqlcore.ListScopeMembersMultiParams{
|
|
ScopeID: ids[0],
|
|
ScopeID_2: ids[1],
|
|
ScopeID_3: ids[2],
|
|
ScopeID_4: ids[3],
|
|
ScopeID_5: ids[4],
|
|
ScopeID_6: ids[5],
|
|
})
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return []entities.ScopeMember{}, nil
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
for _, row := range rows {
|
|
res = append(res, entities.ScopeMember{
|
|
ScopeID: row.ScopeID,
|
|
UserID: row.UserID,
|
|
Name: row.Name,
|
|
Owner: row.Owner,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
return res, nil
|
|
}
|
|
|
|
func (r *scopeRepository) SaveMember(ctx context.Context, member entities.ScopeMember) error {
|
|
return r.q.ReplaceScopeMember(ctx, mysqlcore.ReplaceScopeMemberParams{
|
|
ScopeID: member.ScopeID,
|
|
UserID: member.UserID,
|
|
Name: member.Name,
|
|
Owner: member.Owner,
|
|
})
|
|
}
|
|
|
|
func (r *scopeRepository) DeleteMember(ctx context.Context, member entities.ScopeMember) error {
|
|
return r.q.DeleteScopeMember(ctx, mysqlcore.DeleteScopeMemberParams{
|
|
ScopeID: member.ScopeID,
|
|
UserID: member.UserID,
|
|
})
|
|
}
|