Skip to content

Commit d608357

Browse files
Merge pull request #16 from CapstoneProjectCMC/feature/Organization-Service
basic crud for org and class and grade
2 parents 29836bb + 716472a commit d608357

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1350
-39
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using Microsoft.AspNetCore.Authorization;
2+
using Microsoft.AspNetCore.Http;
3+
using Microsoft.AspNetCore.Mvc;
4+
using OrganizationService.Core.ApiModels;
5+
using OrganizationService.Service.ApiModels.Class;
6+
using OrganizationService.Service.Dtos.Class;
7+
using OrganizationService.Service.Implementation;
8+
using OrganizationService.Service.Interfaces;
9+
10+
namespace OrganizationService.Api.Controllers
11+
{
12+
[Route("api/[controller]")]
13+
[ApiController]
14+
public class ClassController : BaseApiController
15+
{
16+
public IClassService _classService { get; set; }
17+
private readonly IConfiguration _configuration;
18+
19+
public ClassController(IServiceProvider serviceProvider, IClassService classService, IConfiguration configuration) : base(serviceProvider)
20+
{
21+
_configuration = configuration;
22+
_classService = classService;
23+
}
24+
25+
[HttpPost("public")]
26+
public async Task<IActionResult> GetViewModelsAsync([FromBody] ClassModel classModel)
27+
{
28+
var result = await _classService.GetViewModelsAsync(classModel);
29+
var listResult = new PaginatedList<ClassDto>(result.ToList(), result.Count(), classModel.PageIndex, classModel.PageSize);
30+
return Success(listResult);
31+
}
32+
33+
//get project by id
34+
[HttpGet("{id}")]
35+
public async Task<IActionResult> GetClassById(Guid id)
36+
{
37+
var result = await _classService.GetByIdAsync(id);
38+
return Success(result);
39+
}
40+
41+
//add project
42+
[HttpPost("add")]
43+
public async Task<IActionResult> AddClass([FromBody] CreateClassRequest addProjectModel)
44+
{
45+
await _classService.CreateAsync(addProjectModel);
46+
return Success();
47+
}
48+
49+
//edit project
50+
[HttpPut("edit/{classId}")]
51+
public async Task<IActionResult> EditDetailClass(Guid classId, [FromBody] UpdateClassRequest editClassModel)
52+
{
53+
var result = await _classService.UpdateAsync(classId, editClassModel);
54+
return Success(result);
55+
}
56+
57+
//delete project
58+
[HttpDelete("{id}")]
59+
public async Task<IActionResult> DeleteClass(Guid id)
60+
{
61+
await _classService.DeleteAsync(id);
62+
return Success();
63+
}
64+
}
65+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using Microsoft.AspNetCore.Http;
2+
using Microsoft.AspNetCore.Mvc;
3+
using OrganizationService.Core.ApiModels;
4+
using OrganizationService.Service.ApiModels.Class;
5+
using OrganizationService.Service.ApiModels.Grade;
6+
using OrganizationService.Service.Dtos.Class;
7+
using OrganizationService.Service.Dtos.Grade;
8+
using OrganizationService.Service.Interfaces;
9+
10+
namespace OrganizationService.Api.Controllers
11+
{
12+
[Route("api/[controller]")]
13+
[ApiController]
14+
public class GradeController : BaseApiController
15+
{
16+
public IGradeService _gradeService { get; set; }
17+
private readonly IConfiguration _configuration;
18+
19+
public GradeController(IServiceProvider serviceProvider, IGradeService gradeService, IConfiguration configuration) : base(serviceProvider)
20+
{
21+
_configuration = configuration;
22+
_gradeService = gradeService;
23+
}
24+
25+
[HttpPost("public")]
26+
public async Task<IActionResult> GetViewModelsAsync([FromBody] GradeModel gradeModel)
27+
{
28+
var result = await _gradeService.GetViewModelsAsync(gradeModel);
29+
var listResult = new PaginatedList<GradeDto>(result.ToList(), result.Count(), gradeModel.PageIndex, gradeModel.PageSize);
30+
return Success(listResult);
31+
}
32+
33+
//get project by id
34+
[HttpGet("{id}")]
35+
public async Task<IActionResult> GetGradeById(Guid id)
36+
{
37+
var result = await _gradeService.GetByIdAsync(id);
38+
return Success(result);
39+
}
40+
41+
//add project
42+
[HttpPost("add")]
43+
public async Task<IActionResult> AddGrade([FromBody] CreateGradeRequest addGradeModel)
44+
{
45+
await _gradeService.CreateAsync(addGradeModel);
46+
return Success();
47+
}
48+
49+
//edit project
50+
[HttpPut("edit/{gradeId}")]
51+
public async Task<IActionResult> EditDetailGrade(Guid gradeId, [FromBody] UpdateGradeRequest editGradeModel)
52+
{
53+
var result = await _gradeService.UpdateAsync(gradeId, editGradeModel);
54+
return Success(result);
55+
}
56+
57+
//delete project
58+
[HttpDelete("{id}")]
59+
public async Task<IActionResult> DeleteGrade(Guid id)
60+
{
61+
var result = await _gradeService.DeleteAsync(id);
62+
return Success(result);
63+
}
64+
}
65+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using Microsoft.AspNetCore.Http;
2+
using Microsoft.AspNetCore.Mvc;
3+
using OrganizationService.Core.ApiModels;
4+
using OrganizationService.Service.ApiModels.Grade;
5+
using OrganizationService.Service.ApiModels.Organization;
6+
using OrganizationService.Service.Dtos.Grade;
7+
using OrganizationService.Service.Dtos.Organization;
8+
using OrganizationService.Service.Implementation;
9+
using OrganizationService.Service.Interfaces;
10+
11+
namespace OrganizationService.Api.Controllers
12+
{
13+
[Route("api/[controller]")]
14+
[ApiController]
15+
public class OrganizationController : BaseApiController
16+
{
17+
public IOrganizationService _organizationService { get; set; }
18+
private readonly IConfiguration _configuration;
19+
20+
public OrganizationController(IServiceProvider serviceProvider, IOrganizationService organizationService, IConfiguration configuration) : base(serviceProvider)
21+
{
22+
_configuration = configuration;
23+
_organizationService = organizationService;
24+
}
25+
26+
[HttpPost("public")]
27+
public async Task<IActionResult> GetViewModelsAsync([FromBody] OrganizationModel orgModel)
28+
{
29+
var result = await _organizationService.GetViewModelsAsync(orgModel);
30+
var listResult = new PaginatedList<OrganizationDto>(result.ToList(), result.Count(), orgModel.PageIndex, orgModel.PageSize);
31+
return Success(listResult);
32+
}
33+
34+
//get project by id
35+
[HttpGet("{id}")]
36+
public async Task<IActionResult> GetOrganizationById(Guid id)
37+
{
38+
var result = await _organizationService.GetByIdAsync(id);
39+
return Success(result);
40+
}
41+
42+
//add project
43+
[HttpPost("add")]
44+
public async Task<IActionResult> AddOrganization([FromBody] CreateOrganizationRequest addOrgModel)
45+
{
46+
await _organizationService.CreateAsync(addOrgModel);
47+
return Success();
48+
}
49+
50+
//edit project
51+
[HttpPut("edit/{orgId}")]
52+
public async Task<IActionResult> EditDetailOrganization(Guid orgId, [FromBody] UpdateOrganizationRequest editOrgModel)
53+
{
54+
var result = await _organizationService.UpdateAsync(orgId, editOrgModel);
55+
return Success(result);
56+
}
57+
58+
//delete project
59+
[HttpDelete("{id}")]
60+
public async Task<IActionResult> DeleteOrganization(Guid id)
61+
{
62+
var result = await _organizationService.DeleteAsync(id);
63+
return Success(result);
64+
}
65+
}
66+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using Microsoft.AspNetCore.Http;
2+
using Microsoft.AspNetCore.Mvc;
3+
using OrganizationService.Core.ApiModels;
4+
using OrganizationService.Service.ApiModels.Class;
5+
using OrganizationService.Service.ApiModels.OrganizationMember;
6+
using OrganizationService.Service.Dtos.Class;
7+
using OrganizationService.Service.Dtos.OrganizationMember;
8+
using OrganizationService.Service.Interfaces;
9+
10+
namespace OrganizationService.Api.Controllers
11+
{
12+
[Route("api/[controller]")]
13+
[ApiController]
14+
public class OrganizationMemberController : BaseApiController
15+
{
16+
public IOrganizationMemberService _orgMemberService { get; set; }
17+
private readonly IConfiguration _configuration;
18+
19+
public OrganizationMemberController(IServiceProvider serviceProvider, IOrganizationMemberService orgMemberService, IConfiguration configuration) : base(serviceProvider)
20+
{
21+
_configuration = configuration;
22+
_orgMemberService = orgMemberService;
23+
}
24+
25+
[HttpPost("public")]
26+
public async Task<IActionResult> GetViewModelsAsync([FromBody] OrganizationMemberModel orgMemberModel)
27+
{
28+
var result = await _orgMemberService.GetViewModelsAsync(orgMemberModel);
29+
var listResult = new PaginatedList<OrganizationMemberDto>(result.ToList(), result.Count(), orgMemberModel.PageIndex, orgMemberModel.PageSize);
30+
return Success(listResult);
31+
}
32+
33+
//get project by id
34+
[HttpGet("{id}")]
35+
public async Task<IActionResult> GetOrganizationMemberById(Guid id)
36+
{
37+
var result = await _orgMemberService.GetByIdAsync(id);
38+
return Success(result);
39+
}
40+
41+
//add project
42+
[HttpPost("add")]
43+
public async Task<IActionResult> AddClass([FromBody] CreateOrganizationMemberRequest addOrgMemberModel)
44+
{
45+
await _orgMemberService.CreateAsync(addOrgMemberModel);
46+
return Success();
47+
}
48+
49+
//edit project
50+
[HttpPut("edit/{classId}")]
51+
public async Task<IActionResult> EditDetailClass(Guid classId, [FromBody] UpdateOrganizationMemberRequest editOrgMemberModel)
52+
{
53+
var result = await _orgMemberService.UpdateAsync(classId, editOrgMemberModel);
54+
return Success(result);
55+
}
56+
57+
//delete project
58+
[HttpDelete("{id}")]
59+
public async Task<IActionResult> DeleteOrganizationMember(Guid id)
60+
{
61+
await _orgMemberService.DeleteAsync(id);
62+
return Success();
63+
}
64+
}
65+
}

OrganizationService/OrganizationService.Api/Middlewares/ExceptionMiddleware.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ private async Task HandleExceptionAsync(HttpContext context, Exception exception
128128
var requestBody = Encoding.UTF8.GetString(buffer);
129129
builder.AppendLine($"Body: {requestBody}");
130130

131-
// context.Request.Body.Position = 0;
132131
}
133132
builder.AppendLine("Outgoing Response:");
134133
builder.AppendLine($"Message: {exception.Message}");
@@ -141,9 +140,23 @@ private async Task HandleExceptionAsync(HttpContext context, Exception exception
141140
context.Response.ContentType = "application/json";
142141
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
143142

143+
var apiResponse = new ApiResponseModel
144+
{
145+
Code = (int)HttpStatusCode.InternalServerError,
146+
Message = "Lỗi hệ thống. Vui lòng thử lại sau.",
147+
Status = "fail",
148+
Result = null
149+
};
144150

145-
await context.Response.WriteAsync("An error occurred. Please contact AmericanBank support.");
146-
await context.Response.WriteAsync(exception.Message + exception.StackTrace);
151+
var jsonResponse = JsonConvert.SerializeObject(apiResponse, new JsonSerializerSettings
152+
{
153+
ContractResolver = new CamelCasePropertyNamesContractResolver()
154+
});
155+
156+
// await context.Response.WriteAsync("An error occurred. Please contact CodeCampus support.");
157+
// await context.Response.WriteAsync(exception.Message + exception.StackTrace);
158+
159+
await context.Response.WriteAsync(jsonResponse);
147160
}
148161

149162
private async Task LogRequest(HttpContext context)

OrganizationService/OrganizationService.Api/OrganizationService.Api.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10+
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
1011
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.6" />
1112
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.6" />
1213
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.6" />

OrganizationService/OrganizationService.Api/Program.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
using OrganizationService.DataAccess.DbContexts;
1111
using OrganizationService.DataAccess.Implementation;
1212
using OrganizationService.DataAccess.Interfaces;
13+
using OrganizationService.Service.Implementation;
14+
using OrganizationService.Service.Interfaces;
1315
using System.Data;
1416
using System.Text;
1517
using System.Text.Json.Serialization;
@@ -36,7 +38,11 @@
3638
builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
3739
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
3840
builder.Services.AddScoped<UserContext>();
39-
41+
builder.Services.AddScoped<IStudentCredentialService, StudentCredentialService>();
42+
builder.Services.AddScoped<IClassService, ClassService>();
43+
builder.Services.AddScoped<IGradeService, GradeService>();
44+
builder.Services.AddScoped<IOrganizationService, OrganizationService.Service.Implementation.OrganizationService>();
45+
builder.Services.AddScoped<IOrganizationMemberService, OrganizationMemberService>();
4046

4147

4248
builder.Services.Configure<IdentityOptions>(options =>

OrganizationService/OrganizationService.Core/ApiModels/PagingBaseModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class PagingBaseModel
1111
{
1212
[DefaultValue(1)]
1313
public int PageIndex { get; set; }
14-
[DefaultValue(20)]
14+
[DefaultValue(30)]
1515
public int PageSize { get; set; }
1616
}
1717
}

OrganizationService/OrganizationService.Core/OrganizationService.Core.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10+
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
1011
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.6" />
1112
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.6" />
1213
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.6">

OrganizationService/OrganizationService.DataAccess/Implementation/Repository.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,6 @@ public async Task<IEnumerable<object>> GetDistinctColumnAsync(string columnName)
112112
};
113113
return result.Distinct();
114114
}
115-
116-
117-
118115
public async Task<IEnumerable<T>> GetListAsync()
119116
{
120117
return await ActiveRecords.ToListAsync();
@@ -133,6 +130,7 @@ public async Task<T> FindAsync(Expression<Func<T, bool>> predicate)
133130
public async Task InsertAsync(T obj)
134131
{
135132
obj.CreatedBy = _userContext.UserId;
133+
obj.CreatedAt = DateTime.UtcNow;
136134

137135
await _dbContext.Set<T>().AddAsync(obj);
138136
}
@@ -158,13 +156,28 @@ public void UpdateMany(IEnumerable<T> objs)
158156

159157
public void Delete(T obj)
160158
{
161-
obj.UpdatedAt = DateTime.UtcNow;
162-
obj.UpdatedBy = _userContext.UserId;
159+
obj.DeletedAt = DateTime.UtcNow;
160+
obj.DeletedBy = _userContext.UserId;
163161
obj.IsDeleted = true;
164162

165163
_dbContext.Set<T>().Update(obj);
166164
}
167165

166+
public async Task DeleteAsync(Guid id)
167+
{
168+
var entity = await _dbContext.Set<T>()
169+
.FirstOrDefaultAsync(x => x.Id == id && !x.IsDeleted);
170+
171+
if (entity == null)
172+
throw new KeyNotFoundException("Không tìm thấy bản ghi hoặc đã bị xóa.");
173+
174+
entity.DeletedAt = DateTime.UtcNow;
175+
entity.DeletedBy = _userContext.UserId;
176+
entity.IsDeleted = true;
177+
178+
await _dbContext.SaveChangesAsync();
179+
}
180+
168181
public async Task<T> DeleteByIdAsync(Guid id)
169182
{
170183
var obj = await FindByIdAsync(id);

0 commit comments

Comments
 (0)