diff --git a/PostmanTestRequest/StudentOperations.postman_collection.json b/PostmanTestRequest/StudentOperations.postman_collection.json index e1829fa..3b2f977 100644 --- a/PostmanTestRequest/StudentOperations.postman_collection.json +++ b/PostmanTestRequest/StudentOperations.postman_collection.json @@ -91,14 +91,14 @@ "response": [] }, { - "name": "GetEditionManagementList", + "name": "GetCourseList", "request": { "auth": { "type": "bearer", "bearer": [ { "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA0ODI3ODgzLCJleHAiOjE2MDQ5MTQyODMsImlhdCI6MTYwNDgyNzg4M30.a3mMm3Zk3xpfsmIwlqtpjgWgTNEXv8O4hH_V_L9UFZo", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA2NTk2MzI5LCJleHAiOjE2MDY2ODI3MjksImlhdCI6MTYwNjU5NjMyOX0.O-dLJNI3-tNj96xOpz8LE7zrysmJkN069A3Zku2A7S0", "type": "string" } ] @@ -117,14 +117,267 @@ } ], "url": { - "raw": "http://localhost:8080/editionManagement", + "raw": "http://localhost:8080/management/course", "protocol": "http", "host": [ "localhost" ], "port": "8080", "path": [ - "editionManagement" + "management", + "course" + ] + } + }, + "response": [] + }, + { + "name": "GetCourse", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA2NTk2MzI5LCJleHAiOjE2MDY2ODI3MjksImlhdCI6MTYwNjU5NjMyOX0.O-dLJNI3-tNj96xOpz8LE7zrysmJkN069A3Zku2A7S0", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Authorization", + "type": "text", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjAxMTk3NTYzLCJleHAiOjE2MDEyODM5NjMsImlhdCI6MTYwMTE5NzU2MywiRWRpdGlvbiI6IjEzOGRhOGEzLTg1NWMtNGIxNy05YmQyLTVmMzU3Njc5ZWZhOSJ9.l7QK1eUIJexnDaFKZ9yx3NWxmB2KrvPpjLUuuP1EJyE" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "url": { + "raw": "http://localhost:8080/management/course/1", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "management", + "course", + "1" + ] + } + }, + "response": [] + }, + { + "name": "CreateCourse", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA2NTk2MzI5LCJleHAiOjE2MDY2ODI3MjksImlhdCI6MTYwNjU5NjMyOX0.O-dLJNI3-tNj96xOpz8LE7zrysmJkN069A3Zku2A7S0", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": null,\r\n \"name\": \"testowy\",\r\n \"nameEng\": \"test\"\r\n}" + }, + "url": { + "raw": "http://localhost:8080/management/course", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "management", + "course" + ] + } + }, + "response": [] + }, + { + "name": "UpdateCourse", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA2NTk2MzI5LCJleHAiOjE2MDY2ODI3MjksImlhdCI6MTYwNjU5NjMyOX0.O-dLJNI3-tNj96xOpz8LE7zrysmJkN069A3Zku2A7S0", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [ + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\r\n \"id\": 3,\r\n \"name\": \"testowyUp\",\r\n \"nameEng\": \"testUp\"\r\n}" + }, + "url": { + "raw": "http://localhost:8080/management/course", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "management", + "course" + ] + } + }, + "response": [] + }, + { + "name": "DeleteCourse", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA2NTk2MzI5LCJleHAiOjE2MDY2ODI3MjksImlhdCI6MTYwNjU5NjMyOX0.O-dLJNI3-tNj96xOpz8LE7zrysmJkN069A3Zku2A7S0", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [ + { + "key": "Authorization", + "type": "text", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjAxMTk3NTYzLCJleHAiOjE2MDEyODM5NjMsImlhdCI6MTYwMTE5NzU2MywiRWRpdGlvbiI6IjEzOGRhOGEzLTg1NWMtNGIxNy05YmQyLTVmMzU3Njc5ZWZhOSJ9.l7QK1eUIJexnDaFKZ9yx3NWxmB2KrvPpjLUuuP1EJyE" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "url": { + "raw": "http://localhost:8080/management/course/3", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "management", + "course", + "3" + ] + } + }, + "response": [] + }, + { + "name": "GetEditionManagementListByCourse", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA2NTk2MzI5LCJleHAiOjE2MDY2ODI3MjksImlhdCI6MTYwNjU5NjMyOX0.O-dLJNI3-tNj96xOpz8LE7zrysmJkN069A3Zku2A7S0", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Authorization", + "type": "text", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjAxMTk3NTYzLCJleHAiOjE2MDEyODM5NjMsImlhdCI6MTYwMTE5NzU2MywiRWRpdGlvbiI6IjEzOGRhOGEzLTg1NWMtNGIxNy05YmQyLTVmMzU3Njc5ZWZhOSJ9.l7QK1eUIJexnDaFKZ9yx3NWxmB2KrvPpjLUuuP1EJyE" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "url": { + "raw": "http://localhost:8080/management/editions?course=1", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "management", + "editions" + ], + "query": [ + { + "key": "course", + "value": "1" + } + ] + } + }, + "response": [] + }, + { + "name": "GetEditionManagementList", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA2NTk2MzI5LCJleHAiOjE2MDY2ODI3MjksImlhdCI6MTYwNjU5NjMyOX0.O-dLJNI3-tNj96xOpz8LE7zrysmJkN069A3Zku2A7S0", + "type": "string" + } + ] + }, + "method": "GET", + "header": [ + { + "key": "Authorization", + "type": "text", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjAxMTk3NTYzLCJleHAiOjE2MDEyODM5NjMsImlhdCI6MTYwMTE5NzU2MywiRWRpdGlvbiI6IjEzOGRhOGEzLTg1NWMtNGIxNy05YmQyLTVmMzU3Njc5ZWZhOSJ9.l7QK1eUIJexnDaFKZ9yx3NWxmB2KrvPpjLUuuP1EJyE" + }, + { + "key": "Content-Type", + "type": "text", + "value": "application/json" + } + ], + "url": { + "raw": "http://localhost:8080/management/editions", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "management", + "editions" ] } }, @@ -157,15 +410,16 @@ } ], "url": { - "raw": "http://localhost:8080/editionManagement/bbc401c3-2d99-4142-bbb7-24c345d1fb21", + "raw": "http://localhost:8080/management/editions/138da8a3-855c-4b17-9bd2-5f357679efa9", "protocol": "http", "host": [ "localhost" ], "port": "8080", "path": [ - "editionManagement", - "bbc401c3-2d99-4142-bbb7-24c345d1fb21" + "management", + "editions", + "138da8a3-855c-4b17-9bd2-5f357679efa9" ] } }, @@ -179,7 +433,7 @@ "bearer": [ { "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA0ODMzMjY1LCJleHAiOjE2MDQ5MTk2NjUsImlhdCI6MTYwNDgzMzI2NX0.bGjMLDkCZ6zSBVUxC3WtYgyo-af16aJEGXKAUg_6p5Y", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA2NTk2MzI5LCJleHAiOjE2MDY2ODI3MjksImlhdCI6MTYwNjU5NjMyOX0.O-dLJNI3-tNj96xOpz8LE7zrysmJkN069A3Zku2A7S0", "type": "string" } ] @@ -194,17 +448,18 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"editionStart\": \"2020-11-15T11:02:04.002Z\",\r\n \"editionFinish\": \"2020-11-25T11:02:04.002Z\",\r\n \"reportingStart\": \"2020-11-20T11:02:04.002Z\",\r\n \"course\": {\r\n \"name\": \"Informatyka\"\r\n },\r\n \"availableSubjectsIds\": [2],\r\n \"availableInternshipTypesIds\": [8]\r\n}" + "raw": "{\r\n \"editionStart\": \"2020-11-15T11:02:04.002Z\",\r\n \"editionFinish\": \"2020-11-25T11:02:04.002Z\",\r\n \"reportingStart\": \"2020-11-20T11:02:04.002Z\",\r\n \"course\": {\r\n \"id\": 1,\r\n \"name\": \"Informatyka\",\r\n \"nameEng\": \"Informatics\"\r\n },\r\n \"availableSubjectsIds\": [2],\r\n \"availableInternshipTypesIds\": [8]\r\n}" }, "url": { - "raw": "http://localhost:8080/editionManagement", + "raw": "http://localhost:8080/management/edition", "protocol": "http", "host": [ "localhost" ], "port": "8080", "path": [ - "editionManagement" + "management", + "edition" ] } }, @@ -218,7 +473,7 @@ "bearer": [ { "key": "token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA0ODMzMjY1LCJleHAiOjE2MDQ5MTk2NjUsImlhdCI6MTYwNDgzMzI2NX0.bGjMLDkCZ6zSBVUxC3WtYgyo-af16aJEGXKAUg_6p5Y", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA2NTk2MzI5LCJleHAiOjE2MDY2ODI3MjksImlhdCI6MTYwNjU5NjMyOX0.O-dLJNI3-tNj96xOpz8LE7zrysmJkN069A3Zku2A7S0", "type": "string" } ] @@ -233,17 +488,18 @@ ], "body": { "mode": "raw", - "raw": "{\r\n \"id\": \"138da8a3-855c-4b17-9bd2-5f357679efa9\",\r\n \"editionStart\": \"2020-11-15T11:02:04.002Z\",\r\n \"editionFinish\": \"2020-11-20T11:02:04.002Z\",\r\n \"reportingStart\": \"2020-11-17T11:02:04.002Z\",\r\n \"course\": {\r\n \"name\": \"Informatyka\"\r\n },\r\n \"availableSubjectsIds\": [3],\r\n \"availableInternshipTypesIds\": [3]\r\n}" + "raw": "{\r\n \"id\": \"138da8a3-855c-4b17-9bd2-5f357679efa9\",\r\n \"editionStart\": \"2020-11-15T11:02:04.002Z\",\r\n \"editionFinish\": \"2020-11-20T11:02:04.002Z\",\r\n \"reportingStart\": \"2020-11-17T11:02:04.002Z\",\r\n \"course\": {\r\n \"id\": 2,\r\n \"name\": \"Inżynieria Biomedyczna\",\r\n \"nameEng\": \"Biomedical Engineering\"\r\n },\r\n \"availableSubjectsIds\": [3],\r\n \"availableInternshipTypesIds\": [3]\r\n}" }, "url": { - "raw": "http://localhost:8080/editionManagement", + "raw": "http://localhost:8080/management/editions", "protocol": "http", "host": [ "localhost" ], "port": "8080", "path": [ - "editionManagement" + "management", + "editions" ] } }, @@ -276,15 +532,16 @@ } ], "url": { - "raw": "http://localhost:8080/editionManagement/bbc401c3-2d99-4142-bbb7-24c345d1fb21", + "raw": "http://localhost:8080/management/editions/be1a4439-0360-477c-85c5-e28bc8542883", "protocol": "http", "host": [ "localhost" ], "port": "8080", "path": [ - "editionManagement", - "bbc401c3-2d99-4142-bbb7-24c345d1fb21" + "management", + "editions", + "be1a4439-0360-477c-85c5-e28bc8542883" ] } }, diff --git a/src/InternshipSystem.Api/Controllers/CourseController.cs b/src/InternshipSystem.Api/Controllers/CourseController.cs index 7707015..f1dbbc2 100644 --- a/src/InternshipSystem.Api/Controllers/CourseController.cs +++ b/src/InternshipSystem.Api/Controllers/CourseController.cs @@ -1,11 +1,16 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; +using InternshipSystem.Api.Queries; using InternshipSystem.Api.Security; +using InternshipSystem.Core; +using InternshipSystem.Core.Entity; using InternshipSystem.Repository; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; namespace InternshipSystem.Api.Controllers { @@ -21,31 +26,102 @@ namespace InternshipSystem.Api.Controllers } [HttpGet] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Policy = Policies.IsOverseer)] - public async Task>> GetCourses(CancellationToken cancellationToken) => - throw new NotImplementedException(); - + public async Task>> GetCourses(CancellationToken cancellationToken) => + await Context.Courses + .ToListAsync(cancellationToken); + [HttpGet("{courseId}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Policy = Policies.IsOverseer)] - public async Task> GetCourse(long courseId, CancellationToken cancellationToken) => - throw new NotImplementedException(); + public async Task> GetCourse(long courseId, CancellationToken cancellationToken) + { + var course = await Context.Courses + .Where(c => c.Id == courseId) + .FirstOrDefaultAsync(cancellationToken); + + if (course == null) + { + return NotFound(); + } + + return Ok(course); + } [HttpPut] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Policy = Policies.IsOverseer)] - public async Task UpsertCompany([FromBody] CourseForm courseForm, CancellationToken cancellationToken) => - throw new NotImplementedException(); - + public async Task UpsertCourse([FromBody] CourseForm courseForm, CancellationToken cancellationToken) + { + var validator = new CourseForm.Validator(); + var validationResult = await validator.ValidateAsync(courseForm, cancellationToken); + + if (!validationResult.IsValid) + { + return BadRequest(validationResult.ToString()); + } + + if (courseForm.Id.HasValue) + { + var course = await Context.Courses.FindAsync(courseForm.Id.Value); + + if (course == null) + { + return NotFound(); + } + + course.UpdateCourse(courseForm.Name, courseForm.NameEng); + } + else + { + var newCourse = Course.CreateCourse(courseForm.Name, courseForm.NameEng); + + await Context.Courses.AddAsync(newCourse, cancellationToken); + } + + await Context.SaveChangesAsync(cancellationToken); + return Ok(); + } + [HttpDelete("{courseId}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status409Conflict)] [Authorize(Policy = Policies.IsOverseer)] - public async Task DeleteCompany(long courseId, CancellationToken cancellationToken) => - throw new NotImplementedException(); - } + public async Task DeleteCourse(long courseId, CancellationToken cancellationToken) + { + var courseToDelete = await Context.Courses + .Where(c => c.Id == courseId) + .FirstOrDefaultAsync(cancellationToken); - public class CourseForm - { - } + if (courseToDelete == null) + { + return NotFound(); + } - public class CourseResult - { + var referencedEditions = + await Context.Editions + .Include(e => e.Course) + .Where(e => e.Course.Id == courseToDelete.Id) + .CountAsync(cancellationToken); + + if (referencedEditions > 0) + { + return Conflict(); + } + + Context.Courses.Remove(courseToDelete); + await Context.SaveChangesAsync(cancellationToken); + return Ok(); + } } } \ No newline at end of file diff --git a/src/InternshipSystem.Api/Controllers/EditionManagementController.cs b/src/InternshipSystem.Api/Controllers/EditionManagementController.cs index 245f3d8..973eef6 100644 --- a/src/InternshipSystem.Api/Controllers/EditionManagementController.cs +++ b/src/InternshipSystem.Api/Controllers/EditionManagementController.cs @@ -72,7 +72,6 @@ namespace InternshipSystem.Api.Controllers [HttpPut] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Policy = Policies.IsOverseer)] @@ -85,9 +84,6 @@ namespace InternshipSystem.Api.Controllers { return BadRequest(validationResult.ToString()); } - - //TODO: resolve courses (one for each edition or dictionary) - editionForm.Course.Id = 0; if (editionForm.Id.HasValue) { diff --git a/src/InternshipSystem.Api/Queries/CourseForm.cs b/src/InternshipSystem.Api/Queries/CourseForm.cs new file mode 100644 index 0000000..134e909 --- /dev/null +++ b/src/InternshipSystem.Api/Queries/CourseForm.cs @@ -0,0 +1,23 @@ +using FluentValidation; + +namespace InternshipSystem.Api.Queries +{ + public class CourseForm + { + public long? Id { get; set; } + public string Name { get; set; } + public string NameEng { get; set; } + + public class Validator : AbstractValidator + { + public Validator() + { + RuleFor(c => c.Id).NotNull() + .When(c => string.IsNullOrWhiteSpace(c.Name)); + + RuleFor(c => c.Name).NotEmpty() + .When(c => !c.Id.HasValue); + } + } + } +} \ No newline at end of file diff --git a/src/InternshipSystem.Api/Queries/EditionForm.cs b/src/InternshipSystem.Api/Queries/EditionForm.cs index 6c30d3e..b95ecda 100644 --- a/src/InternshipSystem.Api/Queries/EditionForm.cs +++ b/src/InternshipSystem.Api/Queries/EditionForm.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using FluentValidation; using InternshipSystem.Core; +using InternshipSystem.Core.Entity; using InternshipSystem.Core.Entity.Internship; namespace InternshipSystem.Api.Queries diff --git a/src/InternshipSystem.Api/Result/EditionConfigurationResult.cs b/src/InternshipSystem.Api/Result/EditionConfigurationResult.cs index 7472297..62fc5fa 100644 --- a/src/InternshipSystem.Api/Result/EditionConfigurationResult.cs +++ b/src/InternshipSystem.Api/Result/EditionConfigurationResult.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using InternshipSystem.Core; +using InternshipSystem.Core.Entity; using InternshipSystem.Core.Entity.Internship; using InternshipSystem.Core.UglyOrmArtifacts; diff --git a/src/InternshipSystem.Api/Result/EditionDetailsResult.cs b/src/InternshipSystem.Api/Result/EditionDetailsResult.cs index 19754bd..44b8459 100644 --- a/src/InternshipSystem.Api/Result/EditionDetailsResult.cs +++ b/src/InternshipSystem.Api/Result/EditionDetailsResult.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using InternshipSystem.Core; +using InternshipSystem.Core.Entity; using InternshipSystem.Core.Entity.Internship; namespace InternshipSystem.Api.Result diff --git a/src/InternshipSystem.Api/Result/EditionManagementResult.cs b/src/InternshipSystem.Api/Result/EditionManagementResult.cs index 2e86aa3..c2283b7 100644 --- a/src/InternshipSystem.Api/Result/EditionManagementResult.cs +++ b/src/InternshipSystem.Api/Result/EditionManagementResult.cs @@ -1,5 +1,6 @@ using System; using InternshipSystem.Core; +using InternshipSystem.Core.Entity; namespace InternshipSystem.Api.Result { diff --git a/src/InternshipSystem.Core/Entity/Course.cs b/src/InternshipSystem.Core/Entity/Course.cs index 9bce090..f5899d7 100644 --- a/src/InternshipSystem.Core/Entity/Course.cs +++ b/src/InternshipSystem.Core/Entity/Course.cs @@ -1,9 +1,24 @@ -namespace InternshipSystem.Core +using System.Collections.Generic; + +namespace InternshipSystem.Core.Entity { public class Course { public long Id { get; set; } public string Name { get; set; } public string NameEng { get; set; } + + public static Course CreateCourse(string name, string nameEng) => + new Course + { + Name = name, + NameEng = nameEng, + }; + + public void UpdateCourse(string name, string nameEng) + { + Name = name; + NameEng = nameEng; + } } } \ No newline at end of file diff --git a/src/InternshipSystem.Core/Entity/Edition.cs b/src/InternshipSystem.Core/Entity/Edition.cs index 567693f..dd00699 100644 --- a/src/InternshipSystem.Core/Entity/Edition.cs +++ b/src/InternshipSystem.Core/Entity/Edition.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using InternshipSystem.Core.Entity; using InternshipSystem.Core.Entity.Internship; using InternshipSystem.Core.UglyOrmArtifacts; diff --git a/src/InternshipSystem.Repository/DatabaseFiller.cs b/src/InternshipSystem.Repository/DatabaseFiller.cs index 9fda8f7..4edcdcd 100644 --- a/src/InternshipSystem.Repository/DatabaseFiller.cs +++ b/src/InternshipSystem.Repository/DatabaseFiller.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using InternshipSystem.Core; +using InternshipSystem.Core.Entity; using InternshipSystem.Core.Entity.Internship; using InternshipSystem.Core.UglyOrmArtifacts; using Microsoft.EntityFrameworkCore; @@ -203,6 +204,7 @@ namespace InternshipSystem.Repository Course = new Course { Name = "Informatyka", + NameEng = "Informatics", }, AvailableInternshipTypes = new List { @@ -261,6 +263,7 @@ namespace InternshipSystem.Repository Course = new Course { Name = "Inżynieria Biomedyczna", + NameEng = "Biomedical Engineering", }, AvailableInternshipTypes = new List { diff --git a/src/InternshipSystem.Repository/InternshipDbContext.cs b/src/InternshipSystem.Repository/InternshipDbContext.cs index f12709f..117f5ea 100644 --- a/src/InternshipSystem.Repository/InternshipDbContext.cs +++ b/src/InternshipSystem.Repository/InternshipDbContext.cs @@ -1,5 +1,6 @@ using Microsoft.EntityFrameworkCore; using InternshipSystem.Core; +using InternshipSystem.Core.Entity; using InternshipSystem.Core.Entity.Internship; using InternshipSystem.Core.UglyOrmArtifacts; diff --git a/src/InternshipSystem.Repository/InternshipSystem.Repository.csproj b/src/InternshipSystem.Repository/InternshipSystem.Repository.csproj index ac1ea48..45f6950 100644 --- a/src/InternshipSystem.Repository/InternshipSystem.Repository.csproj +++ b/src/InternshipSystem.Repository/InternshipSystem.Repository.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/src/InternshipSystem.Repository/Migrations/20201025211622_Init.Designer.cs b/src/InternshipSystem.Repository/Migrations/20201128203805_init.Designer.cs similarity index 98% rename from src/InternshipSystem.Repository/Migrations/20201025211622_Init.Designer.cs rename to src/InternshipSystem.Repository/Migrations/20201128203805_init.Designer.cs index eb8a31a..0f461fa 100644 --- a/src/InternshipSystem.Repository/Migrations/20201025211622_Init.Designer.cs +++ b/src/InternshipSystem.Repository/Migrations/20201128203805_init.Designer.cs @@ -10,8 +10,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace InternshipSystem.Repository.Migrations { [DbContext(typeof(InternshipDbContext))] - [Migration("20201025211622_Init")] - partial class Init + [Migration("20201128203805_init")] + partial class init { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -72,24 +72,6 @@ namespace InternshipSystem.Repository.Migrations b.ToTable("companies"); }); - modelBuilder.Entity("InternshipSystem.Core.Course", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnName("name") - .HasColumnType("text"); - - b.HasKey("Id") - .HasName("pk_course"); - - b.ToTable("course"); - }); - modelBuilder.Entity("InternshipSystem.Core.Document", b => { b.Property("Id") @@ -187,6 +169,28 @@ namespace InternshipSystem.Repository.Migrations b.ToTable("editions"); }); + modelBuilder.Entity("InternshipSystem.Core.Entity.Course", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnName("name") + .HasColumnType("text"); + + b.Property("NameEng") + .HasColumnName("name_eng") + .HasColumnType("text"); + + b.HasKey("Id") + .HasName("pk_courses"); + + b.ToTable("courses"); + }); + modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.Internship", b => { b.Property("Id") @@ -557,10 +561,10 @@ namespace InternshipSystem.Repository.Migrations modelBuilder.Entity("InternshipSystem.Core.Edition", b => { - b.HasOne("InternshipSystem.Core.Course", "Course") + b.HasOne("InternshipSystem.Core.Entity.Course", "Course") .WithMany() .HasForeignKey("CourseId") - .HasConstraintName("fk_editions_course_course_id"); + .HasConstraintName("fk_editions_courses_course_id"); }); modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.Internship", b => diff --git a/src/InternshipSystem.Repository/Migrations/20201025211622_Init.cs b/src/InternshipSystem.Repository/Migrations/20201128203805_init.cs similarity index 98% rename from src/InternshipSystem.Repository/Migrations/20201025211622_Init.cs rename to src/InternshipSystem.Repository/Migrations/20201128203805_init.cs index 95ef74e..ac30931 100644 --- a/src/InternshipSystem.Repository/Migrations/20201025211622_Init.cs +++ b/src/InternshipSystem.Repository/Migrations/20201128203805_init.cs @@ -4,7 +4,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace InternshipSystem.Repository.Migrations { - public partial class Init : Migration + public partial class init : Migration { protected override void Up(MigrationBuilder migrationBuilder) { @@ -24,16 +24,17 @@ namespace InternshipSystem.Repository.Migrations }); migrationBuilder.CreateTable( - name: "course", + name: "courses", columns: table => new { id = table.Column(nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - name = table.Column(nullable: true) + name = table.Column(nullable: true), + name_eng = table.Column(nullable: true) }, constraints: table => { - table.PrimaryKey("pk_course", x => x.id); + table.PrimaryKey("pk_courses", x => x.id); }); migrationBuilder.CreateTable( @@ -155,9 +156,9 @@ namespace InternshipSystem.Repository.Migrations { table.PrimaryKey("pk_editions", x => x.id); table.ForeignKey( - name: "fk_editions_course_course_id", + name: "fk_editions_courses_course_id", column: x => x.course_id, - principalTable: "course", + principalTable: "courses", principalColumn: "id", onDelete: ReferentialAction.Restrict); }); @@ -465,7 +466,7 @@ namespace InternshipSystem.Repository.Migrations name: "students"); migrationBuilder.DropTable( - name: "course"); + name: "courses"); migrationBuilder.DropTable( name: "branch_office"); diff --git a/src/InternshipSystem.Repository/Migrations/InternshipDbContextModelSnapshot.cs b/src/InternshipSystem.Repository/Migrations/InternshipDbContextModelSnapshot.cs deleted file mode 100644 index aff7d9a..0000000 --- a/src/InternshipSystem.Repository/Migrations/InternshipDbContextModelSnapshot.cs +++ /dev/null @@ -1,692 +0,0 @@ -// -using System; -using InternshipSystem.Repository; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace InternshipSystem.Repository.Migrations -{ - [DbContext(typeof(InternshipDbContext))] - partial class InternshipDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) - .HasAnnotation("ProductVersion", "3.1.4") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - modelBuilder.Entity("InternshipSystem.Core.BranchOffice", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("CompanyId") - .HasColumnName("company_id") - .HasColumnType("bigint"); - - b.Property("Provider") - .HasColumnName("provider") - .HasColumnType("bigint"); - - b.HasKey("Id") - .HasName("pk_branch_office"); - - b.HasIndex("CompanyId") - .HasName("ix_branch_office_company_id"); - - b.ToTable("branch_office"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Company", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnName("name") - .HasColumnType("text"); - - b.Property("Nip") - .HasColumnName("nip") - .HasColumnType("text"); - - b.Property("Provider") - .HasColumnName("provider") - .HasColumnType("bigint"); - - b.HasKey("Id") - .HasName("pk_companies"); - - b.ToTable("companies"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Course", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnName("name") - .HasColumnType("text"); - - b.HasKey("Id") - .HasName("pk_course"); - - b.ToTable("course"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Document", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Description") - .HasColumnName("description") - .HasColumnType("text"); - - b.Property("InternshipId") - .HasColumnName("internship_id") - .HasColumnType("bigint"); - - b.Property("RejectionReason") - .HasColumnName("rejection_reason") - .HasColumnType("text"); - - b.Property("State") - .HasColumnName("state") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnName("type") - .HasColumnType("integer"); - - b.HasKey("Id") - .HasName("pk_document"); - - b.HasIndex("InternshipId") - .HasName("ix_document_internship_id"); - - b.ToTable("document"); - }); - - modelBuilder.Entity("InternshipSystem.Core.DocumentScan", b => - { - b.Property("DocumentId") - .HasColumnName("document_id") - .HasColumnType("bigint"); - - b.Property("File") - .HasColumnName("file") - .HasColumnType("bytea"); - - b.Property("Filename") - .HasColumnName("filename") - .HasColumnType("text"); - - b.Property("Mime") - .HasColumnName("mime") - .HasColumnType("text"); - - b.Property("Size") - .HasColumnName("size") - .HasColumnType("bigint"); - - b.HasKey("DocumentId") - .HasName("pk_document_scan"); - - b.ToTable("document_scan"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Edition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("uuid"); - - b.Property("CourseId") - .HasColumnName("course_id") - .HasColumnType("bigint"); - - b.Property("EditionFinish") - .HasColumnName("edition_finish") - .HasColumnType("timestamp without time zone"); - - b.Property("EditionStart") - .HasColumnName("edition_start") - .HasColumnType("timestamp without time zone"); - - b.Property("ReportingStart") - .HasColumnName("reporting_start") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id") - .HasName("pk_editions"); - - b.HasIndex("CourseId") - .HasName("ix_editions_course_id"); - - b.ToTable("editions"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.Internship", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("EditionId") - .HasColumnName("edition_id") - .HasColumnType("uuid"); - - b.Property("Grade") - .HasColumnName("grade") - .HasColumnType("real"); - - b.Property("InternshipRegistrationId") - .HasColumnName("internship_registration_id") - .HasColumnType("bigint"); - - b.Property("ReportId") - .HasColumnName("report_id") - .HasColumnType("bigint"); - - b.Property("StudentId") - .HasColumnName("student_id") - .HasColumnType("bigint"); - - b.HasKey("Id") - .HasName("pk_internship"); - - b.HasIndex("EditionId") - .HasName("ix_internship_edition_id"); - - b.HasIndex("InternshipRegistrationId") - .HasName("ix_internship_internship_registration_id"); - - b.HasIndex("ReportId") - .HasName("ix_internship_report_id"); - - b.HasIndex("StudentId") - .HasName("ix_internship_student_id"); - - b.ToTable("internship"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.InternshipRegistration", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("BranchAddressId") - .HasColumnName("branch_address_id") - .HasColumnType("bigint"); - - b.Property("CompanyId") - .HasColumnName("company_id") - .HasColumnType("bigint"); - - b.Property("DeclaredHours") - .HasColumnName("declared_hours") - .HasColumnType("integer"); - - b.Property("End") - .HasColumnName("end") - .HasColumnType("timestamp without time zone"); - - b.Property("Start") - .HasColumnName("start") - .HasColumnType("timestamp without time zone"); - - b.Property("State") - .HasColumnName("state") - .HasColumnType("integer"); - - b.Property("TypeId") - .HasColumnName("type_id") - .HasColumnType("bigint"); - - b.HasKey("Id") - .HasName("pk_internship_registration"); - - b.HasIndex("BranchAddressId") - .HasName("ix_internship_registration_branch_address_id"); - - b.HasIndex("CompanyId") - .HasName("ix_internship_registration_company_id"); - - b.HasIndex("TypeId") - .HasName("ix_internship_registration_type_id"); - - b.ToTable("internship_registration"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.InternshipSubject", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Description") - .HasColumnName("description") - .HasColumnType("text"); - - b.Property("DescriptionEng") - .HasColumnName("description_eng") - .HasColumnType("text"); - - b.HasKey("Id") - .HasName("pk_internship_subject"); - - b.ToTable("internship_subject"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.InternshipType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Description") - .HasColumnName("description") - .HasColumnType("text"); - - b.Property("DescriptionEng") - .HasColumnName("description_eng") - .HasColumnType("text"); - - b.Property("Label") - .HasColumnName("label") - .HasColumnType("text"); - - b.Property("LabelEng") - .HasColumnName("label_eng") - .HasColumnType("text"); - - b.HasKey("Id") - .HasName("pk_internship_types"); - - b.ToTable("internship_types"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Report", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Range") - .HasColumnName("range") - .HasColumnType("integer"); - - b.Property("SiteAddress") - .HasColumnName("site_address") - .HasColumnType("text"); - - b.Property("State") - .HasColumnName("state") - .HasColumnType("integer"); - - b.HasKey("Id") - .HasName("pk_report"); - - b.ToTable("report"); - }); - - modelBuilder.Entity("InternshipSystem.Core.StaticPage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("AccessName") - .HasColumnName("access_name") - .HasColumnType("text"); - - b.Property("Content") - .HasColumnName("content") - .HasColumnType("text"); - - b.Property("ContentEng") - .HasColumnName("content_eng") - .HasColumnType("text"); - - b.Property("Title") - .HasColumnName("title") - .HasColumnType("text"); - - b.Property("TitleEng") - .HasColumnName("title_eng") - .HasColumnType("text"); - - b.HasKey("Id") - .HasName("pk_static_pages"); - - b.ToTable("static_pages"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Student", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("AlbumNumber") - .HasColumnName("album_number") - .HasColumnType("integer"); - - b.Property("Course") - .HasColumnName("course") - .HasColumnType("text"); - - b.Property("Email") - .HasColumnName("email") - .HasColumnType("text"); - - b.Property("FirstName") - .HasColumnName("first_name") - .HasColumnType("text"); - - b.Property("LastName") - .HasColumnName("last_name") - .HasColumnType("text"); - - b.Property("Semester") - .HasColumnName("semester") - .HasColumnType("integer"); - - b.HasKey("Id") - .HasName("pk_students"); - - b.ToTable("students"); - }); - - modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.EditionInternshipType", b => - { - b.Property("EditionId") - .HasColumnName("edition_id") - .HasColumnType("uuid"); - - b.Property("InternshipTypeId") - .HasColumnName("internship_type_id") - .HasColumnType("bigint"); - - b.HasKey("EditionId", "InternshipTypeId") - .HasName("pk_edition_internship_type"); - - b.HasIndex("InternshipTypeId") - .HasName("ix_edition_internship_type_internship_type_id"); - - b.ToTable("edition_internship_type"); - }); - - modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.EditionSubject", b => - { - b.Property("EditionId") - .HasColumnName("edition_id") - .HasColumnType("uuid"); - - b.Property("InternshipSubjectId") - .HasColumnName("internship_subject_id") - .HasColumnType("bigint"); - - b.HasKey("EditionId", "InternshipSubjectId") - .HasName("pk_edition_subject"); - - b.HasIndex("InternshipSubjectId") - .HasName("ix_edition_subject_internship_subject_id"); - - b.ToTable("edition_subject"); - }); - - modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.ProgramSubject", b => - { - b.Property("InternshipRegistrationId") - .HasColumnName("internship_registration_id") - .HasColumnType("bigint"); - - b.Property("InternshipSubjectId") - .HasColumnName("internship_subject_id") - .HasColumnType("bigint"); - - b.HasKey("InternshipRegistrationId", "InternshipSubjectId") - .HasName("pk_program_subject"); - - b.HasIndex("InternshipSubjectId") - .HasName("ix_program_subject_internship_subject_id"); - - b.ToTable("program_subject"); - }); - - modelBuilder.Entity("InternshipSystem.Core.BranchOffice", b => - { - b.HasOne("InternshipSystem.Core.Company", null) - .WithMany("Branches") - .HasForeignKey("CompanyId") - .HasConstraintName("fk_branch_office_companies_company_id"); - - b.OwnsOne("InternshipSystem.Core.BranchAddress", "Address", b1 => - { - b1.Property("BranchOfficeId") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b1.Property("Building") - .HasColumnName("building") - .HasColumnType("text"); - - b1.Property("City") - .HasColumnName("city") - .HasColumnType("text"); - - b1.Property("Country") - .HasColumnName("country") - .HasColumnType("text"); - - b1.Property("PostalCode") - .HasColumnName("postal_code") - .HasColumnType("text"); - - b1.Property("Street") - .HasColumnName("street") - .HasColumnType("text"); - - b1.HasKey("BranchOfficeId") - .HasName("pk_branch_office"); - - b1.ToTable("branch_office"); - - b1.WithOwner() - .HasForeignKey("BranchOfficeId") - .HasConstraintName("fk_branch_address_branch_office_branch_office_id"); - }); - }); - - modelBuilder.Entity("InternshipSystem.Core.Document", b => - { - b.HasOne("InternshipSystem.Core.Entity.Internship.Internship", null) - .WithMany("Documentation") - .HasForeignKey("InternshipId") - .HasConstraintName("fk_document_internship_internship_id"); - }); - - modelBuilder.Entity("InternshipSystem.Core.DocumentScan", b => - { - b.HasOne("InternshipSystem.Core.Document", "Document") - .WithOne("Scan") - .HasForeignKey("InternshipSystem.Core.DocumentScan", "DocumentId") - .HasConstraintName("fk_document_scan_document_document_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("InternshipSystem.Core.Edition", b => - { - b.HasOne("InternshipSystem.Core.Course", "Course") - .WithMany() - .HasForeignKey("CourseId") - .HasConstraintName("fk_editions_course_course_id"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.Internship", b => - { - b.HasOne("InternshipSystem.Core.Edition", "Edition") - .WithMany("Internships") - .HasForeignKey("EditionId") - .HasConstraintName("fk_internship_editions_edition_id"); - - b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipRegistration", "InternshipRegistration") - .WithMany() - .HasForeignKey("InternshipRegistrationId") - .HasConstraintName("fk_internship_internship_registration_internship_registration_"); - - b.HasOne("InternshipSystem.Core.Report", "Report") - .WithMany() - .HasForeignKey("ReportId") - .HasConstraintName("fk_internship_report_report_id"); - - b.HasOne("InternshipSystem.Core.Student", "Student") - .WithMany() - .HasForeignKey("StudentId") - .HasConstraintName("fk_internship_students_student_id"); - }); - - modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.InternshipRegistration", b => - { - b.HasOne("InternshipSystem.Core.BranchOffice", "BranchAddress") - .WithMany() - .HasForeignKey("BranchAddressId") - .HasConstraintName("fk_internship_registration_branch_office_branch_address_id"); - - b.HasOne("InternshipSystem.Core.Company", "Company") - .WithMany() - .HasForeignKey("CompanyId") - .HasConstraintName("fk_internship_registration_companies_company_id"); - - b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipType", "Type") - .WithMany() - .HasForeignKey("TypeId") - .HasConstraintName("fk_internship_registration_internship_types_type_id"); - - b.OwnsOne("InternshipSystem.Core.Mentor", "Mentor", b1 => - { - b1.Property("InternshipRegistrationId") - .ValueGeneratedOnAdd() - .HasColumnName("id") - .HasColumnType("bigint") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b1.Property("Email") - .HasColumnName("email") - .HasColumnType("text"); - - b1.Property("FirstName") - .HasColumnName("first_name") - .HasColumnType("text"); - - b1.Property("LastName") - .HasColumnName("last_name") - .HasColumnType("text"); - - b1.Property("PhoneNumber") - .HasColumnName("phone_number") - .HasColumnType("text"); - - b1.HasKey("InternshipRegistrationId") - .HasName("pk_internship_registration"); - - b1.ToTable("internship_registration"); - - b1.WithOwner() - .HasForeignKey("InternshipRegistrationId") - .HasConstraintName("fk_mentor_internship_registration_internship_registration_id"); - }); - }); - - modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.EditionInternshipType", b => - { - b.HasOne("InternshipSystem.Core.Edition", "Edition") - .WithMany("AvailableInternshipTypes") - .HasForeignKey("EditionId") - .HasConstraintName("fk_edition_internship_type_editions_edition_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipType", "InternshipType") - .WithMany() - .HasForeignKey("InternshipTypeId") - .HasConstraintName("fk_edition_internship_type_internship_types_internship_type_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.EditionSubject", b => - { - b.HasOne("InternshipSystem.Core.Edition", "Edition") - .WithMany("AvailableSubjects") - .HasForeignKey("EditionId") - .HasConstraintName("fk_edition_subject_editions_edition_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipSubject", "Subject") - .WithMany() - .HasForeignKey("InternshipSubjectId") - .HasConstraintName("fk_edition_subject_internship_subject_internship_subject_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.ProgramSubject", b => - { - b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipRegistration", "Registration") - .WithMany("Subjects") - .HasForeignKey("InternshipRegistrationId") - .HasConstraintName("fk_program_subject_internship_registration_internship_registrat") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipSubject", "Subject") - .WithMany() - .HasForeignKey("InternshipSubjectId") - .HasConstraintName("fk_program_subject_internship_subject_internship_subject_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -}