Ответы пользователя по тегу Проектирование программного обеспечения
  • Как должна работать интеграция VK ID в SPA в описанном случае?

    nykakdelishki
    @nykakdelishki
    Системный аналитик
    Еще как вариант редиректить пользователя с QUERY параметром

    Наипростейшая реализация на GO

    func YandexRedirectHandler(w http.ResponseWriter, r *http.Request) {
    	url := configs.OauthConfig.AuthCodeURL("state", oauth2.AccessTypeOffline)
    	http.Redirect(w, r, url, http.StatusTemporaryRedirect)
    }
    
    func YandexCallbackHandler(w http.ResponseWriter, r *http.Request) {
    	code := r.FormValue("code")
    
    	token, err := configs.OauthConfig.Exchange(r.Context(), code)
    	if err != nil {
    		http.Error(w, "Failed to exchange token", http.StatusInternalServerError)
    		return
    	}
    
    	resp, err := http.Get("https://login.yandex.ru/info?format=json&oauth_token=" + token.AccessToken)
    	if err != nil {
    		http.Error(w, "Failed to get user info", http.StatusInternalServerError)
    		return
    	}
    	defer resp.Body.Close()
    
    	var userinfo struct {
    		ID        string `json:"id"`
    		FirstName string `json:"first_name"`
    		LastName  string `json:"last_name"`
    		Email     string `json:"default_email"`
    	}
    
    	err = json.NewDecoder(resp.Body).Decode(&userinfo)
    	if err != nil {
    		http.Error(w, "Failed to decode user info", http.StatusInternalServerError)
    		return
    	}
    
    	// 1 означает яндекс
    	userID := store.GetUserID(r.Context(), userinfo.ID, 1)
    
    	println(userID)
    	// Если не найден
    	if userID == "" {
    		// Register the user in the database
    		err = store.CreateUser(r.Context(), userinfo.ID, userinfo.FirstName, userinfo.LastName, userinfo.Email, 1)
    		if err != nil {
    			http.Error(w, "Failed to register user", http.StatusInternalServerError)
    			return
    		}
    	}
    
    	// Генерация JWT токена
    	tokenString, err := oauth.GenerateToken(userID)
    	if err != nil {
    		http.Error(w, "Failed to generate JWT token", http.StatusInternalServerError)
    		return
    	}
    
    	http.Redirect(w, r, "http://localhost:3000/login?token="+tokenString, http.StatusTemporaryRedirect)
    }


    Ну положить токен в куки из QUERY на SPA думаю справишься
    Ответ написан
  • Что не так с этой Диаграммой IDF0?

    nykakdelishki
    @nykakdelishki
    Системный аналитик
    IDEF0 используется для описания процессов классического ватерфолла (Вам точно это нужно?) и в нем не очень удобно указывать всякие развилки, которые возможно нужны для понимания процесса.

    Диаграмма сделана не правильно, а именно:
    1. Нет такого процесса как "фитнес клуб", возможно имелось ввиду "осуществление деятельности фитнес клуба".
    2. Входы как правило информация/расходные материалы необходимые для процесса => регистрация, авторизация не являются входами в этот процесс. В вашем случае возможно должно было креды, деньги клиента etc
    3. Механизмы (стрелочка снизу-вверх) тут указываются, то "Чем" вы выполняете процесс. В вашем случае это ПК менеджера, Сайт etc
    4. Управления (стрелочка сверху-вниз) тут указывается, то "Что вас ограничивает". При выполнения процессов вас не будет ограничивать "Карьера". В вашем случае будет, что то типо "Законодательство", "Должностные инструкции", "Фитнес программа"(если она обязательна к выполнению).
    5. idef0 выполняется минимум в 2 диаграммах (помимо вашей нужна еще минимум 1 диаграмма декомпозиций(там от 3 до 6 подпроцессов), и делается в первую очередь она, на контекстную(если правильно помню название))
    Подпроцессы в вашем случае в idef0(!) будут что то типо:
    1 этап. Авторизация клиента на сайте
    2 этап. Выбор услуги (всегда(!), он не может после авторизации выйти/посмотреть что то)
    3 этап. Оплата услуги
    4 этап. Оказание услуги (этот процесс можно еще декомпозировать и т.д.)
    и все это можно декомпозировать на различные подпроцессы

    Задайтесь в первую очередь вопросом, что вы хотите показать диаграммой.
    В вашем случае, могу порекомендовать присмотреться к BPMN (перед созданием диаграммы желательно хотя бы видео на ютубе посмотреть).

    P.S Сделать из всей нотации правильно только выходы это надо постараться
    Ответ написан
    Комментировать
  • Как корректнее всего организовать структуру хранения информации об заявке?

    nykakdelishki
    @nykakdelishki
    Системный аналитик
    Мастхев тут кнч документоориентированные(из-за того что заявка в вашем случае это по факту документ) базы данных

    Однако Заявки(id, type,..., body(json)) будет работать тоже норм. Антон Жиянов, если не изменяет память, в подлодке(выпуск SQL) полгода назад как раз рассказывал, про что такое.

    В вашем случае отталкивайтесь от уровня навыков работы с этими БД.
    Ответ написан
    Комментировать
  • GRPC или RabbitMQ что лучше использовать для взаимодействия между API Gateway и микросервисами?

    nykakdelishki
    @nykakdelishki
    Системный аналитик
    Это два совершенно разных подхода не исключающих друг друга.
    Один используется для синхронного получения данных, второй для асинхронного.

    gRPC быстрее(приблизительно в 5 раз) REST за счет протокола передачи, это весомое преимущество в больших проектах. Но он не может общаться с фронтом.

    RabbitMQ же идеально подходит для асинхронного(не исключая синхрон, но если делаешь синхрон на брокерах нужно понимать зачем ты это делаешь) взаимодействия (например для сборов логов), он уступает по многим параметрам Kafka, но для маленьких/средний проектов с EDA идеален.

    Если это Pet проект рекомендую попробовать оба.
    Ответ написан
  • Как лучше возвращать ошибку API?

    nykakdelishki
    @nykakdelishki
    Системный аналитик
    Вот тут можешь глянуть как правильно отвечать на ошибки: https://www.rfc-editor.org/rfc/rfc7807

    Пример:
    HTTP/1.1 500 Internal server error
    
    {
       title: "Database connection error",
       error: "Failed to connect to the database [name]",
       request: "POST www.habr.com/post",
       time: "11.11.2023 ...",
       errorTraceID "uuid"
       ... и что-нибудь свое если нужно типа код ошибки и прочего
    }

    Коды ответа можно глянуть тут: https://developer.mozilla.org/en-US/docs/Web/HTTP/...

    А дальше нужно уже на фронте выводить инфу в зависимости от кода ошибки и/или поля title в ошибке
    Ответ написан
    Комментировать