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
server
directory. - Run
dotnet restore
to restore dependencies. - Run
dotnet build
to build the project. - Run
dotnet run --project TimeLogger.WebApi
to 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
client
directory. - Create a
.env
file from the.env.example
file - Run
npm install
to install dependencies. - Run
npm run dev
to 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=1
Search is also implemented while loading a list or resources through search
get param.
/api/customers?search=foo
GET /api/customers?pageNumber=1
While 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=false
Open 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.