https://github.com/koenverboven/schooladministrationapi
School Administration / management API
https://github.com/koenverboven/schooladministrationapi
automapper csharp dependency-injection dtos entity-framework-core fluentassertions repository-pattern serilog sqlserver-2019 swagger unit-testing webapi xunit
Last synced: 2 months ago
JSON representation
School Administration / management API
- Host: GitHub
- URL: https://github.com/koenverboven/schooladministrationapi
- Owner: KoenVerboven
- Created: 2024-12-21T15:48:34.000Z (4 months ago)
- Default Branch: master
- Last Pushed: 2025-02-12T09:21:18.000Z (3 months ago)
- Last Synced: 2025-02-12T10:32:43.686Z (3 months ago)
- Topics: automapper, csharp, dependency-injection, dtos, entity-framework-core, fluentassertions, repository-pattern, serilog, sqlserver-2019, swagger, unit-testing, webapi, xunit
- Language: C#
- Homepage:
- Size: 250 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
WEB API for schoolAdministration
----------------------------------This API, written in C#, is intended as a backend for an Angular website for school administration.
A student can take 1 or more courses.
A student can create 1 or more studyplans.
With the help of a studyplan, the student can plan a learning period, for example for a specific exam.
A student can take an exam and view his results.
A teacher gives 1 or more courses.
A teacher can create 1 or more Exames.
A teacher can give exam grades for a specific student
Student:
* GetAllStudents
* GetStudentById
* GetExamResultsByStudentId
* GetStudentByNameStartWith
* CreateStudent
* DeleteStudentById
* UpdateStudentTeacher:
* GetAllTeachers
* GetTeacherById
* CreateTeacher
* DeleteTeacherById
* UpdateTeacherCourse:
* GetAllCoursers
* GetCourseById
* CreateCourse
* DeleteCourse
* UpdateCourse
* SearchCourse on CourseName and CourseCodeExamen:
* GetAllExams
* GetExamById
* CreateExam
* DeleteExamById
* UpdateExamAsyncExamenResult:
* GetAllExamResult
* GetExamResultById
* CreateExamResult
* DeleteExamById
* UpdateExamResultStudyPlan:
* GetAllStudyPlans
* GetStudyPlanById,
* CreateStudyPlan,
* DeleteStudyPlanById,
* UpdateStudyPlanCross-origin-requests :
------------
CorsLogging :
---------
Installed NuGet-packages :
* Serilog.AspNetCore
* Serilog.Sinks.fileWith Serilog we can easly write our logs to a txt.file.
Program.cs:
Log.Logger = new LoggerConfiguration().MinimumLevel.Debug()
.WriteTo.File("log/villaLogs.txt", rollingInterval: RollingInterval.Day).CreateLogger();
builder.Host.UseSerilog();StudentController:
_logger.LogInformation("Getting all the students.")
Exploring Endpoints :
-----------------------------------
We use Swagger.EntityFrameworkCore:
--------------------
Installed NuGet-packages :
* microsoft.entityframeworkcore.sqlserver\9.0.0
* entityframeworkcore.tools\9.0.0We use code first.
By Migrations we keep our database in SQL-Server in Sync.
example:
Type in Package Manager Console:
Add-Migration InitialMigration
update-Database
Dependecy Injection :
--------------------
Why we use Dependecy Injection?Dependency injection aims to separate the concerns of constructing objects and using them,
leading to loosely coupled programs.We use DI for injection from : studentRepository,logger and mapper
public StudentController(
IStudentRepository studentRepository,
ILogger logger,
IMapper mapper)In program.cs we must configure:
builder.Services.AddScoped();AutoMapper :
-------------
Installed NuGet-package :
* automapperTo map entities to DTO's and vice versa.
DTO stands for Data Transfer Objects
Why we need DTO's to communicate with the outside world?
Example : in our database we have fields to store 'insertDate' or 'insertedBy'
If we don't won't to share this fields with the outside world : we make a DTO
without these fields.We use par Controller 3 DTO's : one for update, one for insert, one for read
Why?
Because we do not need always the same data.
Example : for insert we do not need a ID, for a update is ID necessary.
MappingConfig:CreateMap().ReverseMap();
In the Controller we can write some like this:_mapper.Map < StudentDTO > (student)
Here we map student to StudentDTO.Versioning:
-----------
Installed NuGet-packages :
* Microsoft.AspNetCore.Mvc.Versioning
* Microsoft.AspNetCore.Mvc.Versioning.ApiExlorerProgram.cs :
builder.Services.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0);
});Unittesting :
-------------
add new project to solution : xUnit test ProjectInstalled Nuget-Packages:
* FluentAssertions
* MoqMake a reference to SchoolAdministration project:
Right click project SchoolAdministrationTests
choose Project Reference
UnitTests :

Swagger :Exploring Endpoints
