Skip to content

profjordanov/JJ-Online-Store

Repository files navigation

JJ Online Store

A product catalog website with custom design.

Features

What's special about this specific implementation is that it employs a different approach on error handling and propagation. It uses the Maybe and Either monads to enable very explicit function declarations and allow us to abstract the conditionals and validations into the type itself.

This allows you to do cool stuff like:

public Task<Option<UserServiceModel, Error>> LoginAsync(CredentialsModel model) =>
    GetUser(u => u.Email == model.Email)
        .FilterAsync(user => UserManager.CheckPasswordAsync(user, model.Password), "Invalid credentials.".ToError())
        .MapAsync(async user =>
        {
            var result = Mapper.Map<UserServiceModel>(user);
            await SignInManager.SignInAsync(user, isPersistent: false);
            return result;
        });

You can read more about Maybe and Either here and here.

Architecture:

  • AutoMapper
  • EntityFramework Core with SQL Server and ASP.NET Identity
  • File logging with Serilog
  • Neat folder structure
├───Web
│   ├───JjOnlineStore.Web
│   └───JjOnlineStore.Web.Infrastructure
├───Services
│   ├───JjOnlineStore.Services.Business
│   ├───JjOnlineStore.Services.Data
│   └───JjOnlineStore.Services.Core
├───Data
│   ├───JjOnlineStore.Data.EF
│   ├───JjOnlineStore.Data.Entities
│   └───JjOnlineStore.Data
├───JjOnlineStore.Common
├───JjOnlineStore.Extensions
└───Tests
    └───JjOnlineStore.Tests
  • Thin Controllers
/// POST: /Account/Login
/// <summary>
/// Login.
/// </summary>
[HttpPost]
public async Task<IActionResult> Login(CredentialsModel model)
    => (await _usersService.LoginAsync(model))
        .Match(RedirectToLocal, ErrorLogin);
  • Database Transactions
  • Database Triggers
  • Using Azure Websites and Azure Blob Storage
  • Integrated Azure Enterprise Productivity Chatbot
  • Integrated Azure SendGrid Email Service

alt text

User Interface and User Experience (UI & UX)

  • Mobile-First Responsive Design
  • Using custom web design
  • Followed the best practices for high-quality HTML and CSS: good formatting, good code structure, consistent naming, semantic HTML, correct usage of classes, etc.
  • Works correctly in the latest HTML5-compatible browsers: Chrome, Firefox, Edge, Opera, Safari
  • Preloader

Test Suite

  • xUnit
  • Autofixture
  • Moq
  • Shouldly
  • Arrange Act Assert Pattern

Achievements

  • Excellent grade in C# MVC Frameworks - ASP.NET Core course with trainer : Nikolai Kostov.

alt text