using eprintServer.Data; using eprintServer.Entities; using eprintServer.Requests; using Microsoft.EntityFrameworkCore; namespace eprintServer.Services; public class ContactService { private readonly DataContext _context; // Cache to hold the single instance ID in memory after the first load private static int? _uniqueContactId = null; public ContactService(DataContext context) { _context = context; } /// /// Ensures a single instance of ContactSettings exists and retrieves it, /// creating a default one if none is found. /// public async Task GetOrInitializeContactSettingsAsync() { ContactSettings? settings; // 1. Try to load by cached ID if (_uniqueContactId.HasValue) { settings = await _context.ContactSettings.FirstOrDefaultAsync(c => c.Id == _uniqueContactId.Value); if (settings != null) { return settings; } } // 2. If not found, perform a full search settings = await _context.ContactSettings.FirstOrDefaultAsync(); if (settings == null) { // 3. Create a new instance with empty defaults and save it settings = new ContactSettings { Email = string.Empty, Phone = string.Empty, Address = string.Empty, MapUrl = string.Empty, WorkingHours = string.Empty, EmailRecipients = new List() }; _context.ContactSettings.Add(settings); await _context.SaveChangesAsync(); } // 4. Cache the ID _uniqueContactId = settings.Id; return settings; } /// /// Updates the existing unique ContactSettings instance, /// only applying updates for non-null properties in the request. /// public async Task UpdateContactInfoAsync(UpdateContactInfoRequest request) { var settings = await GetOrInitializeContactSettingsAsync(); bool changed = false; // Apply conditional updates: update only if the request property is not null if (request.Email != null) { settings.Email = request.Email; changed = true; } if (request.Phone != null) { settings.Phone = request.Phone; changed = true; } if (request.Address != null) { settings.Address = request.Address; changed = true; } if (request.MapUrl != null) { settings.MapUrl = request.MapUrl; changed = true; } if (request.WorkingHours != null) { settings.WorkingHours = request.WorkingHours; changed = true; } if (changed) { settings.UpdatedAt = DateTime.UtcNow; _context.ContactSettings.Update(settings); await _context.SaveChangesAsync(); } return settings; } /// /// Adds a unique email to the recipient list. /// public async Task AddEmailRecipientAsync(string email) { var settings = await GetOrInitializeContactSettingsAsync(); // Check if email is already present (case-insensitive) if (!settings.EmailRecipients.Any(e => e.Equals(email, StringComparison.OrdinalIgnoreCase))) { settings.EmailRecipients.Add(email); settings.UpdatedAt = DateTime.UtcNow; _context.ContactSettings.Update(settings); await _context.SaveChangesAsync(); } return settings; } /// /// Removes an email from the recipient list. /// public async Task RemoveEmailRecipientAsync(string email) { var settings = await GetOrInitializeContactSettingsAsync(); // Remove the email (case-insensitive) int initialCount = settings.EmailRecipients.Count; settings.EmailRecipients.RemoveAll(e => e.Equals(email, StringComparison.OrdinalIgnoreCase)); if (settings.EmailRecipients.Count != initialCount) { settings.UpdatedAt = DateTime.UtcNow; _context.ContactSettings.Update(settings); await _context.SaveChangesAsync(); } return settings; } }