Edition Get and Delete #79
424
PostmanTestRequest/StudentOperations.postman_collection.json
Normal file
424
PostmanTestRequest/StudentOperations.postman_collection.json
Normal file
@ -0,0 +1,424 @@
|
||||
{
|
||||
"info": {
|
||||
"_postman_id": "f0858747-6271-4176-9193-ed1f9be0d7d3",
|
||||
"name": "StudentOperations",
|
||||
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
||||
},
|
||||
"item": [
|
||||
{
|
||||
"name": "loginDev",
|
||||
"request": {
|
||||
"method": "GET",
|
||||
"header": [],
|
||||
"url": {
|
||||
"raw": "http://localhost:8080/dev/login",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"dev",
|
||||
"login"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "loginEdition",
|
||||
"request": {
|
||||
"method": "POST",
|
||||
"header": [
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjAxMTk3NTUyLCJleHAiOjE2MDEyODM5NTEsImlhdCI6MTYwMTE5NzU1Mn0.0wcNQSXV55MFvEnRLC09nGwCqI7M2kuWdwe0EOV_C6Y",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"value": "application/json",
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": "\"138da8a3-855c-4b17-9bd2-5f357679efa9\""
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://localhost:8080/access/loginEdition",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"access",
|
||||
"loginEdition"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "currentInternship",
|
||||
"request": {
|
||||
"method": "GET",
|
||||
"header": [
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjAxMTk3NTYzLCJleHAiOjE2MDEyODM5NjMsImlhdCI6MTYwMTE5NzU2MywiRWRpdGlvbiI6IjEzOGRhOGEzLTg1NWMtNGIxNy05YmQyLTVmMzU3Njc5ZWZhOSJ9.l7QK1eUIJexnDaFKZ9yx3NWxmB2KrvPpjLUuuP1EJyE",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"value": "application/json",
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"url": {
|
||||
"raw": "http://localhost:8080/internshipRegistration",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"internshipRegistration"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "GetEditionManagementList",
|
||||
"request": {
|
||||
"auth": {
|
||||
"type": "bearer",
|
||||
"bearer": [
|
||||
{
|
||||
"key": "token",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA0ODI3ODgzLCJleHAiOjE2MDQ5MTQyODMsImlhdCI6MTYwNDgyNzg4M30.a3mMm3Zk3xpfsmIwlqtpjgWgTNEXv8O4hH_V_L9UFZo",
|
||||
"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/editionManagement",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"editionManagement"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "GetEditionManagement",
|
||||
"request": {
|
||||
"auth": {
|
||||
"type": "bearer",
|
||||
"bearer": [
|
||||
{
|
||||
"key": "token",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA0ODI3ODgzLCJleHAiOjE2MDQ5MTQyODMsImlhdCI6MTYwNDgyNzg4M30.a3mMm3Zk3xpfsmIwlqtpjgWgTNEXv8O4hH_V_L9UFZo",
|
||||
"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/editionManagement/bbc401c3-2d99-4142-bbb7-24c345d1fb21",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"editionManagement",
|
||||
"bbc401c3-2d99-4142-bbb7-24c345d1fb21"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "CreateEdition",
|
||||
"request": {
|
||||
"auth": {
|
||||
"type": "bearer",
|
||||
"bearer": [
|
||||
{
|
||||
"key": "token",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA0ODMzMjY1LCJleHAiOjE2MDQ5MTk2NjUsImlhdCI6MTYwNDgzMzI2NX0.bGjMLDkCZ6zSBVUxC3WtYgyo-af16aJEGXKAUg_6p5Y",
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"method": "PUT",
|
||||
"header": [
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"type": "text",
|
||||
"value": "application/json"
|
||||
}
|
||||
],
|
||||
"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}"
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://localhost:8080/editionManagement",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"editionManagement"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "UpdateEdition",
|
||||
"request": {
|
||||
"auth": {
|
||||
"type": "bearer",
|
||||
"bearer": [
|
||||
{
|
||||
"key": "token",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA0ODMzMjY1LCJleHAiOjE2MDQ5MTk2NjUsImlhdCI6MTYwNDgzMzI2NX0.bGjMLDkCZ6zSBVUxC3WtYgyo-af16aJEGXKAUg_6p5Y",
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"method": "PUT",
|
||||
"header": [
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"type": "text",
|
||||
"value": "application/json"
|
||||
}
|
||||
],
|
||||
"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}"
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://localhost:8080/editionManagement",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"editionManagement"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "DeleteEditionManagement",
|
||||
"request": {
|
||||
"auth": {
|
||||
"type": "bearer",
|
||||
"bearer": [
|
||||
{
|
||||
"key": "token",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjA0ODI3ODgzLCJleHAiOjE2MDQ5MTQyODMsImlhdCI6MTYwNDgyNzg4M30.a3mMm3Zk3xpfsmIwlqtpjgWgTNEXv8O4hH_V_L9UFZo",
|
||||
"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/editionManagement/bbc401c3-2d99-4142-bbb7-24c345d1fb21",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"editionManagement",
|
||||
"bbc401c3-2d99-4142-bbb7-24c345d1fb21"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "updateRegistration",
|
||||
"request": {
|
||||
"method": "PUT",
|
||||
"header": [
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjAxMTk3NTYzLCJleHAiOjE2MDEyODM5NjMsImlhdCI6MTYwMTE5NzU2MywiRWRpdGlvbiI6IjEzOGRhOGEzLTg1NWMtNGIxNy05YmQyLTVmMzU3Njc5ZWZhOSJ9.l7QK1eUIJexnDaFKZ9yx3NWxmB2KrvPpjLUuuP1EJyE",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"value": "application/json",
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": "{\r\n \"company\": {\r\n \"id\": 1,\r\n \"nip\": null,\r\n \"name\": null\r\n },\r\n \"branchOffice\": {\r\n \"id\": 1,\r\n \"street\": null,\r\n \"building\": null,\r\n \"city\": null,\r\n \"postalCode\": null,\r\n \"country\": null\r\n },\r\n \"start\": \"2020-07-27T09:43:49.094Z\",\r\n \"end\": \"2020-09-27T09:43:49.094Z\",\r\n \"type\": {\r\n \"id\": 2,\r\n \"type\": null,\r\n \"description\": null,\r\n \"descriptionEng\": null\r\n }\r\n}"
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://localhost:8080/internshipRegistration",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"internshipRegistration"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "GetRegisteredEditions",
|
||||
"request": {
|
||||
"method": "GET",
|
||||
"header": [
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjAxMTk3NTYzLCJleHAiOjE2MDEyODM5NjMsImlhdCI6MTYwMTE5NzU2MywiRWRpdGlvbiI6IjEzOGRhOGEzLTg1NWMtNGIxNy05YmQyLTVmMzU3Njc5ZWZhOSJ9.l7QK1eUIJexnDaFKZ9yx3NWxmB2KrvPpjLUuuP1EJyE",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"value": "application/json",
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"url": {
|
||||
"raw": "http://localhost:8080/editions",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"editions"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "GetEditionsConfiguration",
|
||||
"request": {
|
||||
"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/editions/138da8a3-855c-4b17-9bd2-5f357679efa9",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"editions",
|
||||
"138da8a3-855c-4b17-9bd2-5f357679efa9"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "RegisterForEdition",
|
||||
"request": {
|
||||
"method": "POST",
|
||||
"header": [
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImZpcnN0bmFtZSIsImZhbWlseV9uYW1lIjoibGFzdG5hbWUiLCJQZXJzb25OdW1iZXIiOiIxIiwibmJmIjoxNjAxMTk3NTYzLCJleHAiOjE2MDEyODM5NjMsImlhdCI6MTYwMTE5NzU2MywiRWRpdGlvbiI6IjEzOGRhOGEzLTg1NWMtNGIxNy05YmQyLTVmMzU3Njc5ZWZhOSJ9.l7QK1eUIJexnDaFKZ9yx3NWxmB2KrvPpjLUuuP1EJyE",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"value": "application/json",
|
||||
"type": "text"
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": "\"138da8a3-855c-4b17-9bd2-5f357679efa9\""
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://localhost:8080/register",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"localhost"
|
||||
],
|
||||
"port": "8080",
|
||||
"path": [
|
||||
"register"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
}
|
||||
],
|
||||
"protocolProfileBehavior": {}
|
||||
}
|
@ -18,12 +18,22 @@ namespace InternshipSystem.Api
|
||||
.ForMember(
|
||||
result => result.Status,
|
||||
opt => opt.MapFrom(edition => edition.IsOpen ? "Open" : "Archival"));
|
||||
|
||||
CreateMap<Edition, EditionManagementResult>();
|
||||
|
||||
CreateMap<Edition, EditionDetailsResult>();
|
||||
|
||||
CreateMap<Edition, EditionConfigurationResult>();
|
||||
|
||||
CreateMap<InternshipSubject, InternshipSubject>();
|
||||
|
||||
CreateMap<EditionSubject, InternshipSubject>().IncludeMembers(es => es.Subject);
|
||||
CreateMap<EditionSubject, InternshipSubject>()
|
||||
.IncludeMembers(es => es.Subject);
|
||||
|
||||
CreateMap<EditionInternshipType, InternshipType>()
|
||||
.IncludeMembers(eit => eit.InternshipType);
|
||||
|
||||
CreateMap<InternshipType, InternshipType>();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,165 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using AutoMapper;
|
||||
using AutoMapper.QueryableExtensions;
|
||||
using InternshipSystem.Api.Queries;
|
||||
using InternshipSystem.Api.Queries.SearchQuery;
|
||||
using InternshipSystem.Api.Result;
|
||||
using InternshipSystem.Api.Security;
|
||||
using InternshipSystem.Core;
|
||||
using InternshipSystem.Repository;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace InternshipSystem.Api.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("editionManagement")]
|
||||
public class EditionManagementController : ControllerBase
|
||||
{
|
||||
private InternshipDbContext Context { get; }
|
||||
private IMapper Mapper { get; }
|
||||
|
||||
public EditionManagementController(IMapper mapper, InternshipDbContext context)
|
||||
{
|
||||
Context = context;
|
||||
Mapper = mapper;
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[Authorize(Policy = Policies.IsOverseer)]
|
||||
public async Task<ActionResult<IReadOnlyCollection<EditionManagementResult>>> GetEditions([FromQuery] EditionSearchQuery searchQuery, CancellationToken token) =>
|
||||
await Context.Editions
|
||||
.Include(e => e.Course)
|
||||
.ProjectTo<EditionManagementResult>(Mapper.ConfigurationProvider)
|
||||
.Skip(searchQuery.Page * searchQuery.PerPage)
|
||||
.Take(searchQuery.PerPage)
|
||||
.ToListAsync(token);
|
||||
|
||||
[HttpGet("{editionId}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[Authorize(Policy = Policies.IsOverseer)]
|
||||
public async Task<ActionResult<EditionDetailsResult>> GetFullEdition(Guid editionId, CancellationToken token)
|
||||
{
|
||||
var edition = await Context.Editions
|
||||
.Include(e => e.Course)
|
||||
.Include(e => e.AvailableSubjects)
|
||||
.ThenInclude(s => s.Subject)
|
||||
.Include(e => e.AvailableInternshipTypes)
|
||||
.ThenInclude(i => i.InternshipType)
|
||||
.Where(e => e.Id == editionId)
|
||||
.ProjectTo<EditionDetailsResult>(Mapper.ConfigurationProvider)
|
||||
.FirstOrDefaultAsync(token);
|
||||
|
||||
if (edition == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
return Ok(edition);
|
||||
}
|
||||
|
||||
[HttpPut]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[Authorize(Policy = Policies.IsOverseer)]
|
||||
public async Task<ActionResult> UpsertEdition(EditionForm editionForm, CancellationToken token)
|
||||
{
|
||||
var validator = new EditionForm.Validator();
|
||||
var validationResult = await validator.ValidateAsync(editionForm, token);
|
||||
|
||||
if (!validationResult.IsValid)
|
||||
{
|
||||
return BadRequest(validationResult.ToString());
|
||||
}
|
||||
|
||||
//TODO: resolve courses (one for each edition or dictionary)
|
||||
editionForm.Course.Id = 0;
|
||||
|
||||
if (editionForm.Id.HasValue)
|
||||
{
|
||||
var editionToUpdate = await Context.Editions
|
||||
.Include(e => e.AvailableSubjects)
|
||||
.Include(e => e.AvailableInternshipTypes)
|
||||
.FirstOrDefaultAsync(e => e.Id == editionForm.Id.Value, token);
|
||||
|
||||
if (editionToUpdate == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
editionToUpdate.UpdateEdition(editionForm.EditionStart, editionForm.EditionFinish, editionForm.ReportingStart,
|
||||
editionForm.Course, editionForm.AvailableSubjectsIds, editionForm.AvailableInternshipTypesIds);
|
||||
|
||||
if (!editionToUpdate.IsValidDates)
|
||||
{
|
||||
return BadRequest();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var newEdition =
|
||||
Edition.CreateEdition(editionForm.EditionStart.Value, editionForm.EditionFinish.Value, editionForm.ReportingStart.Value,
|
||||
editionForm.Course, editionForm.AvailableSubjectsIds, editionForm.AvailableInternshipTypesIds);
|
||||
|
||||
if (!newEdition.IsValidDates)
|
||||
{
|
||||
return BadRequest();
|
||||
}
|
||||
|
||||
await Context.Editions.AddAsync(newEdition, token);
|
||||
}
|
||||
|
||||
await Context.SaveChangesAsync(token);
|
||||
return Ok();
|
||||
}
|
||||
|
||||
[HttpDelete("{editionId}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status409Conflict)]
|
||||
[Authorize(Policy = Policies.IsOverseer)]
|
||||
public async Task<ActionResult> DeleteEdition(Guid editionId, CancellationToken token)
|
||||
{
|
||||
var editionToDelete = await Context.Editions
|
||||
.Include(e => e.AvailableSubjects)
|
||||
.Include(e => e.AvailableInternshipTypes)
|
||||
.FirstOrDefaultAsync(e => e.Id.Equals(editionId), token);
|
||||
|
||||
if (editionToDelete == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
var referencedInternships =
|
||||
await Context
|
||||
.Entry(editionToDelete)
|
||||
.Collection(e => e.Internships)
|
||||
.Query()
|
||||
.CountAsync(token);
|
||||
|
||||
if (referencedInternships > 0)
|
||||
{
|
||||
return Conflict();
|
||||
}
|
||||
|
||||
Context.Editions.Remove(editionToDelete);
|
||||
await Context.SaveChangesAsync(token);
|
||||
return Ok();
|
||||
}
|
||||
}
|
||||
}
|
@ -163,7 +163,6 @@ namespace InternshipSystem.Api.Controllers
|
||||
return NotFound($"Internship type with id: {internshipTypeId} does not exist");
|
||||
}
|
||||
|
||||
Context.InternshipTypes.Attach(internshipTypeToDelete);
|
||||
Context.InternshipTypes.Remove(internshipTypeToDelete);
|
||||
await Context.SaveChangesAsync(cancellationToken);
|
||||
return Ok($"Internship type with id: {internshipTypeId} deleted successfully");
|
||||
|
@ -155,7 +155,6 @@ namespace InternshipSystem.Api.Controllers
|
||||
return NotFound($"Static page with access name: {accessName} does not exist");
|
||||
}
|
||||
|
||||
Context.StaticPages.Attach(pageToDelete);
|
||||
Context.StaticPages.Remove(pageToDelete);
|
||||
await Context.SaveChangesAsync(cancellationToken);
|
||||
return Ok($"Static page with access name: {accessName} deleted successfully");
|
||||
|
38
src/InternshipSystem.Api/Queries/EditionForm.cs
Normal file
38
src/InternshipSystem.Api/Queries/EditionForm.cs
Normal file
@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using FluentValidation;
|
||||
using InternshipSystem.Core;
|
||||
using InternshipSystem.Core.Entity.Internship;
|
||||
|
||||
namespace InternshipSystem.Api.Queries
|
||||
{
|
||||
public class EditionForm
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
public DateTime? EditionStart { get; set; }
|
||||
public DateTime? EditionFinish { get; set; }
|
||||
public DateTime? ReportingStart { get; set; }
|
||||
public Course Course { get; set; }
|
||||
public List<long> AvailableSubjectsIds { get; set; } = new List<long>();
|
||||
public List<long> AvailableInternshipTypesIds { get; set; } = new List<long>();
|
||||
|
||||
public class Validator : AbstractValidator<EditionForm>
|
||||
{
|
||||
public Validator()
|
||||
{
|
||||
RuleFor(e => e.Id).NotNull()
|
||||
.When(e => !e.EditionStart.HasValue || !e.EditionFinish.HasValue
|
||||
|| !e.ReportingStart.HasValue || e.Course == null);
|
||||
|
||||
RuleFor(e => e.EditionStart).NotEmpty()
|
||||
.When(e => !e.Id.HasValue);
|
||||
RuleFor(e => e.EditionFinish).NotEmpty()
|
||||
.When(e => !e.Id.HasValue);
|
||||
RuleFor(e => e.ReportingStart).NotEmpty()
|
||||
.When(e => !e.Id.HasValue);
|
||||
RuleFor(e => e.Course).NotNull()
|
||||
.When(e => !e.Id.HasValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
namespace InternshipSystem.Api.Queries.SearchQuery
|
||||
{
|
||||
public class EditionSearchQuery : SearchQuery
|
||||
{
|
||||
|
||||
}
|
||||
}
|
18
src/InternshipSystem.Api/Result/EditionDetailsResult.cs
Normal file
18
src/InternshipSystem.Api/Result/EditionDetailsResult.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using InternshipSystem.Core;
|
||||
using InternshipSystem.Core.Entity.Internship;
|
||||
|
||||
namespace InternshipSystem.Api.Result
|
||||
{
|
||||
public class EditionDetailsResult
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public DateTime EditionStart { get; set; }
|
||||
public DateTime EditionFinish { get; set; }
|
||||
public DateTime ReportingStart { get; set; }
|
||||
public Course Course { get; set; }
|
||||
public List<InternshipSubject> AvailableSubjects { get; set; }
|
||||
public List<InternshipType> AvailableInternshipTypes { get; set; }
|
||||
}
|
||||
}
|
14
src/InternshipSystem.Api/Result/EditionManagementResult.cs
Normal file
14
src/InternshipSystem.Api/Result/EditionManagementResult.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using InternshipSystem.Core;
|
||||
|
||||
namespace InternshipSystem.Api.Result
|
||||
{
|
||||
public class EditionManagementResult
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public DateTime EditionStart { get; set; }
|
||||
public DateTime EditionFinish { get; set; }
|
||||
public DateTime ReportingStart { get; set; }
|
||||
public Course Course { get; set; }
|
||||
}
|
||||
}
|
@ -3,5 +3,6 @@
|
||||
public static class Policies
|
||||
{
|
||||
public const string RegisteredOnly = "RegisteredForEditionOnly";
|
||||
public const string IsOverseer = "IsOverseer";
|
||||
}
|
||||
}
|
@ -38,6 +38,8 @@ namespace InternshipSystem.Api
|
||||
.AddAuthorization(o =>
|
||||
{
|
||||
o.AddPolicy(Policies.RegisteredOnly, policy => policy.RequireClaim("Edition"));
|
||||
//TODO: change to claim for InternshipRepresentative
|
||||
o.AddPolicy(Policies.IsOverseer, policy => policy.RequireClaim("PersonNumber"));
|
||||
})
|
||||
.AddHttpClient<GutCasClient>();
|
||||
|
||||
|
@ -18,17 +18,77 @@ namespace InternshipSystem.Core
|
||||
public List<EditionInternshipType> AvailableInternshipTypes { get; set; }
|
||||
|
||||
public bool IsOpen => EditionFinish < DateTime.Today;
|
||||
|
||||
public Edition CreateEdition(DateTime start, DateTime end, DateTime reportingStart)
|
||||
|
||||
public static Edition CreateEdition(DateTime start, DateTime end, DateTime reportingStart, Course course,
|
||||
IEnumerable<long> subjectsIds, IEnumerable<long> internshipTypesIds)
|
||||
{
|
||||
var newEdition = CreateEdition(start, end, reportingStart, course);
|
||||
|
||||
newEdition.AvailableSubjects =
|
||||
subjectsIds
|
||||
.Select(s => new EditionSubject
|
||||
{
|
||||
Edition = newEdition,
|
||||
InternshipSubjectId = s,
|
||||
})
|
||||
.ToList();
|
||||
|
||||
newEdition.AvailableInternshipTypes =
|
||||
internshipTypesIds
|
||||
.Select(i => new EditionInternshipType
|
||||
{
|
||||
Edition = newEdition,
|
||||
InternshipTypeId = i,
|
||||
})
|
||||
.ToList();
|
||||
|
||||
return newEdition;
|
||||
}
|
||||
|
||||
public static Edition CreateEdition(DateTime start, DateTime end, DateTime reportingStart, Course course)
|
||||
{
|
||||
return new Edition
|
||||
{
|
||||
EditionStart = start,
|
||||
EditionFinish = end,
|
||||
ReportingStart = reportingStart
|
||||
ReportingStart = reportingStart,
|
||||
Course = course,
|
||||
AvailableSubjects = new List<EditionSubject>(),
|
||||
AvailableInternshipTypes = new List<EditionInternshipType>(),
|
||||
};
|
||||
}
|
||||
|
||||
public void UpdateEdition(DateTime? start, DateTime? end, DateTime? reportingStart, Course course,
|
||||
IEnumerable<long> subjectsIds, IEnumerable<long> internshipTypesIds)
|
||||
{
|
||||
EditionStart = start ?? EditionStart;
|
||||
EditionFinish = end ?? EditionFinish;
|
||||
ReportingStart = reportingStart ?? ReportingStart;
|
||||
Course = course;
|
||||
|
||||
if (subjectsIds != null)
|
||||
{
|
||||
AvailableSubjects =
|
||||
subjectsIds
|
||||
.Select(s => new EditionSubject
|
||||
{
|
||||
InternshipSubjectId = s,
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
|
||||
if (internshipTypesIds != null)
|
||||
{
|
||||
AvailableInternshipTypes =
|
||||
internshipTypesIds
|
||||
.Select(i => new EditionInternshipType
|
||||
{
|
||||
InternshipTypeId = i,
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
public void RegisterInternship(Student student)
|
||||
{
|
||||
if (Internships.Any(i => i.Student.Id == student.Id))
|
||||
@ -55,5 +115,7 @@ namespace InternshipSystem.Core
|
||||
{
|
||||
return internshipSubjects.All(s => AvailableSubjects.Any(su => su.InternshipSubjectId == s));
|
||||
}
|
||||
|
||||
public bool IsValidDates => EditionStart <= EditionFinish;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user