changed from json projects to m:n

This commit is contained in:
2022-02-14 22:19:44 +01:00
parent e69073ecad
commit 66f9df86d8
6 changed files with 117 additions and 43 deletions

View File

@@ -2,6 +2,7 @@ package postgres
import (
"context"
"github.com/jackc/pgx/v4"
"serverctl/pkg/application/projects"
"serverctl/pkg/db"
)
@@ -17,17 +18,10 @@ func NewProjectsRepository(db *db.Client) projects.Repository {
}
type projectData struct {
Name string `json:"name"`
MemberIds []int `json:"memberIds"`
AdminIds []int `json:"adminIds"`
}
func NewProjectData(project *projects.CreateProject) projectData {
return projectData{
Name: project.Name,
AdminIds: project.AdminIds,
MemberIds: project.MemberIds,
}
ProjectId int
ProjectName string
MemberId int
MemberRole string
}
func (p ProjectsRepository) Create(ctx context.Context, project *projects.CreateProject) (int, error) {
@@ -35,7 +29,15 @@ func (p ProjectsRepository) Create(ctx context.Context, project *projects.Create
defer conn.Release()
var projectId int
err := conn.QueryRow(ctx, "insert into sctl_project(data) values ($1) returning id", NewProjectData(project)).Scan(&projectId)
err := conn.BeginTxFunc(ctx, pgx.TxOptions{}, func(tx pgx.Tx) error {
err := tx.QueryRow(ctx, "insert into sctl_project(name) values ($1) returning id", project.Name).Scan(&projectId)
if err != nil {
return err
}
_, err = tx.Exec(ctx, "insert into sctl_project_member(project_id, member_id, role) values($1, $2, $3)", projectId, project.MemberIds[0], "admin")
return err
})
if err != nil {
return -1, err
}
@@ -47,19 +49,49 @@ func (p ProjectsRepository) GetForMemberId(ctx context.Context, memberId int) ([
conn := p.db.GetConn(ctx)
defer conn.Release()
rows, _ := conn.Query(ctx, "select id, data from sctl_project")
projectsArr := make([]*projects.Project, 0)
rows, _ := conn.Query(ctx, `
select pm.project_id, name project_name, pm.member_id, pm.role member_role
from sctl_project
join sctl_project_member pm
on sctl_project.id = pm.project_id
join sctl_user u
on pm.member_id = u.id
where pm.member_id = $1
order by pm.project_id
`, memberId)
projectsDataArr := make([]*projectData, 0)
for rows.Next() {
var (
id int
data projectData
)
err := rows.Scan(&id, &data)
var pd projectData
err := rows.Scan(&pd.ProjectId, &pd.ProjectName, &pd.MemberId, &pd.MemberRole)
if err != nil {
return nil, err
}
projectsArr = append(projectsArr, projects.NewProject(id, data.Name, data.MemberIds, data.AdminIds))
projectsDataArr = append(projectsDataArr, &pd)
}
projectsArr := make([]*projects.Project, 0)
var tempProject *projects.Project
for _, project := range projectsDataArr {
if tempProject == nil {
tempProject = projects.NewProject(
project.ProjectId,
project.ProjectName,
projects.NewProjectMember(project.MemberId, project.MemberRole),
)
} else if tempProject.Id != project.ProjectId {
projectsArr = append(projectsArr, tempProject)
tempProject = projects.NewProject(
project.ProjectId,
project.ProjectName,
projects.NewProjectMember(project.MemberId, project.MemberRole),
)
} else {
tempProject.AddMember(
projects.NewProjectMember(project.MemberId, project.MemberRole))
}
}
if tempProject != nil {
projectsArr = append(projectsArr, tempProject)
}
return projectsArr, nil