Source: Common/Controllers/CommonUserController.cs

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PublicAPI.Common.Extensions;
using PublicAPI.Common.Services;
using PublicAPI.Specific.Services;
using PublicAPI.Specific.Models;
using System.Data;
using HandlebarsDotNet.Helpers.BlockHelpers;
using System.Globalization;

namespace PublicAPI.Common.Controllers {
    [Authorize]
    [ApiController]
    [Route("api/[controller]")]

    /**
      * Common user controller (common methods for getting data related to current user)   
      * @module UserController
    */
    public class CommonUserController : Controller {
        private readonly AppOptions _options;
        private readonly Db _db;
        private readonly IDistributedCache _cache;
        private readonly ILogger<CommonUserController> _logger;
        private readonly CurrentUserInfo _currentUserInfo;
        private readonly MailService _mailService;
#if DEBUG
        const string imageDir = "C:/AI4ASoilHealth/uploads/";
#else
        const string imageDir = "/uploads/"; 
#endif

        /**
         * Constructor
         */
        public CommonUserController(IOptions<AppOptions> options, Db db, IDistributedCache cache, ILogger<CommonUserController> logger, CurrentUserInfo currentUserInfo, MailService mailService) {
            _options = options.Value;
            _db = db;
            _cache = cache;
            _logger = logger;
            _currentUserInfo = currentUserInfo;
            _mailService = mailService;
        }

        [HttpGet("ClearCache")]
        public async Task<ActionResult> ClearCache() {
            await _cache.ClearAll();
            return Ok();
        }

        [HttpGet("GetIcons")]
        public async Task<ActionResult> GetIcons() {
            var ret = await Icons.GetIcons();
            return Ok(ret);
        }

        [HttpGet("RefreshIcons")]
        public async Task<ActionResult> RefreshIcons() {
            await Icons.RefreshIcons();
            return Ok();
        }

        [HttpGet("GetEmojis")]
        public async Task<ActionResult> GetEmojis() {
            var ret = await Emojis.GetEmojis();
            return Ok(ret);
        }

        [AllowAnonymous]
        [HttpGet("RefreshEmojis")]
        public async Task<ActionResult> RefreshEmojis() {
            await Emojis.RefreshEmojis();
            return Ok();
        }

        [HttpPut("SetHelp/{name}")]
        public async Task<ActionResult> SetHelp(string name, [FromBody] Dictionary<string, string> d) {
            var help = d["help"];
            var ret = await _db.QueryAsync("meta.set_help", new { Name = name, _currentUserInfo.LangId, Help = help, }, _options.ConnectionString);
            return Ok(ret);
        }

        [HttpPost("ImportExcel")]
        public async Task<ActionResult> ImportExcel() {
            try {
                
                var ms = new MemoryStream();
                var file = Request.Form.Files[0];
                var fileName = file.FileName;
                file.CopyTo(ms);


                var ret = await _db.ImportExcel(fileName, ms, Request.Form["params"], _options.ConnectionString);
                
                if (ret != null && ret.Contains("error")) {
                    return BadRequest(ret);
                } else {
                    return Ok(ret);
                }
            } catch (Exception e) {
                return BadRequest(e.Message);
            }
        }

        [HttpPost("ContactUs")]
        public async Task<ActionResult> ContactUs([FromBody] Dictionary<string, string> d) {
            
            var ret = await _db.QuerySingleAsync("SELECT contact_provider_id, contact_mail FROM meta.app", null, _options.ConnectionString, cmdType : CommandType.Text);
            if (Helper.IsError(ret)) return Ok(ret);

            JObject json = JObject.Parse(ret);
            JToken root = json;
            
            int provider_id = root["contact_provider_id"].Value<int>();
            string contact_mail =root["contact_mail"].ToString();
            var subject = d["subject"];
            subject += " # " + d["email"] + " # " + _currentUserInfo.PersonId.ToString();
            ret = await _mailService.SendMail(null, null, 0, provider_id, null, null, subject, d["message"], contact_mail);
            if (Helper.IsError(ret)) return Ok(ret);
            return Ok();
        }
    }
}