diff --git a/api/v1/projects.go b/api/v1/projects.go new file mode 100644 index 0000000..58c6a3d --- /dev/null +++ b/api/v1/projects.go @@ -0,0 +1,38 @@ +package v1 + +import ( + "context" + + projects "gitea.badhouseplants.net/softplayer/softplayer-go-proto/pkg/projects/v1" + "google.golang.org/grpc" +) + +func NewProjectsServer() *ProjectsServer { + return &ProjectsServer{} +} + +// var _ projects.ProjectsServiceServer = (*ProjectsServer)(nil) + +type ProjectsServer struct { + projects.UnimplementedProjectsServiceServer +} + +// CreateProject implements [v1.ProjectsServiceServer]. +func (p *ProjectsServer) CreateProject(context.Context, *projects.CreateProjectRequest) (*projects.CreateProjectResponse, error) { + panic("unimplemented") +} + +// GetProject implements [v1.ProjectsServiceServer]. +func (p *ProjectsServer) GetProject(context.Context, *projects.GetProjectRequest) (*projects.GetProjectResponse, error) { + panic("unimplemented") +} + +// ListProjects implements [v1.ProjectsServiceServer]. +func (p *ProjectsServer) ListProjects(*projects.ListProjectsRequest, grpc.ServerStreamingServer[projects.ListProjectsResponse]) error { + panic("unimplemented") +} + +// UpdateProject implements [v1.ProjectsServiceServer]. +func (p *ProjectsServer) UpdateProject(context.Context, *projects.UpdateProjectRequest) (*projects.UpdateProjectResponse, error) { + panic("unimplemented") +} diff --git a/api/v1/public_accounts.go b/api/v1/public_accounts.go index 881d0f8..fe9495c 100644 --- a/api/v1/public_accounts.go +++ b/api/v1/public_accounts.go @@ -66,6 +66,8 @@ func (a *PublicAccountService) SignUp(ctx context.Context, in *accounts.SignUpRe data := &controllers.AccountData{ Password: in.GetPassword(), Email: in.GetEmail(), + Name: in.PersonalData.GetName(), + Surname: in.PersonalData.GetSurname(), } id, err := a.accountsCtrl.Create(ctx, data) if err != nil { diff --git a/internal/controllers/accounts.go b/internal/controllers/accounts.go index d6ad0fb..acb5010 100644 --- a/internal/controllers/accounts.go +++ b/internal/controllers/accounts.go @@ -41,6 +41,8 @@ type AccountData struct { Password string Email string UUID string + Name string + Surname string } // Create a new account @@ -59,6 +61,8 @@ func (c *AccountController) Create(ctx context.Context, data *AccountData) (stri UUID: data.UUID, Email: data.Email, PasswordHash: passwordHash, + Name: data.Name, + Surname: data.Surname, } if err := repository.CreateAccount(ctx, c.DB, queryData); err != nil { diff --git a/internal/controllers/accounts_test.go b/internal/controllers/accounts_test.go index d87a2b1..22e3f58 100644 --- a/internal/controllers/accounts_test.go +++ b/internal/controllers/accounts_test.go @@ -70,6 +70,8 @@ func TestIntegrationAccountCreate_Success(t *testing.T) { accountData := &controllers.AccountData{ Password: "qwertyu9", Email: newTestUniqueEmail("accounts"), + Surname: "Doe", + Name: "John", } id, err := ctrl.Create(t.Context(), accountData) assert.NoError(t, err) @@ -82,6 +84,8 @@ func TestIntegrationAccountCreate_ExistingAccountErr(t *testing.T) { accountData := &controllers.AccountData{ Password: "qwertyu9", Email: email, + Surname: "Doe", + Name: "John", } id, err := ctrl.Create(t.Context(), accountData) assert.NoError(t, err) diff --git a/internal/controllers/projects.go b/internal/controllers/projects.go new file mode 100644 index 0000000..95fce54 --- /dev/null +++ b/internal/controllers/projects.go @@ -0,0 +1,27 @@ +package controllers + +import "context" + +type ProjectsController struct{} + +type ProjectData struct{} + +// Create a new project +func (ctrl *ProjectsController) Create(ctx context.Context, data *ProjectData) (id string, err error) { + return "", nil +} + +// Update an existing project +func (ctrl *ProjectsController) Update(ctx context.Context, data *ProjectData) error { + return nil +} + +// Get an existing project by ID +func (ctrl *ProjectsController) Get(ctx context.Context, projectID string) (data *ProjectData, err error) { + return nil, nil +} + +// List projects available for a user +func (ctrl *ProjectsController) List(ctx context.Context) (data []*ProjectData, err error) { + return nil, nil +} diff --git a/internal/repository/accounts.go b/internal/repository/accounts.go index e396e5b..b966e7c 100644 --- a/internal/repository/accounts.go +++ b/internal/repository/accounts.go @@ -18,13 +18,15 @@ type AccountData struct { UUID string Email string PasswordHash string + Name string + Surname string } // CreateAccount adds a new account to a database func CreateAccount(ctx context.Context, db *sql.DB, account *AccountData) error { - query := "INSERT INTO accounts (uuid, email, password_hash) VALUES ($1, $2, $3)" + query := "INSERT INTO accounts (uuid, email, password_hash, name, surname) VALUES ($1, $2, $3, $4, $5)" - if _, err := db.ExecContext(ctx, query, account.UUID, account.Email, account.PasswordHash); err != nil { + if _, err := db.ExecContext(ctx, query, account.UUID, account.Email, account.PasswordHash, account.Name, account.Surname); err != nil { var pgErr *pgconn.PgError if errors.As(err, &pgErr) { if pgErr.Code == pgerrcode.UniqueViolation { diff --git a/internal/repository/projects.go b/internal/repository/projects.go new file mode 100644 index 0000000..85bac95 --- /dev/null +++ b/internal/repository/projects.go @@ -0,0 +1,40 @@ +package repository + +import ( + "context" + "database/sql" + "time" +) + +type ProjectData struct { + UUID string + Name string + Slug string + Description string + OwnerID string + CreatedAt string + ArchivedAt time.Time + Blocked bool + UpdatedAt time.Time + UpdatedBy string +} + +// CreateProject adds a new projects to the database +func CreateProject(ctx context.Context, db *sql.DB, data *ProjectData) error { + return nil +} + +// GetProjectByID returns a project from the database +func GetProjectByID(ctx context.Context, db *sql.DB, projectID string) (data *ProjectData, err error) { + return nil, nil +} + +// UpdateProject change editable project data +func UpdateProject(ctx context.Context, db *sql.DB, data *ProjectData) error { + return nil +} + +// ListProjects get all projects that are available for the user from the database +func ListProjects(ctx context.Context, db *sql.DB) ([]*ProjectData, error) { + return nil, nil +} diff --git a/migrations/20260518174322_users_personal_data.down.sql b/migrations/20260518174322_users_personal_data.down.sql new file mode 100644 index 0000000..5e63184 --- /dev/null +++ b/migrations/20260518174322_users_personal_data.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE accounts +DROP COLUMN name, +DROP COLUMN surname; diff --git a/migrations/20260518174322_users_personal_data.up.sql b/migrations/20260518174322_users_personal_data.up.sql new file mode 100644 index 0000000..c6c8ef6 --- /dev/null +++ b/migrations/20260518174322_users_personal_data.up.sql @@ -0,0 +1,14 @@ +-- Up migration (safe for existing data) +ALTER TABLE accounts +ADD COLUMN name TEXT, +ADD COLUMN surname TEXT; + +UPDATE accounts +SET + name = 'John', + surname = 'Doe' +WHERE name IS NULL OR surname IS NULL; + +ALTER TABLE accounts +ALTER COLUMN name SET NOT NULL, +ALTER COLUMN surname SET NOT NULL; diff --git a/migrations/20260518193048_projects_init.down.sql b/migrations/20260518193048_projects_init.down.sql new file mode 100644 index 0000000..2e30072 --- /dev/null +++ b/migrations/20260518193048_projects_init.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXIST prohects; diff --git a/migrations/20260518193048_projects_init.up.sql b/migrations/20260518193048_projects_init.up.sql new file mode 100644 index 0000000..60d8bf0 --- /dev/null +++ b/migrations/20260518193048_projects_init.up.sql @@ -0,0 +1,16 @@ +CREATE TABLE projects ( + id UUID PRIMARY KEY, + name VARCHAR(120) NOT NULL, + slug VARCHAR(120) NOT NULL UNIQUE, + description TEXT, + owner_user_id UUID NOT NULL, + archived_at TIMESTAMP NULL, + closed_at TIMESTAMP NULL, + billing_account_id UUID NULL, + max_clusters INTEGER DEFAULT 10, + max_nodes INTEGER DEFAULT 100, + created_at TIMESTAMP NOT NULL DEFAULT now(), + updated_at TIMESTAMP NOT NULL DEFAULT now(), + created_by UUID NOT NULL, + updated_by UUID NOT NULL, +); diff --git a/migrations/20260518193057_project_membership_init.down.sql b/migrations/20260518193057_project_membership_init.down.sql new file mode 100644 index 0000000..e69de29 diff --git a/migrations/20260518193057_project_membership_init.up.sql b/migrations/20260518193057_project_membership_init.up.sql new file mode 100644 index 0000000..e69de29