aboutsummaryrefslogtreecommitdiffstats
path: root/code/api/src/Endpoints/V1/Projects/CreateProjectRoute.cs
blob: bd37faf56334d9d6fb59e9d1f8373b7b3b2de63d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
namespace IOL.GreatOffice.Api.Endpoints.V1.Projects;

public class CreateProjectRoute : RouteBaseAsync.WithRequest<CreateProjectPayload>.WithActionResult
{
    private readonly MainAppDatabase _database;
    private readonly IStringLocalizer<SharedResources> _localizer;

    public CreateProjectRoute(MainAppDatabase database, IStringLocalizer<SharedResources> localizer) {
        _database = database;
        _localizer = localizer;
    }

    [HttpPost("~/v{version:apiVersion}/projects/create")]
    public override async Task<ActionResult> HandleAsync(CreateProjectPayload request, CancellationToken cancellationToken = default) {
        var problem = new KnownProblemModel();

        if (request.Name.IsNullOrEmpty()) {
            problem.AddError("name", _localizer["Name is a required field"]);
        }

        var project = new Project(LoggedInUser) {
            Name = request.Name,
            Description = request.Description,
            Start = request.Start,
            Stop = request.Stop,
        };

        project.SetOwnerIds(default, LoggedInUser.TenantId);

        foreach (var customerId in request.CustomerIds) {
            var customer = _database.Customers.FirstOrDefault(c => c.Id == customerId);
            if (customer == default) {
                problem.AddError("customer_" + customerId, _localizer["Customer not found"]);
                continue;
            }

            project.Customers.Add(customer);
        }

        foreach (var member in request.Members) {
            var user = _database.Users.FirstOrDefault(c => c.Id == member.UserId);
            if (user == default) {
                problem.AddError("members_" + member.UserId, _localizer["User not found"]);
                continue;
            }

            project.Members.Add(new ProjectMember() {
                Project = project,
                User = user,
                Role = member.Role
            });
        }

        if (problem.Errors.Any()) {
            problem.Title = _localizer["Invalid form"];
            problem.Subtitle = _localizer["One or more validation errors occured"];
            return KnownProblem(problem);
        }

        _database.Projects.Add(project);
        await _database.SaveChangesAsync(cancellationToken);
        return Ok();
    }
}

public class CreateProjectResponse
{ }

public class CreateProjectPayload
{
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime Start { get; set; }
    public DateTime Stop { get; set; }
    public List<Guid> CustomerIds { get; set; }
    public List<ProjectMember> Members { get; set; }

    public class ProjectMember
    {
        public Guid UserId { get; set; }
        public ProjectRole Role { get; set; }
    }
}