Задать вопрос
  • Как правильно реализовать проверку токена эквайринга Tinkoff?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Dictionary ничего не гарантирует, если хотите сами сортировать элементы, то используйте OrderedDictionary, но лучше всего в вашем случае будет использовать SortedDictionary
    Но так как вам надо именно значение пар сконкатенировать, то лучше будет сделать так
    var sortedValues = dataForToken.OrderBy(pair => pair.Key).Select(pair => pair.Value);
    var concatenatedString = string.Join("", sortedValues);
    Ответ написан
    Комментировать
  • Зачем делать прокси на pm2?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Всё довольно просто. NGINX - это веб-сервер, а PM2 - менеджер процессов Node.js.
    NGINX умеет работать с доменами, поддоменами, умеет делать маршрутизацию определённых роутов к определённым сервисам, в него легко добавить сертификаты SSL/TLS для HTTPS/HTTP2. PM2 ничего этого не умеет, потому что он не является веб-сервером, он буквально просто управляет процессами Node.js, всё остальное остаётся либо на разработчике, либо на frontend-сервере (напр. NGINX). Если не использовать NGINX или другой frontend-сервер, то вам придётся писать работу с доменами, как-то отдавать статику, например, клиентское приложение (HTML, CSS, JS, картинки и тд), подключить сертификаты к node.js приложению, думать, как поддерживать несколько портов (80/443). В конце концов это просто небезопасно, все процессы, которые прослушивают порты до 1000, должны иметь особые привилегии, если в вашем коде найдут дыру, то смогут исполнить любой код с этими самыми привилегиями, что может оказаться очень плачевно. А в схеме с nginx ваши процессы node.js могут быть запущены на более высоких портах (1000+) и запускаться от имени пользователя, у которого минимальные права, и если хакер и найдёт дыру в вашем приложении, полностью захватить сервер не сможет. За дырами в безопасности nginx следят очень многие люди и компании, поэтому их относительно быстро закрывают, а в вашем приложении следите за ними только вы.
    Ответ написан
    Комментировать
  • Как написать Dockerfile для asp.net приложения с такой архитектурой?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    У вас проблема в зависимостях
    Даже по логу вам говорится:
    /app/server_app.Domain/Model/Queries/ProductCategoryCreateQuery.cs(3,17): error CS0234: The type or namespace name 'AspNetCore' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?) [/app/server_app.Domain/server_app.Domain.csproj]


    А конкретно проблема в этом
    server_app/server_app.Domain/server_app.Domain.csproj
    <ItemGroup>
            <Reference Include="FluentValidation">
                <HintPath>..\..\..\..\.nuget\packages\fluentvalidation\11.11.0\lib\net8.0\FluentValidation.dll</HintPath>
            </Reference>
            <Reference Include="Microsoft.AspNetCore.Http.Abstractions">
                <HintPath>..\..\..\..\.nuget\packages\microsoft.aspnetcore.app.ref\8.0.8\ref\net8.0\Microsoft.AspNetCore.Http.Abstractions.dll</HintPath>
            </Reference>
            <Reference Include="Microsoft.AspNetCore.Http.Features">
                <HintPath>..\..\..\..\.nuget\packages\microsoft.aspnetcore.app.ref\8.0.8\ref\net8.0\Microsoft.AspNetCore.Http.Features.dll</HintPath>
            </Reference>
            <Reference Include="Microsoft.AspNetCore.Mvc.Abstractions">
                <HintPath>..\..\..\..\.nuget\packages\microsoft.aspnetcore.app.ref\8.0.8\ref\net8.0\Microsoft.AspNetCore.Mvc.Abstractions.dll</HintPath>
            </Reference>
            <Reference Include="Microsoft.AspNetCore.Mvc.Core">
                <HintPath>..\..\..\..\.nuget\packages\microsoft.aspnetcore.app.ref\8.0.8\ref\net8.0\Microsoft.AspNetCore.Mvc.Core.dll</HintPath>
            </Reference>
            <Reference Include="Microsoft.IdentityModel.Tokens">
                <HintPath>..\..\..\..\.nuget\packages\microsoft.identitymodel.tokens\7.1.2\lib\net8.0\Microsoft.IdentityModel.Tokens.dll</HintPath>
            </Reference>
            <Reference Include="Npgsql.EntityFrameworkCore.PostgreSQL">
              <HintPath>..\..\..\..\.nuget\packages\npgsql.entityframeworkcore.postgresql\9.0.2\lib\net8.0\Npgsql.EntityFrameworkCore.PostgreSQL.dll</HintPath>
            </Reference>
        </ItemGroup>


    Вы буквально указали путь к конкретным dll на вашем компьютере, и из-за этого в докер они не попадают, а dotnet restore их просто игнорирует. Эти зависимости должны быть в общем списке, как в блоке ItemGroup ниже этого, но проблема на самом деле куда глобальнее.

    Как я понимаю, вы только изучаете DDD, и сделали самую фатальную ошибку в дизайне, Domain не должен отвечать за БД, JWT, модели, DTO и тд. Domain должен концентрировать именно бизнес-сущности и бизнес-логику (Entities & Buisness Services). Application слой уже отвечает за сценарии использования приложения (CQRS или Use Cases, которые оперируют сущностями/сервисами из Domain, а для инфраструктурных моментов использует интерфейсы - dependency inversion). Инфраструктурный слой реализует интерфейсы из Application слоя, например, репозитории бд, http-клиенты и тд, соответственно в нём концентрируется вся работа с БД и другими внешними сервисами. Presentation слой отвечает за представления, это может быть ASP.NET Core API. В таком случае, здесь уже используются модели, JWT, вызов Use Cases из слоя Application, в общем всё, что касается предоставления API.

    Это если очень коротко, тема довольно обширная и сложная.
    Советую вам почитать:
    Мартин Роберт - Чистая архитектура. Искусство разработки программного обеспечения
    Эрик Эванс - Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем

    Также именно для C# есть прекрасный пример проекта с использованием подходов CA и DDD, изучите его, необязательно делать всё под копирку, но полезным точно будет.

    Удачи Вам!
    Ответ написан
    1 комментарий
  • Как создать игру под телеграм на Unity?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Для Telegram Mini Apps не стоит, там по сути открывается обычная веб-страница. В Unity есть рендеринг через WebGL, который в движке довольно толстый и Unity официально не поддерживает мобильные устройства для таких проектов. Они обещают улучшить перформанс в следующей релизной версии, но нужно еще ждать.
    Попробуйте использовать HTML, CSS, JS. Если нужно чуть больше, то посмотрите в сторону pixi.js. А в случае 3D, то three.js
    Ответ написан
    Комментировать
  • Как работать с Newtonsoft.JsonConvert.PopulateObject()?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    К сожалению, PopulateObject в случае списка может только добавлять новые элементы. Можете попробовать реализовать свой Populate, в принципе для этого можно использовать JsonTextReader

    Либо же откажитесь от Populate, сделайте DTO-класс с теми же полями, но nullable, и делайте маппинг руками.

    Что-то типа такого:
    [Serializable]
    public class LevelsConfigDto
    {
        [JsonProperty("version")] public int? Version { get; set; }
        [JsonProperty("levelParams")] public List<LevelParam>? LevelParams { get; set; }
    }
    
    public static void MepLevelsConfig(LevelsConfig target, LevelsConfigDto source)
    {
        if (source.Version != null)
        {
            target.Version = source.Version;
        }
    
        if (source.LevelParam != null)
        {
            var count = Math.Min(target.LevelParam.Count, source.LevelParam.Count);
    
            for (int i = 0; i < count; i++)
            {
                target.LevelParam[i].Steps = source.LevelParam[i].Steps;
                target.LevelParam[i].Complexity = source.LevelParam[i].Complexity;
            }
    
            if (source.LevelParam.Count > target.LevelParam.Count)
            {
                for (int i = target.LevelParam.Count; i < source.LevelParam.Count; i++)
                {
                    target.LevelParam.Add(source.LevelParam[i]);
                }
            }
        }
    }
    Ответ написан
    Комментировать
  • Почему docker-compose up -d к имени контейнера стал добавлять hash?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    По умолчанию, он берёт в качестве префикса имя директории, в которой находится docker-compose файл. Если по каким-то причинам не смог, берёт хеши. Префикс обязательная часть имени контейнеров в docker-compose. Но префикс можно изменить:
    docker-compose -p YourPrefix up
    Ответ написан
    Комментировать
  • Как сделать так чтобы vscode видел node_modules в контейнере docker?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Никак, если хотите нормальный автокомлит (+ запуск линтера и прочие dev штуки), то нужно иметь node_modules
    Ответ написан
  • Как использовать один и тот же код для создания и редактирования данных в контроллере?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Зависит от много кода. Если там валидация, то вынести это в валидаторы. Если там какая-то бизнес-логика, то в сервисы/модели.
    Ответ написан
    Комментировать
  • Как узнать общее количество посещений моего сайта?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Если мы берём именно посещение без идентификации пользователя, то сойдёт обычный счётчик.
    UPDATE metrics SET counter = counter + 1
    Если именно по пользователям, то определяем параметры (IP-адрес, User-Agent браузера, сессионные куки). Создаём таблицу под них и при посещении сайта добавляем запись в эту таблицу, если такой записи нет. И COUNT всех записей и будет кол-вом посетителей. Но проще и лучше будет добавить готовые метрики (Google AdWords, Яндекс Метрика и тд).
    Ответ написан
    Комментировать
  • Как можно изменить параметр объявленной константы, не перезаписывая её?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Так как библиотека не предоставляет способов менять язык, то нужно удалять этот блок и создавать заново с новыми параметрами
    Ответ написан
    Комментировать
  • Почему выводит неправильно?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Не помогло, потому что это \/ эквивалентно /. В этом нет ничего страшного. Но если вас это беспокоит, то вот
    json_encode($obj, JSON_UNESCAPED_SLASHES);
    Ответ написан
    Комментировать
  • Как запретить tsc компилятору, создавать копию файла с .js расширением?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    tsc - это транспилятор. Его дело TypeScript компилировать в JavaScript, но не более. Если вы хотите просто сразу запускать TypeScript, например, для разработки, то можно использовать ts-node. Так же если вас именно раздражает, что именной в той же директории, то через tsconfig можно указать output-директорию, где как раз и будут лежать js-файлы.
    Ответ написан
  • Webpack: как автоматически трансформировать img -> picture?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Вот, что нашёл по конвертации картинок.
    https://stackoverflow.com/questions/58827843/webpa...
    А вот замену тега надо ручками, например, в WebStorm можно через Ctrl+Shift+R (замена во всех файлах по пути)
    Ответ написан
  • Почему возвращает text/html вместо application/json?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Попробуйте добавить HTTP-заголовок
    Accept: application/json
    Ответ написан
    2 комментария
  • Как использовать модальное окно Bootstrap динамически с помощью Vue?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Может для Bootstrap во Vue использовать готовую обёртку?
    https://bootstrap-vue.org/docs/components/modal
    Ответ написан
    3 комментария
  • Как докачать файл?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Первое, что пришло в голову.
    byte[] buffer1 = await webClient.DownloadDataTaskAsync(firstUrl);
    byte[] buffer2 = await webClient.DownloadDataTaskAsync(secondUrl);
    
    using (FileStream stream = new FileStream("file.data", FileMode.Create))
    {
        stream.Write(buffer1, 0, buffer1.Length);
        stream.Write(buffer2, 0, buffer2.Length);
    }


    Так же на просторах stackoverflow можно найти более производительные по памяти решения, когда через DownloadFileAsync уже два файла скачали, их обьединить:
    string[] urls = { /* URL адреса файлов */ };
    string[] filesNames = { /* имена файлов */ };
    
    // параллельно скачиваем файлы
    await Task.WhenAll(urls.Select((url, i) => webClient.DownloadFileTaskAsync(url, filesNames[i])));
    
    // открываем на запись первый файл
    using (Stream resultFileStream = File.OpenWrite(filesNames[0]))
    {
        // открываем на чтение второй файл
        using (Stream fileStream = File.OpenRead(filesNames[1]))
        {
            // копируем поток байтов из второго файла в первый
            fileStream.CopyTo(resultFileStream);
        }
    }
    
    // удаляем второй файл
    File.Delete(filesNames[1]);
    Ответ написан
    3 комментария
  • Как отобразить php файл в ответ на get-запрос в NodeJS?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Если вам очень надо именно рендерить PHP, то можете запускать процесс php about.php и перехватывать стандартный вывод. У вас не будет доступа к информации запроса, но вы можете через аргументы передать нужную вам информацию php about.php firstname lastname

    P.S. Всё же не надо так делать, вы создаёте себе много проблем, а PHP вам ну никак тут не нужен. В конце концов вы можете использовать EJS, если вам нужна супер-пупер логика в темплейте.
    Ответ написан
    Комментировать
  • Как сократить код JS?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    for (let i = 1; i <= 7; i++ ) {
      document.querySelectorAll(`.value${i} [class^=line]`).forEach(div => {
        document.querySelector(`.value${i} .${div.className}`).classList.add('visible');
      });
    }
    Ответ написан
    Комментировать
  • Можно ли в Model хранить логику расчетов?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Какие-то небольшие параметры можете в геттерах сделать. А так бизнес логика должна быть как минимум в сервисах.
    Ответ написан
  • Как установить и использовать Fomantic-ui-less в Laravel?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Так импортируйте в основной less-файле этот fomantic, и используйте, как вам надо. А если у вас нет стилей вообще, то создайте главный файл в нужной папке и в webpack.mix.js укажите, что хотите билдить этот файл.

    https://laravel-mix.com/docs/6.0/less
    Ответ написан