Поддержка  •  Дневник  •  Без рекламы  •  О сайте  •  Реклама  •  Поставить баннер  •  Прислать  •  Хроника  •  Translate  •  Рекомендованное Гости: 5    Участники: 0 Авторизация Авторизация   Регистрация 
Метод Научного Тыка
RULVEN
Поиск  
О сайте, обо всём что меня окружает, интересует, волнует, касается.
«« Следующая Вернуться в список Предыдущая »»

30 января 2023 года, понедельник, 00:50

Заметка #149732

Во дела, в нормальной обстановке, без спешки сделал тест по вакансии как белый человек. Вчера на этот тест после 37 теоретических вопросов оставалось всего 30 минут. Это не дело.

В таком состоянии отослал:

Сегодня всё по красоте:

BankController.cs

using InternetBankingRESTfulService.Api;
using InternetBankingRESTfulService.Api.Core;
using Microsoft.AspNetCore.Mvc;

namespace InternetBankingRESTfulService.Web.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class BankController : ControllerBase
    {
        private InternetBankingApi BankingApi { get; }

        public BankController()
        {
            BankingApi = new InternetBankingApi();
        }

        [HttpGet("api/version")]
        public IActionResult GetApiVersion()
        {
            return Ok(BankingApi.GetApiVersion());
        }

        [HttpGet("api-version")]
        public IActionResult GetApiVersionSecond()
        {
            return Ok(BankingApi.GetApiVersion());
        }

        [HttpGet("api/calc/MD5/{value}")]
        public IActionResult CalculateMD5(string value)
        {
            return Ok(BankingApi.CalculateMD5(Helper.ReplaceDigitsByString(value)));
        }

        [HttpGet("api/calc/{value}/MD5")]
        public IActionResult CalculateMD5Second(string value)
        {
            return Ok(BankingApi.CalculateMD5(Helper.ReplaceDigitsByString(value)));
        }

        [HttpGet("api/password/strong/{value}")]
        public IActionResult PasswordStrong(string value)
        {
            return Ok(BankingApi.IsPasswordStrong(value));
        }

        [HttpGet("api/is-password-strong/{value}")]
        public IActionResult IsPasswordStrong(string value)
        {
            return Ok(BankingApi.IsPasswordStrong(value));
        }
    }
}

InternetBankingApi.cs

using InternetBankingRESTfulService.Api.Core;
using System;

namespace InternetBankingRESTfulService.Api
{
    public class InternetBankingApi : IInternetBankingApi
    {
        private readonly string _apiVersion = $"{DateTime.UtcNow:yyyy.MM.dd}.1.0";

        public string GetApiVersion()
        {
            return _apiVersion;
        }

        public string CalculateMD5(string value)
        {
            return Security.MD5Encode(value);
        }

        public bool IsPasswordStrong(string password)
        {
            return Security.IsPasswordStrong(password);
        }
    }
}

Security.cs

using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Text;
using System;
using System.Linq;

namespace InternetBankingRESTfulService.Api.Core
{
    public static class Security
    {
        /// <summary>
        /// Returns MD5 hash string.
        /// </summary>
        /// <param name="plainText"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static string MD5Encode(string plainText)
        {
            if (string.IsNullOrEmpty(plainText))
                throw new ArgumentException("Text cannot be empty.");

            return string.Concat(MD5.HashData(Encoding.UTF8.GetBytes(plainText)).Select(x => x.ToString("x2"))).ToUpper();
        }

        /// <summary>
        /// Validate password strength.
        /// </summary>
        /// <param name="plainPassword"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        public static bool IsPasswordStrong(string plainPassword)
        {
            if (string.IsNullOrEmpty(plainPassword))
                throw new ArgumentException("Password cannot be empty.");

            return new Regex(@"(?=^.{12,}$)(?=.*\d)(?=.*[!@#$%^&*]+)(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$").IsMatch(plainPassword);
        }
    }
}

Helper.cs

using System.Text.RegularExpressions;

namespace InternetBankingRESTfulService.Api.Core
{
    public static class Helper
    {
        /// <summary>
        /// Replace all digits in value parameter by char.
        /// </summary>
        /// <param name="value"></param>
        /// <param name="replaceNumberBy">Default char value is 'X'.</param>
        /// <returns></returns>
        public static string ReplaceDigitsByString(string value, string replaceDigitBy = "X")
        {
            return Regex.Replace(value, @"\d", replaceDigitBy);
        }
    }
}

ApiTest.cs

using Microsoft.AspNetCore.Mvc.Testing;
using NUnit.Framework;
using System;
using System.Globalization;
using System.Threading.Tasks;

namespace InternetBankingRESTfulService.Tests
{
    public class ApiTest
    {
        [Test]
        public async Task TestApiVersion()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync("/bank/api/version");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual($"{DateTime.UtcNow.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture)}.1.0", data);
        }

        [Test]
        public async Task TestApiVersion_Second()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync("/bank/api-version");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual($"{DateTime.UtcNow.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture)}.1.0", data);
        }

        [Test]
        public async Task TestPasswordStrongIsFalse()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync($"/bank/api/password/strong/123");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual("false", data);
        }

        [Test]
        public async Task TestPasswordStrongIsTrue()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync($"/bank/api/password/strong/ALhj89*19896");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual("true", data);
        }

        [Test]
        public async Task CalculateMD5()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync($"/bank/api/calc/MD5/test-string-ABC");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual("79C8DC4F3BAEBF0A4F40517225F41A86", data);
        }

        [Test]
        public async Task CalculateMD5_SecondURL()
        {
            var factory = new WebApplicationFactory<Startup>();
            var Client = factory.CreateClient();
            var result = await Client.GetAsync($"/bank/api/calc/test-string-ABC/MD5");
            Assert.AreEqual(System.Net.HttpStatusCode.OK, result.StatusCode);
            var content = result.Content;
            var data = await content.ReadAsStringAsync();
            Assert.AreEqual("79C8DC4F3BAEBF0A4F40517225F41A86", data);
        }
    }
}

Мне нравится 0    Мне не нравится 0
Писать комментарии могут только зарегистрированные пользователи.

Логин
Пароль
 
 
новые комментарии сверху

Комментарии: 0
Нет ни одного комментария.
Поделиться ссылкой:
Последние комментарии

Пн 01.07.2024 10:02
Вот и я смотрю, что мрак, вроде все ищут, но при этом никому не нужен и не важно какой опыт работы и уровень работ...
Сб 29.06.2024 07:37
С поиском работы просто мрак. За прошедшие 2 недели у меня 17 пустышек. Сколько посылал заявок везде даже не считаю уже.
Пт 28.06.2024 07:14
Как с поиском работы? Сейчас тоже пытаюсь найти дополнительную подработку по дизайну и скажу это большой челлендж, не смотря на опыт и портфолио.
Ср 19.06.2024 19:50
Спасибо, нелегко всё-таки терять тех кто дорог. Она ушла как-то быстро, меньше чем за неделю. То носилась, была активная, и как-то стало ей плохеть и всё. Ну ей сейчас уже не жарко, не холодно, ни весело ни скучно.
Вт 18.06.2024 09:43
Соболезную...
Сб 15.06.2024 04:11
Два раза подумал и всё оказалось не так просто и однозначно. Идея моего поста в том что в последнее время у меня вынужденно уходит очень много времени на то что не даёт результата. Полезная работа может превратиться в бесполезную....
Чт 13.06.2024 12:42
А-а-а... Точно! Верно подмечено, самый мой случай. И я вот к контексте поиска работы думал что может со мной что не так... А не, почитал статьи, видео посмотрел на эту тему - у большинства 1:1 как со мной. И работу...
Чт 13.06.2024 08:08
Как раз Ты внизу приподнял статью про "Бесполезную работу". Краткая выдержка оттуда: >> Работа должна служить какой-то цели. Если человек убеждается, что она бессмысленна, что он работает ради самой работы, это вызывает у него чувство беспомощности, никчемности, несвободы. Он будто...
Чт 11.04.2024 21:40
Истинную причину всего этого не...
Только для сосайтников. Для просмотра нужно пройти авторизацию.
Ср 10.04.2024 19:41
Не, тут другой имело ввиду....
Только для сосайтников. Для просмотра нужно пройти авторизацию.
Чт 14.03.2024 00:20
Спасибо! У сайта уже есть какая никакая история, надеюсь этот спектакль продолжится без приключений. Интересно посмотреть что тут будет к декабрю 2024. Здесь уже достаточно интересного контента, и хотелось бы его больше. Больше всякого разного. И вообще работы по развитию...
Пн 26.02.2024 15:33
Мои поздравления!
Вт 26.12.2023 09:33
В декабре планирую закончить всякое разное по всему сайту и в январе начать работу над местной микросоциалкой и управлением контентом для пользователей. Надо будет решить, использовать FTP или что-то более модное.
Пн 18.12.2023 23:15
Имею два десятка "Сеповских" бутлегов, помимо официальных релизов. Как откроешь шлюзы на заказчку, можно думать над тем, когда пополнить ими "Черномяч".
Пн 18.12.2023 23:13
Даже как-то неудобно должно быть - давать ссылку на пустую дискографию... =)
Вт 05.12.2023 10:31
Про гороскоп это конечно сильно. Походу у них там HR какая-то девочка в розовом летающая в облаках.
Вс 03.12.2023 02:55
Приветы! Зима выдалась нажористая, снеговиков лепить самое время. Когда буду в Риге, наверное напрошусь затусить в Lido, картоха с шашлыком там моё почтение. И было бы интересно обкашлять будущее блекболыча, проект ведь пиздат. И человеки.
Сб 02.12.2023 14:44
Ждём-с... С наступлением календарной зимы Тебя, Серж! С заснеженным приветом из Кенгарагса!
Вт 21.11.2023 17:40
Насчёт AI это конечно хороший вопрос, ChatGPT мощная штука. И скорее всего можно использовать какие-то плагины для автоматического перевода сайта, а не написания текстов... Но у меня тут другой интерес, написать свою обновлённую версию локализации. JSON, мой маленький технический друг,...
Чт 16.11.2023 15:05
Нельзя ли на перевод подключить какой-нибудь AI? ) Чтобы автоматом переводило не коряво ))
Разработано на основе BlackNight CMS
Release v.2024-07-21
© 2000–2024 Blackball
Дизайн & программирование:
О сайтеРеклама
Visitors
Web-site performed by Sergey Drozdov