Clone this repository and bring the code pieces you need into your BDSA Assignments GitHub repository.
You are required to implement a model using Entity Framework Core for a simple kanban board for tracking work progress.
-
Install the required
Microsoft.EntityFrameworkCorepackage. -
Setup and configure your database host of choice.
-
Implement the following entities (POCOs) in the
Entitiesproject.- Task
- Id : int
- Title : string(100), required
- AssignedTo : optional reference to User entity
- Description : string(max), optional
- State : enum (New, Active, Resolved, Closed, Removed), required
- Tags : many-to-many reference to Tag entity
- User
- Id : int
- Name : string(100), required
- Email : string(100), required, unique
- Tasks : list of Task entities belonging to User
- Tag
- Id : int
- Name : string(50), required, unique
- Tasks : many-to-many reference to Task entity
- Task
-
Ensure that the
Stateproperty of theTaskentity is stored as astring. See: https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions. -
Implement the
KanbanContextrequired for the model above in theEntitiesproject. -
Implement and test the
ITagRepositoryand/or theIUserRepositoryusing the classes in theEntitiesproject -
Implement and test the
ITaskRepositoryinterface in theCoreproject using theTaskRepositoryclass in theEntitiesproject.
- Trying to update or delete a non-existing entity should return
NotFound. - Create, Read, and Update should return a proper
Response. - Your are not allowed to write
throw new ...- use theResponseinstead. - Your code must use an in-memory database for testing.
- If a task, tag, or user is not found, return
null.
- Only tasks with the state
Newcan be deleted from the database. - Deleting a task which is
Activeshould set its state toRemoved. - Deleting a task which is
Resolved,Closed, orRemovedshould returnConflict. - Creating a task will set its state to
NewandCreated/StateUpdatedto current time in UTC. - Create/update task must allow for editing tags.
- Updating the
Stateof a task will change theStateUpdatedto current time in UTC. - Assigning a user which does not exist should return
BadRequest. - TaskRepository may not depend on TagRepository or UserRepository.
- Tags which are assigned to a task may only be deleted using the
force. - Trying to delete a tag in use without the
forceshould returnConflict. - Trying to create a tag which exists already should return
Conflict.
- Users who are assigned to a task may only be deleted using the
force. - Trying to delete a user in use without the
forceshould returnConflict. - Trying to create a user which exists already (same email) should return
Conflict.
Comparing actual time in a unit test can be tricky - DateTime.UtcNow is too precise - so setting a value in a test to compare with value in code will not work.
You will want to allow timing to be slightly off - maybe by 5 seconds as the following snippet demonstrates:
var expected = DateTime.UtcNow;
var actual = DateTime.UtcNow.AddSeconds(2);
Assert.Equal(expected, actual, precision: TimeSpan.FromSeconds(5)); // trueStudy the meaning of encapsulation, inheritance, and polymorphism in OO languages. Provide a description of these concepts including UML diagram showcasing them.
As a maintainance activity (i.e., after having written the code): draw a class diagram representing your implementation of the entities for the C# part. The purpose of the diagram should be to document the main relationships between the entities and their multiplicity.
As a maintainance activity (i.e., after having written the code): draw a state machine diagram representing your implementation of the task entity. The purpose of the diagram should be to document the diffent states the entity can go through and the transitions that trigget the changes.
For each of the SOLID principles, provide an example through either a UML diagram or a code listing that showcases the violation of the specific principle. Note: the examples do not need to be sophisticated.
For each of the examples provided for SE-4, provide a refactored solution as either a UML diagram or a code listing that showcases a possible solution respecting the principle violeted. Note: the examples do not need to be sophisticated.
Exercises 4 and 5 could be used in class to further discuss additional examples of the SOLID principles. If you wish to present and discuss your examples discussed in class, I would be happy to include an hour in one of the future lectures. Therefore, if the above sounds interesting, please do not hesitate to contact me. The idea would be to have a brief slot in which you would present your example of one or more of the SOLID principles.
To submit the assignment you need to create a .pdf document using LaTeX containing the answers to the SE questions and a link to a public repository containing your fork of the completed code with the solutions to the C# part.
Members of the triplets should submit the same PDF file to pass the assignments. Make sure all group names and ID are clearly marked on the front page.