package handlers import ( "encoding/json" "fmt" "io" "log" "net/http" "pocketbaseSigner/config" "pocketbaseSigner/models" "time" ) func DashboardHandler(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { http.Error(w, "Метод не поддерживается", http.StatusMethodNotAllowed) return } // Получаем токен из cookie cookie, err := r.Cookie("pb_auth") if err != nil { http.Redirect(w, r, "/login", http.StatusSeeOther) return } // Получаем ID пользователя из cookie userIdCookie, err := r.Cookie("user_id") if err != nil { log.Printf("Ошибка при получении ID пользователя: %v", err) http.Redirect(w, r, "/login", http.StatusSeeOther) return } // Получаем данные пользователя url := config.PocketBaseURL + "/api/collections/users/records/" + userIdCookie.Value req, err := http.NewRequest("GET", url, nil) if err != nil { log.Printf("Ошибка при создании запроса: %v", err) http.Error(w, "Внутренняя ошибка сервера", http.StatusInternalServerError) return } req.Header.Set("Authorization", cookie.Value) client := &http.Client{} resp, err := client.Do(req) if err != nil { log.Printf("Ошибка при получении данных пользователя: %v", err) http.Error(w, "Ошибка при получении данных", http.StatusInternalServerError) return } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { log.Printf("Ошибка при чтении ответа: %v", err) http.Error(w, "Ошибка при обработке данных", http.StatusInternalServerError) return } // Проверяем статус ответа if resp.StatusCode != http.StatusOK { log.Printf("Ошибка при получении данных пользователя: %s", string(body)) http.Error(w, "Ошибка при получении данных пользователя", resp.StatusCode) return } var userData models.UserData if err := json.Unmarshal(body, &userData); err != nil { log.Printf("Ошибка при разборе JSON: %v", err) http.Error(w, "Ошибка при обработке данных", http.StatusInternalServerError) return } // Отображаем dashboard w.Header().Set("Content-Type", "text/html") dashboardHTML := ` Личный кабинет

Личный кабинет

Информация о пользователе

Email: ` + userData.Email + `

Имя: ` + userData.FirstName + `

Фамилия: ` + userData.LastName + `

Телефон: ` + userData.Phone + `

Мои документы

` + generateFilesGridFromNames(userData.Files, userIdCookie.Value, cookie.Value) + `
` w.Write([]byte(dashboardHTML)) } func getFileToken(cookie string) (string, error) { url := config.PocketBaseURL + "/api/files/token" req, err := http.NewRequest("POST", url, nil) if err != nil { return "", err } req.Header.Set("Authorization", cookie) client := &http.Client{} resp, err := client.Do(req) if err != nil { return "", err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("ошибка получения токена: %d", resp.StatusCode) } var result map[string]string if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { return "", err } return result["token"], nil } func generateFilesGridFromNames(files []string, userId string, authCookie string) string { if len(files) == 0 { return `
У вас пока нет загруженных документов
` } // Получаем токен для доступа к файлам token, err := getFileToken(authCookie) if err != nil { log.Printf("Ошибка при получении токена файла: %v", err) return `
Ошибка при получении доступа к файлам
` } var html string for _, fileName := range files { // Формируем URL для просмотра файла с токеном fileUrl := config.PocketBaseURL + "/api/files/_pb_users_auth_/" + userId + "/" + fileName + "?token=" + token html += `
` + fileName + `
` } return html } func formatDate(dateStr string) string { // Парсим дату из формата ISO 8601 t, err := time.Parse(time.RFC3339, dateStr) if err != nil { return dateStr } // Форматируем в удобный для чтения формат return t.Format("02.01.2006 15:04") } func formatVerified(verified bool) string { if verified { return "Подтвержден" } return "Не подтвержден" }