• Архитектурный вопрос. Может ли клиент иметь бизнес логику?

    @grinat
    Путаницы нет, проблем в том что в ряде случаев клиенты стали настолько толстыми, что на клиент фактически выкачивается вся бд, потом по хитрой логике она синхронизируется. Как итог при сложных расчетах это все еле шевелится на клиенте, потому что на клиенте не выйдет купить еще плашку с озу либо добавить стойку. Поэтому и пошел тренд на тонкие клиенты. Spa может быть как толстым, когда выкачивается все с сервера, все это может работать оффлайн, когда есть интернет синхронизуется, так и тонким, когда просто получаются данные и отображаются, а за все что сложнее 2+2 отвечает сервер. Но большое приложение никак не выйдет сделать толстым spa, толстым можно сделать приложение на electron.
    Клиент может иметь логику в рамках своей интерактивности, то есть если добавляются товары в корзину, то нет смысла делать отдельный запрос и считать сумму на сервере(при условии что например нет скидки которая зависит от всей истории заказов пользователя за последние годы и нет задачи обеспечить согласованность на всех устройсвах где залогинен польователь и мог паралельно сделать заказы и т.п.). Но за генерацию инвойса с итоговой суммой может отвечать только бакэнд.
    Ответ написан
    Комментировать
  • Архитектурный вопрос. Может ли клиент иметь бизнес логику?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В общем случае может и даже должно, чтобы у клиента не тормозило приложение после каждой кнопки. Но бизнес-логика на клиенте должна быть разрешена только в рамках доверия к клиенту. То есть бекенд отправляет данные и условно готовые формулы на клиент, и он там дальше с ними играется в свое удовольствие. Но когда пользователь хочет закрепить результат в базе данных на беке - тут снова нужно проверять, что пользователь ничего не нахимичил, не ошибся и не является хакером.

    Назвать тонким клиентом можно. Но зависит от того, сколько логики выносится на клиент. Если много, то это уже не тонкий клиент. Например, игра типа шутера - основная логика на сервере, но и на клиенте прилично вычислений.
    Ответ написан
    Комментировать
  • Архитектурный вопрос. Может ли клиент иметь бизнес логику?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Вкратце: Да.

    Подлиннее:
    Путались в определениях люди всегда и будут путаться. Да и сложно как-то взять определение которое было сделано давно для одних технологий и архитектур и натянуть на современные, другие реалии. Можно конечно и ежа на кактус натянуть, но лучше потратить эти усилия на что-то более полезное.
    Даже термин SPA приложение уже не так актуален и не так хорошо ложится на то что сейчас пишут.

    Называйте клиента клиентом, сервер сервером, и этого будет достаточно. Хотя конечно на нерд-вечеринке в конкурсе баззвордов вы возможно проиграете, если это для вас важно.
    Ответ написан
    2 комментария
  • Как маршрутизировать в Angular 6 компоненты на одной странице?

    Создать два роута и один компонент ( с двумя подкомпонентами: регистрация, авторизация )для обеих роутов. В главном компоненте проверять текущий роут и показывать соотвествующий подкомпонент
    Ответ написан
    2 комментария
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    Все красиво объяснил Nkly777, только в блоке PS merge с rebase перепутаны.
    Добавлю картинок.

    git rebase devel - собачка на молнии - "сшивает" коммиты по дате их создания
    (ветка devel "растворяется" в основной ветке)
    518b8dbce1cd4f96b30de9782ae38fcd.png
    git merge devel - пожарная лестница, все коммиты ветки devel крепятся в конец, образуется пересечение
    (devel остается отдельной веткой, к которой можно вернуться)
    1ba8186d879d46ff85ea7c1e192328e2.png
    git chery-pick idea - забрать коммиты из ветки idea
    2717e3091f644ef2954aa2de4514f446.png
    Ответ написан
    2 комментария
  • Как оптимизировать ответ сервера (Spring boot 2 API) в формате JSON?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    В вашем случае наверное подошел бы GraphQL - вот вводная статья https://habr.com/post/326986/
    А вот имлементация на java - https://github.com/graphql-java/graphql-java
    А вот статья для spring - www.baeldung.com/spring-graphql
    Ответ написан
    Комментировать
  • Angular 5 JWT где хранить роли пользователя? Каким образом проверять?

    dasha_programmist
    @dasha_programmist
    ex Software Engineer at Reddit TS/React/GraphQL/Go
    храни в сторе (ngrx-store), при старте приложения у тебя читается JWT токен и: в самом токене список ролей или делаешь запрос и потом всё это пушишь в стор
    Ответ написан
    Комментировать
  • Angular 5 JWT где хранить роли пользователя? Каким образом проверять?

    StivinKing
    @StivinKing
    Есть несколько вариантов. Но какой бы способ вы не использовали, всё что на фронте, может передать под себя, и открыть те же недоступные кнопки, которые не подходят под роль. Поэтому всегда нужно делать проверку на бэке

    Из вариантов, это хранение в куках, глобально в сервисе, в нужных местах делать запрос на back и получать разрешение или запрет. Самое главное еще не передавать никогда список ролей. Никто не должен знать какие роли существуют.

    Можно написать директиву, вроде:
    Директива по отображению элементов в интерфейсе в зависимости от роли
    @Directive({ selector: '[hasRole]' })
    export class HasRoleDirective implements OnInit {
      @Input() hasRole: string[] | string | undefined;
    
      constructor(private _viewContainer: ViewContainerRef,
                  private _template: TemplateRef<any>) {
      }
    
      ngOnInit(): void {
        this._checkRoles(GlobalService.userRole);
      }
    
      private _checkRoles(userRole: string): void {
        if (!this.hasRole || this.hasRole === 'undefined' || this.hasRole.indexOf(userRole) !== -1) {
          this._viewContainer.createEmbeddedView(this._template);
        } else {
          this._viewContainer.clear();
        }
      }
    }


    Можете переписать данную директиву под себя. То есть при открытии страницы делать запрос на backend получать разрешение/запрет на просмотр элементов и с помощью этой директивы, расставленной на определенные элементы, контролировать отображение
    Ответ написан
    Комментировать