This is a simple time logger web application developed as part of the recruitment process for e-conomic. The application is designed to address the following user stories:
-
As a freelancer, I want to be able to register how I spend time on my projects, so that I can provide my customers with an overview of my work.
-
As a freelancer, I want to be able to get an overview of my time registrations per project, so that I can create correct invoices for my customers.
-
As a freelancer, I want to be able to sort my projects by their deadline, so that I can prioritize my work.
- .NET Core v3.1
- OpenAPI (Swagger) - can be found in
localhost:3001/docs
- Clean Architecture: The backend is structured using Clean Architecture principles, which promotes separation of concerns and maintainability.
- CQRS: Command Query Responsibility Segregation is implemented to segregate the read and write operations, improving scalability and performance.
- Unit and Integration Tests: While not every functionality is covered by tests, a few unit and integration tests have been included to showcase testing skills.
- Small Controller actions: Every Controller Action is really small (four lines maximum).
- Clone the repository.
- Navigate to the
serverdirectory. - Run
dotnet restoreto restore dependencies. - Run
dotnet buildto build the project. - Run
dotnet run --project TimeLogger.WebApito start the backend server.
- Every case from the acceptance criteria was implemented.
- A few Integration tests from the Presentation Web App can be found in the TimeLogger.WebApi.Tests project
- A few Unit Tests from the Application can be found in the TimeLogger.Application.Tests project
- React
- Next.js
- Tailwindcss
- TypeScript
- cypress (E2E)
- jest (unit test)
- React with Next.js: Next.js is chosen to leverage server-side rendering (SSR) and proper error handling, enhancing user experience.
- Testing: Although not every functionality is covered, a few end-to-end (E2E) and unit tests have been included in the source code.
- Navigate to the
clientdirectory. - Create a
.envfile from the.env.examplefile - Run
npm installto install dependencies. - Run
npm run devto start the development server.
- Every case from the acceptance criteria was implemented.
- A few E2E tests can be found in the /client/cypress directory
- A few Unit Tests can be found in the /client/cypress directory
- Authentication: Authentication has been omitted for simplicity, assuming the application is already authenticated.
- Database: Data is hardcoded in the appropriate places within the application as if it were coming from a database.
All the following functionalities were added, even though not being required initially
While loading a list of resources, it is possible to get paginated results. pageNumber and pageSize properties can be passed in the request to determine the page number to load and the number of items to get. The default value for pageSize is 500, because... we have to limit it somehow to make it scalable.
GET /api/customers?pageNumber=1Search is also implemented while loading a list or resources through search get param.
/api/customers?search=fooGET /api/customers?pageNumber=1While being arguable if it fits well for any kind of project, soft delete was included in this project. It allow any delete to not delete the entity, but instead update it to consider a timeDeleted property. While loading a resource list, it is possible to load also records that were soft deleted before.
/api/customers?considerDeleted=falseOpen API was included in the Back-end, so that users can see the API contracts and try a few requests through that. It can be found on http://localhost:3001/docs after running Back-end.