Skip to content

Commit 05beb21

Browse files
Add project and member management with database migration, DTOs, services, and visibility default value
1 parent 67bd24d commit 05beb21

File tree

12 files changed

+380
-27
lines changed

12 files changed

+380
-27
lines changed

Migrations/20251119102854_Default_value_for_visibility.Designer.cs

Lines changed: 186 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System;
2+
using Microsoft.EntityFrameworkCore.Migrations;
3+
4+
#nullable disable
5+
6+
namespace sparkly_server.Migrations
7+
{
8+
/// <inheritdoc />
9+
public partial class Default_value_for_visibility : Migration
10+
{
11+
/// <inheritdoc />
12+
protected override void Up(MigrationBuilder migrationBuilder)
13+
{
14+
migrationBuilder.CreateTable(
15+
name: "projects",
16+
columns: table => new
17+
{
18+
Id = table.Column<Guid>(type: "uuid", nullable: false),
19+
ProjectName = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
20+
Description = table.Column<string>(type: "character varying(2000)", maxLength: 2000, nullable: false),
21+
Slug = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
22+
CreatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
23+
OwnerId = table.Column<Guid>(type: "uuid", nullable: false),
24+
UpdatedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
25+
Visibility = table.Column<int>(type: "integer", nullable: false, defaultValue: 0)
26+
},
27+
constraints: table =>
28+
{
29+
table.PrimaryKey("PK_projects", x => x.Id);
30+
});
31+
32+
migrationBuilder.CreateTable(
33+
name: "project_members",
34+
columns: table => new
35+
{
36+
MembersId = table.Column<Guid>(type: "uuid", nullable: false),
37+
ProjectsId = table.Column<Guid>(type: "uuid", nullable: false)
38+
},
39+
constraints: table =>
40+
{
41+
table.PrimaryKey("PK_project_members", x => new { x.MembersId, x.ProjectsId });
42+
table.ForeignKey(
43+
name: "FK_project_members_projects_ProjectsId",
44+
column: x => x.ProjectsId,
45+
principalTable: "projects",
46+
principalColumn: "Id",
47+
onDelete: ReferentialAction.Cascade);
48+
table.ForeignKey(
49+
name: "FK_project_members_users_MembersId",
50+
column: x => x.MembersId,
51+
principalTable: "users",
52+
principalColumn: "Id",
53+
onDelete: ReferentialAction.Cascade);
54+
});
55+
56+
migrationBuilder.CreateIndex(
57+
name: "IX_project_members_ProjectsId",
58+
table: "project_members",
59+
column: "ProjectsId");
60+
}
61+
62+
/// <inheritdoc />
63+
protected override void Down(MigrationBuilder migrationBuilder)
64+
{
65+
migrationBuilder.DropTable(
66+
name: "project_members");
67+
68+
migrationBuilder.DropTable(
69+
name: "projects");
70+
}
71+
}
72+
}

Migrations/AppDbContextModelSnapshot.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,21 @@ protected override void BuildModel(ModelBuilder modelBuilder)
2222

2323
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
2424

25+
modelBuilder.Entity("ProjectUser", b =>
26+
{
27+
b.Property<Guid>("MembersId")
28+
.HasColumnType("uuid");
29+
30+
b.Property<Guid>("ProjectsId")
31+
.HasColumnType("uuid");
32+
33+
b.HasKey("MembersId", "ProjectsId");
34+
35+
b.HasIndex("ProjectsId");
36+
37+
b.ToTable("project_members", (string)null);
38+
});
39+
2540
modelBuilder.Entity("sparkly_server.Domain.Auth.RefreshToken", b =>
2641
{
2742
b.Property<Guid>("Id")
@@ -58,6 +73,46 @@ protected override void BuildModel(ModelBuilder modelBuilder)
5873
b.ToTable("refresh_tokens", (string)null);
5974
});
6075

76+
modelBuilder.Entity("sparkly_server.Domain.Projects.Project", b =>
77+
{
78+
b.Property<Guid>("Id")
79+
.ValueGeneratedOnAdd()
80+
.HasColumnType("uuid");
81+
82+
b.Property<DateTime>("CreatedAt")
83+
.HasColumnType("timestamp with time zone");
84+
85+
b.Property<string>("Description")
86+
.IsRequired()
87+
.HasMaxLength(2000)
88+
.HasColumnType("character varying(2000)");
89+
90+
b.Property<Guid>("OwnerId")
91+
.HasColumnType("uuid");
92+
93+
b.Property<string>("ProjectName")
94+
.IsRequired()
95+
.HasMaxLength(200)
96+
.HasColumnType("character varying(200)");
97+
98+
b.Property<string>("Slug")
99+
.IsRequired()
100+
.HasMaxLength(256)
101+
.HasColumnType("character varying(256)");
102+
103+
b.Property<DateTime>("UpdatedAt")
104+
.HasColumnType("timestamp with time zone");
105+
106+
b.Property<int>("Visibility")
107+
.ValueGeneratedOnAdd()
108+
.HasColumnType("integer")
109+
.HasDefaultValue(0);
110+
111+
b.HasKey("Id");
112+
113+
b.ToTable("projects", (string)null);
114+
});
115+
61116
modelBuilder.Entity("sparkly_server.Domain.User", b =>
62117
{
63118
b.Property<Guid>("Id")
@@ -92,6 +147,21 @@ protected override void BuildModel(ModelBuilder modelBuilder)
92147
b.ToTable("users", (string)null);
93148
});
94149

150+
modelBuilder.Entity("ProjectUser", b =>
151+
{
152+
b.HasOne("sparkly_server.Domain.User", null)
153+
.WithMany()
154+
.HasForeignKey("MembersId")
155+
.OnDelete(DeleteBehavior.Cascade)
156+
.IsRequired();
157+
158+
b.HasOne("sparkly_server.Domain.Projects.Project", null)
159+
.WithMany()
160+
.HasForeignKey("ProjectsId")
161+
.OnDelete(DeleteBehavior.Cascade)
162+
.IsRequired();
163+
});
164+
95165
modelBuilder.Entity("sparkly_server.Domain.Auth.RefreshToken", b =>
96166
{
97167
b.HasOne("sparkly_server.Domain.User", "User")

src/Controllers/Projects/ProjectsController.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using Microsoft.AspNetCore.Authorization;
22
using Microsoft.AspNetCore.Mvc;
3+
using sparkly_server.Domain.Projects;
4+
using sparkly_server.DTO.Projects;
5+
using sparkly_server.Enum;
36
using sparkly_server.Services.Projects;
47
using sparkly_server.Services.Users;
58

@@ -19,7 +22,20 @@ public ProjectsController(IProjectService projects, ICurrentUser currentUser, IU
1922
_currentUser = currentUser;
2023
_users = users;
2124
}
22-
23-
// Controllers soon :)
25+
26+
public async Task<IActionResult> CreateProject([FromBody] CreateProjectRequest request)
27+
{
28+
var project = await _projects.CreateProjectAsync(request.ProjectName, request.Description, request.Visibility);
29+
30+
var response = new ProjectResponse(
31+
Id: project.Id,
32+
ProjectName: project.ProjectName,
33+
Description: project.Description,
34+
Visibility: project.Visibility,
35+
OwnerId: project.OwnerId
36+
);
37+
38+
return Ok(response);
39+
}
2440
}
2541
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using sparkly_server.Enum;
2+
3+
namespace sparkly_server.DTO.Projects
4+
{
5+
public sealed record CreateProjectRequest(
6+
string ProjectName,
7+
string Description,
8+
ProjectVisibility Visibility
9+
);
10+
}

0 commit comments

Comments
 (0)