diff --git a/src/InternshipSystem.Api/Controllers/CompaniesController.cs b/src/InternshipSystem.Api/Controllers/CompaniesController.cs
index fb8f49c..430e81d 100644
--- a/src/InternshipSystem.Api/Controllers/CompaniesController.cs
+++ b/src/InternshipSystem.Api/Controllers/CompaniesController.cs
@@ -1,40 +1,65 @@
-// using System.Collections.Generic;
-// using System.Linq;
-// using System.Threading;
-// using System.Threading.Tasks;
-// using InternshipSystem.Api.Queries;
-// using InternshipSystem.Core;
-// using InternshipSystem.Repository;
-// using Microsoft.AspNetCore.Http;
-// using Microsoft.AspNetCore.Mvc;
-// using Microsoft.EntityFrameworkCore;
-//
-// namespace InternshipSystem.Api.Controllers
-// {
-// [ApiController]
-// [Route("companies")]
-// public class CompaniesController : ControllerBase
-// {
-// public CompaniesController(InternshipDbContext context)
-// {
-// Context = context;
-// }
-// private InternshipDbContext Context { get; }
-//
-// ///
-// /// Get companies matching provided paginated query
-// ///
-// /// Paginated query description
-// /// Part of companies collection
-// [HttpGet]
-// [ProducesResponseType(StatusCodes.Status200OK)]
-// public async Task> SearchByNameAsync([FromQuery] SearchQuery searchQuery, CancellationToken cancellationToken) =>
-// await Context.Companies
-// .Where(c => c.Name.ToLower().Contains(searchQuery.Query.ToLower()))
-// .OrderBy(o => o.Name)
-// .Skip(searchQuery.Page * searchQuery.PerPage)
-// .Take(searchQuery.PerPage)
-// .ToListAsync(cancellationToken);
-// }
-//
-// }
\ No newline at end of file
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using InternshipSystem.Api.Queries;
+using InternshipSystem.Core;
+using InternshipSystem.Repository;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+
+namespace InternshipSystem.Api.Controllers
+{
+ [ApiController]
+ [Route("companies")]
+ public class CompaniesController : ControllerBase
+ {
+ public CompaniesController(InternshipDbContext context)
+ {
+ Context = context;
+ }
+ private InternshipDbContext Context { get; }
+
+ ///
+ /// Get companies matching provided paginated query
+ ///
+ /// Paginated query description
+ /// Part of companies collection
+ [HttpGet]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ public async Task> SearchByNameAsync([FromQuery] SearchQuery searchQuery, CancellationToken cancellationToken) =>
+ await Context.Companies
+ .Where(c => c.Name.ToLower().Contains(searchQuery.Query.ToLower()))
+ .OrderBy(o => o.Name)
+ .Skip(searchQuery.Page * searchQuery.PerPage)
+ .Take(searchQuery.PerPage)
+ .ToListAsync(cancellationToken);
+
+ ///
+ /// Get companies matching provided paginated query
+ ///
+ /// Paginated query description
+ ///
+ /// Successfully retrieved matching offices
+ /// Search query was malformed
+ /// Part of companies collection
+ [HttpGet("{companyId}")]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ public async Task> SearchBranchesByAddress([FromQuery] SearchQuery searchQuery, long companyId, CancellationToken token)
+ {
+ var company = await Context.Companies.Where(c => c.Id == companyId).FirstAsync(token);
+
+ return await Context.Entry(company)
+ .Collection(c => c.Branches)
+ .Query()
+ .Where(office => office.Address.City.Contains(searchQuery.Query.ToLower()))
+ .Skip(searchQuery.Page * searchQuery.PerPage)
+ .Take(searchQuery.PerPage)
+ .ToListAsync(token);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/InternshipSystem.Api/Controllers/DocumentsController.cs b/src/InternshipSystem.Api/Controllers/DocumentsController.cs
new file mode 100644
index 0000000..5172d9b
--- /dev/null
+++ b/src/InternshipSystem.Api/Controllers/DocumentsController.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Threading.Tasks;
+using InternshipSystem.Api.Queries;
+using InternshipSystem.Repository;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace InternshipSystem.Api.Controllers
+{
+ public class DocumentsController : ControllerBase
+ {
+ private InternshipDbContext Context { get; }
+
+ public DocumentsController(InternshipDbContext context)
+ {
+ Context = context;
+ }
+
+ ///
+ /// Fill out required document,
+ ///
+ /// Documents Scan and description, and Id of filled document
+ ///
+ /// If change was successfully registered
+ /// If the provided query was malformed
+ /// Id doesn't match any required document
+ /// This action is only available for authorized student registered for current edition
+ [HttpPost]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ [ProducesResponseType(StatusCodes.Status404NotFound)]
+ [ProducesResponseType(StatusCodes.Status401Unauthorized)]
+ public async Task AddDocumentToInternship([FromBody] DocumentPublishRequest document) =>
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/src/InternshipSystem.Api/Controllers/EditionController.cs b/src/InternshipSystem.Api/Controllers/EditionController.cs
new file mode 100644
index 0000000..a104275
--- /dev/null
+++ b/src/InternshipSystem.Api/Controllers/EditionController.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Threading.Tasks;
+using InternshipSystem.Api.Result;
+using InternshipSystem.Core;
+using InternshipSystem.Repository;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace InternshipSystem.Api.Controllers
+{
+ [Route("edition")]
+ public class EditionController : ControllerBase
+ {
+ private InternshipDbContext Context { get; }
+
+ public EditionController(InternshipDbContext context)
+ {
+ Context = context;
+ }
+
+ ///
+ /// Get current edition parameters
+ ///
+ /// Parameters of edition registered for by student
+ /// This action is only available for authorized student registered for current edition
+ ///
+ [HttpGet]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ public async Task> GetCurrentEdition() =>
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/src/InternshipSystem.Api/Controllers/InternshipRegistrationController.cs b/src/InternshipSystem.Api/Controllers/InternshipRegistrationController.cs
new file mode 100644
index 0000000..cb48ea4
--- /dev/null
+++ b/src/InternshipSystem.Api/Controllers/InternshipRegistrationController.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using InternshipSystem.Api.Queries;
+using InternshipSystem.Repository;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace InternshipSystem.Api.Controllers
+{
+ [Route("internshipRegistration")]
+ public class InternshipRegistrationController : ControllerBase
+ {
+ private InternshipDbContext Context { get; }
+
+ public InternshipRegistrationController(InternshipDbContext context)
+ {
+ Context = context;
+ }
+
+ ///
+ /// Validate and add filled internship registration form
+ ///
+ /// Internship registration data
+ /// If registration form was successfully added
+ /// If the provided registration query was malformed
+ /// This action is only available for authorized student registered for current edition
+ [HttpPut]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ [ProducesResponseType(StatusCodes.Status401Unauthorized)]
+ public async Task SubmitRegistrationForm([FromBody] RegistrationFormQuery registrationQuery, CancellationToken cancellationToken) =>
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/src/InternshipSystem.Api/Controllers/RegistrationController.cs b/src/InternshipSystem.Api/Controllers/RegistrationController.cs
new file mode 100644
index 0000000..76bc0db
--- /dev/null
+++ b/src/InternshipSystem.Api/Controllers/RegistrationController.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Threading.Tasks;
+using InternshipSystem.Api.Result;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace InternshipSystem.Api.Controllers
+{
+ [ApiController]
+ [Route("register")]
+ public class RegistrationController : ControllerBase
+ {
+ ///
+ /// Register student for edition using provided registration code
+ ///
+ /// GUID of edition
+ ///
+ /// If the student was successfully registered
+ /// If the provided registration code was malformed
+ /// The registration code doesn't match any open edition
+ [HttpPost]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ [ProducesResponseType(StatusCodes.Status404NotFound)]
+ public async Task RegisterStudentForEdition([FromBody] Guid registrationCode) =>
+ throw new NotImplementedException();
+
+
+ }
+}
\ No newline at end of file
diff --git a/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs b/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs
new file mode 100644
index 0000000..fe6b5b2
--- /dev/null
+++ b/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs
@@ -0,0 +1,12 @@
+using InternshipSystem.Core.ValueObject;
+
+namespace InternshipSystem.Api.Queries
+{
+ public class DocumentPublishRequest
+ {
+ public long Id { get; set; }
+ public string Description { get; set; }
+ public byte[] Scan { get; set; }
+ public DocumentType Type { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/InternshipSystem.Api/Queries/RegistrationFormQuery.cs b/src/InternshipSystem.Api/Queries/RegistrationFormQuery.cs
new file mode 100644
index 0000000..fe30ded
--- /dev/null
+++ b/src/InternshipSystem.Api/Queries/RegistrationFormQuery.cs
@@ -0,0 +1,15 @@
+using System;
+using InternshipSystem.Core;
+using InternshipSystem.Core.Entity.Internship;
+
+namespace InternshipSystem.Api.Queries
+{
+ public class RegistrationFormQuery
+ {
+ public Company Company { get; set; }
+ public BranchOffice BranchAddress { get; set; }
+ public DateTime Start { get; set; }
+ public DateTime End { get; set; }
+ public InternshipType Type { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/InternshipSystem.Api/Result/EditionResult.cs b/src/InternshipSystem.Api/Result/EditionResult.cs
new file mode 100644
index 0000000..6436990
--- /dev/null
+++ b/src/InternshipSystem.Api/Result/EditionResult.cs
@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+using InternshipSystem.Core;
+using InternshipSystem.Core.Entity.Internship;
+
+namespace InternshipSystem.Api.Result
+{
+ public struct EditionResult
+ {
+ public List Types { get; set; }
+ public List Subjects { get; set; }
+ public Student Student { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/InternshipSystem.Core/Entity/Approval.cs b/src/InternshipSystem.Core/Entity/Approval.cs
deleted file mode 100644
index f79d782..0000000
--- a/src/InternshipSystem.Core/Entity/Approval.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace InternshipSystem.Core
-{
- public class Approval
- {
- public long Id { get; set; }
- public byte[] Scan { get; set; }
- public DocumentState State { get; set; }
- }
-}
\ No newline at end of file
diff --git a/src/InternshipSystem.Core/Entity/Document.cs b/src/InternshipSystem.Core/Entity/Document.cs
index 6a75cc2..8e7ed74 100644
--- a/src/InternshipSystem.Core/Entity/Document.cs
+++ b/src/InternshipSystem.Core/Entity/Document.cs
@@ -1,9 +1,13 @@
-namespace InternshipSystem.Core
+using InternshipSystem.Core.ValueObject;
+
+namespace InternshipSystem.Core
{
public class Document
{
public long Id { get; set; }
public string Description { get; set; }
+ public byte[] Scan { get; set; }
+ public DocumentType Type { get; set; }
public DocumentState State { get; set; }
}
}
\ No newline at end of file
diff --git a/src/InternshipSystem.Core/Entity/Internship/Internship.cs b/src/InternshipSystem.Core/Entity/Internship/Internship.cs
index 3d3bc20..61f0c2b 100644
--- a/src/InternshipSystem.Core/Entity/Internship/Internship.cs
+++ b/src/InternshipSystem.Core/Entity/Internship/Internship.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
namespace InternshipSystem.Core
{
@@ -10,7 +9,7 @@ namespace InternshipSystem.Core
public InternshipRegistration InternshipRegistration { get; set; }
public InternshipProgram InternshipProgram { get; set; }
public Report Report { get; set; }
- public List Approvals { get; set; }
- public List Documents { get; set; }
+ public List Approvals { get; set; }
+ public List Documentation { get; set; }
}
}
\ No newline at end of file
diff --git a/src/InternshipSystem.Core/ValueObject/DocumentState.cs b/src/InternshipSystem.Core/ValueObject/DocumentState.cs
index 465aa58..2a8d863 100644
--- a/src/InternshipSystem.Core/ValueObject/DocumentState.cs
+++ b/src/InternshipSystem.Core/ValueObject/DocumentState.cs
@@ -2,7 +2,7 @@
{
public enum DocumentState
{
- Draft,
+ NotSubmitted,
Submitted,
Accepted,
Rejected
diff --git a/src/InternshipSystem.Core/ValueObject/DocumentType.cs b/src/InternshipSystem.Core/ValueObject/DocumentType.cs
new file mode 100644
index 0000000..5acb99a
--- /dev/null
+++ b/src/InternshipSystem.Core/ValueObject/DocumentType.cs
@@ -0,0 +1,7 @@
+namespace InternshipSystem.Core.ValueObject
+{
+ public enum DocumentType
+ {
+ IPPScan
+ }
+}
\ No newline at end of file