using Microsoft.EntityFrameworkCore; using System; using System.Linq; using System.Threading.Tasks; using Timeline.Entities; using Timeline.Models.Validation; namespace Timeline.Services { internal static class DatabaseExtensions { private static readonly UsernameValidator usernameValidator = new UsernameValidator(); /// /// Check the existence and get the id of the user. /// /// The username of the user. /// The user id. /// Thrown if is null. /// Thrown if is of bad format. /// Thrown if user does not exist. internal static async Task CheckAndGetUser(DbSet userDbSet, string? username) { if (username == null) throw new ArgumentNullException(nameof(username)); var (result, message) = usernameValidator.Validate(username); if (!result) throw new UsernameBadFormatException(username, message); var userId = await userDbSet.Where(u => u.Name == username).Select(u => u.Id).SingleOrDefaultAsync(); if (userId == 0) throw new UserNotExistException(username); return userId; } } }