Skip to content

Commit

Permalink
wip: setting up service for creating issues (#41)
Browse files Browse the repository at this point in the history
* wip: setting up service for creating issues

* wip: adding templates for emails

* feat: finish report issue form

* feat: add some error handling
  • Loading branch information
glitchedmob authored Oct 11, 2024
1 parent 7ea6403 commit e2a517f
Show file tree
Hide file tree
Showing 22 changed files with 547 additions and 15 deletions.
24 changes: 14 additions & 10 deletions backend/src/MethodConf.Cms/Controllers/ConferenceIssueController.cs
Original file line number Diff line number Diff line change
@@ -1,26 +1,30 @@
using Asp.Versioning;
using AutoMapper;
using MethodConf.Cms.Domain;
using MethodConf.Cms.Domain.Errors;
using MethodConf.Cms.Dtos;
using MethodConf.Cms.Services.Interfaces;
using Microsoft.AspNetCore.Mvc;

namespace MethodConf.Cms.Controllers;

[ApiController]
[ApiVersion("1.0")]
[Route(RouteTemplates.ConferenceIssue)]
public class ConferenceIssueController : Controller
public class ConferenceIssueController(IConferenceIssueService conferenceIssueService, IMapper mapper) : Controller
{
[HttpPost]
public async Task<ActionResult<CreateIssueResponseDto>> CreateIssue(Guid conferenceId, CreateIssueRequestDto request)
{
await Task.CompletedTask;
return Ok(new CreateIssueResponseDto
var createIssue = mapper.Map<CreateIssue>(request);

var result = await conferenceIssueService.CreateIssue(conferenceId, createIssue);

return result switch
{
Message = request.Message,
Resolution = request.Resolution,
Name = request.Name,
Email = request.Email,
Phone = request.Phone,
ResponseMarkup = """<p>This is some test markup with a <a href="https://google.com">link</a></p>""",
});
{ IsFailed: true } when result.Errors.Any(e => e is InvalidEntityIdError) => NotFound(result.Errors),
{ IsSuccess: true } => Ok(mapper.Map<CreateIssueResponseDto>(result.Value)),
_ => StatusCode(500)
};
}
}
14 changes: 14 additions & 0 deletions backend/src/MethodConf.Cms/Domain/CreateIssue.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace MethodConf.Cms.Domain;

public class CreateIssue
{
public required string Message { get; set; }

public string? Resolution { get; set; }

public string? Name { get; set; }

public string? Email { get; set; }

public string? PhoneNumber { get; set; }
}
25 changes: 25 additions & 0 deletions backend/src/MethodConf.Cms/Domain/Issue.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.ComponentModel.DataAnnotations;

namespace MethodConf.Cms.Domain;

public class Issue
{
public Guid Id { get; set; }

public Guid ConferenceId { get; set; }

[MaxLength(10_000)]
public required string Message { get; set; }

[MaxLength(10_000)]
public string? Resolution { get; set; }

[MaxLength(255)]
public string? Name { get; set; }

[MaxLength(255)]
public string? Email { get; set; }

[MaxLength(255)]
public string? PhoneNumber { get; set; }
}
20 changes: 20 additions & 0 deletions backend/src/MethodConf.Cms/Domain/IssueWithResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace MethodConf.Cms.Domain;

public class IssueWithResponse
{
public Guid Id { get; set; }

public Guid ConferenceId { get; set; }

public required string Message { get; set; }

public string? Resolution { get; set; }

public string? Name { get; set; }

public string? Email { get; set; }

public string? PhoneNumber { get; set; }

public required string ResponseMarkup { get; set; }
}
2 changes: 1 addition & 1 deletion backend/src/MethodConf.Cms/Domain/SessionFeedback.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class SessionFeedback

public required int VenueRating { get; set; }

[MaxLength(5000)]
[MaxLength(10_000)]
public string? Comments { get; set; }

[MaxLength(255)]
Expand Down
10 changes: 10 additions & 0 deletions backend/src/MethodConf.Cms/Dtos/NewIssueAppResponseViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace MethodConf.Cms.Dtos;

public class NewIssueAppResponseViewModel
{
public required string Message { get; set; }
public string? Resolution { get; set; }
public string? Name { get; set; }
public string? Email { get; set; }
public string? Phone { get; set; }
}
11 changes: 11 additions & 0 deletions backend/src/MethodConf.Cms/Dtos/NewIssueEmailViewModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace MethodConf.Cms.Dtos;

public class NewIssueEmailViewModel
{
public string? Title { get; set; }
public required string Message { get; set; }
public string? Resolution { get; set; }
public string? Name { get; set; }
public string? Email { get; set; }
public string? Phone { get; set; }
}
2 changes: 2 additions & 0 deletions backend/src/MethodConf.Cms/Infrastructure/AppDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
}

public required DbSet<SessionFeedback> SessionFeedback { get; set; }

public required DbSet<Issue> Issues { get; set; }
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace MethodConf.Cms.Infrastructure.Migrations
{
/// <inheritdoc />
public partial class AddIssue : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Issues",
columns: table => new
{
Id = table.Column<Guid>(type: "TEXT", nullable: false),
ConferenceId = table.Column<Guid>(type: "TEXT", nullable: false),
Message = table.Column<string>(type: "TEXT", maxLength: 10000, nullable: false),
Resolution = table.Column<string>(type: "TEXT", maxLength: 10000, nullable: true),
Name = table.Column<string>(type: "TEXT", maxLength: 255, nullable: true),
Email = table.Column<string>(type: "TEXT", maxLength: 255, nullable: true),
PhoneNumber = table.Column<string>(type: "TEXT", maxLength: 255, nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Issues", x => x.Id);
});
}

/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Issues");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,49 @@ protected override void BuildModel(ModelBuilder modelBuilder)
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "8.0.7");

modelBuilder.Entity("MethodConf.Cms.Domain.Issue", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");

b.Property<Guid>("ConferenceId")
.HasColumnType("TEXT");

b.Property<string>("Email")
.HasMaxLength(255)
.HasColumnType("TEXT");

b.Property<string>("Message")
.IsRequired()
.HasMaxLength(10000)
.HasColumnType("TEXT");

b.Property<string>("Name")
.HasMaxLength(255)
.HasColumnType("TEXT");

b.Property<string>("PhoneNumber")
.HasMaxLength(255)
.HasColumnType("TEXT");

b.Property<string>("Resolution")
.HasMaxLength(10000)
.HasColumnType("TEXT");

b.HasKey("Id");

b.ToTable("Issues");
});

modelBuilder.Entity("MethodConf.Cms.Domain.SessionFeedback", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT");

b.Property<string>("Comments")
.HasMaxLength(5000)
.HasMaxLength(10000)
.HasColumnType("TEXT");

b.Property<int>("ContentRating")
Expand Down
13 changes: 12 additions & 1 deletion backend/src/MethodConf.Cms/Mapping/DefaultProfile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,21 @@ public DefaultProfile()
CreateMap<Session, SessionItem>()
.ForMember(dest => dest.Key, opts => opts.MapFrom(src => src.UrlSegment));
CreateMap<Track, TrackItem>()
.ForMember(dest => dest.Sessions, opt => opt.MapFrom((src, _) => src.Children<Session>() ?? []));
.ForMember(dest => dest.Sessions, opts => opts.MapFrom((src, _) => src.Children<Session>() ?? []));

CreateMap<CreateSessionFeedbackRequestDto, CreateSessionFeedback>();
CreateMap<CreateSessionFeedback, SessionFeedback>();
CreateMap<SessionFeedback, SessionFeedbackResponseDto>();

CreateMap<CreateIssueRequestDto, CreateIssue>()
.ForMember(dest => dest.PhoneNumber, opts => opts.MapFrom(src => src.Phone));
CreateMap<CreateIssue, Issue>();
CreateMap<Issue, IssueWithResponse>();
CreateMap<IssueWithResponse, CreateIssueResponseDto>()
.ForMember(dest => dest.Phone, opts => opts.MapFrom(src => src.PhoneNumber));
CreateMap<Issue, NewIssueEmailViewModel>()
.ForMember(dest => dest.Phone, opts => opts.MapFrom(src => src.PhoneNumber));
CreateMap<Issue, NewIssueAppResponseViewModel>()
.ForMember(dest => dest.Phone, opts => opts.MapFrom(src => src.PhoneNumber));
}
}
1 change: 1 addition & 0 deletions backend/src/MethodConf.Cms/MethodConf.Cms.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Razor.Templating.Core" Version="2.0.0" />
<PackageReference Include="Umbraco.Cms" Version="14.2.0"/>
<PackageReference Include="Umbraco.Community.DeliveryApiExtensions" Version="14.0.0-beta.1"/>
<PackageReference Include="uSync" Version="14.0.0"/>
Expand Down
Loading

0 comments on commit e2a517f

Please sign in to comment.