C#

Request → Controller → Service → SQL → Map → Return

====================================================

*/

using Microsoft.AspNetCore.Mvc;
using MySql.Data.MySqlClient;

namespace InterviewHelp
{
    // =========================
    // DTO / MODEL
    // =========================
    public class StaffDto
    {
        public int Id { get; set; }
        public string Name { get; set; } = "";
        public string? Phone { get; set; }
    }

    // =========================
    // CONTROLLER (ENTRY POINT)
    // =========================
    [ApiController]
    [Route("api/[controller]")]
    public class StaffController : ControllerBase
    {
        private readonly StaffService _service;

        public StaffController(StaffService service)
        {
            _service = service;
        }

        [HttpGet("search")]
        public async Task<IActionResult> Search(string input)
        {
            // VALIDATE INPUT
            if (string.IsNullOrWhiteSpace(input))
                return BadRequest("Invalid input");

            // CALL SERVICE
            var result = await _service.SearchAsync(input);

            // RETURN RESULT
            return Ok(result);
        }
    }

    // =========================
    // SERVICE (BUSINESS LOGIC)
    // =========================
    public class StaffService
    {
        private readonly string _connectionString = "your_connection_string_here";

        public async Task<List<StaffDto>> SearchAsync(string input)
        {
            var results = new List<StaffDto>();

            /*
            SQL PATTERN:
            SELECT ...
            FROM A
            INNER JOIN B ON ...
            LEFT JOIN C ON ...
            WHERE ...
            */

            var sql = @"
                SELECT 
                    s.ID,
                    s.Name,
                    p.Phone
                FROM staff s
                INNER JOIN phones p ON s.ID = p.StaffID
                WHERE 
                    s.Name LIKE @name
            ";

            // =========================
            // DATABASE EXECUTION
            // =========================
            await using var conn = new MySqlConnection(_connectionString);
            await conn.OpenAsync();

            await using var cmd = new MySqlCommand(sql, conn);

            // PARAMETERIZED QUERY (SECURITY)
            cmd.Parameters.AddWithValue("@name", "%" + input + "%");

            await using var reader = await cmd.ExecuteReaderAsync();

            // MAP RESULTS
            while (await reader.ReadAsync())
            {
                var item = new StaffDto
                {
                    Id = reader.GetInt32("ID"),
                    Name = reader.GetString("Name"),

                    // NULL HANDLING
                    Phone = reader.IsDBNull(reader.GetOrdinal("Phone"))
                        ? null
                        : reader.GetString("Phone")
                };

                results.Add(item);
            }

            return results;
        }

        // =========================
        // UPDATE EXAMPLE
        // =========================
        public async Task<bool> UpdatePhoneAsync(int id, string newPhone)
        {
            var sql = @"
                UPDATE phones
                SET Phone = @phone
                WHERE StaffID = @id
            ";

            await using var conn = new MySqlConnection(_connectionString);
            await conn.OpenAsync();

            await using var cmd = new MySqlCommand(sql, conn);
            cmd.Parameters.AddWithValue("@phone", newPhone);
            cmd.Parameters.AddWithValue("@id", id);

            var rows = await cmd.ExecuteNonQueryAsync();

            return rows > 0;
        }
    }


    // =========================
    // LINQ EXAMPLE
    // =========================
    public class Job
    {
        public string Status { get; set; } = "";
        public int Quantity { get; set; }
        public int CurrentInventory { get; set; }
        public string PartName { get; set; } = "";
    }

    public class JobLogic
    {
        public List<Job> GetLowInventoryJobs(List<Job> jobs)
        {
            return jobs
                .Where(j => j.Status == "Active" && j.CurrentInventory < j.Quantity)
                .OrderBy(j => j.PartName)
                .ToList();
        }
    }