Pārlūkot izejas kodu

fix: /auth/me returns full user; bg #060606; logout button style; version+copyright footer; deploy improvements

neyrogovnarik 1 mēnesi atpakaļ
vecāks
revīzija
8b3eb4ad8e

+ 11 - 1
backend/internal/handlers/auth.go

@@ -145,7 +145,17 @@ func (h *AuthHandler) Me(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	writeJSON(w, http.StatusOK, map[string]string{"user_id": userID, "role": middleware.GetUserRole(r.Context())})
+	user, err := h.authSvc.GetUser(r.Context(), userID)
+	if err != nil {
+		writeError(w, http.StatusInternalServerError, "failed to get user", err)
+		return
+	}
+	if user == nil {
+		writeError(w, http.StatusUnauthorized, "user not found", nil)
+		return
+	}
+
+	writeJSON(w, http.StatusOK, user)
 }
 
 const refreshTokenCookieName = "refresh_token"

+ 4 - 0
backend/internal/services/auth.go

@@ -248,6 +248,10 @@ func (s *AuthService) RefreshSession(ctx context.Context, plainRefreshToken stri
 	return s.generateTokens(ctx, user)
 }
 
+func (s *AuthService) GetUser(ctx context.Context, userID string) (*models.User, error) {
+	return s.userRepo.GetByID(ctx, userID)
+}
+
 func (s *AuthService) RevokeSession(ctx context.Context, plainRefreshToken string) error {
 	logger := log.FromContext(ctx)
 

+ 4 - 0
deploy/deploy-remote.sh

@@ -268,6 +268,10 @@ create_docker_secrets() {
 deploy() {
     log_info "Запуск docker compose..."
     cd "$PROJECT_DIR"
+
+    # Версия сайта (git hash) для отображения в правом нижнем углу
+    export NEXT_PUBLIC_GIT_HASH="${NEXT_PUBLIC_GIT_HASH:-$(git rev-parse --short HEAD 2>/dev/null || echo dev)}"
+
     # Загружаем переменные окружения для docker compose
     if [ -f "$ENV_FILE" ]; then
         docker compose --env-file "$ENV_FILE" -f deploy/docker-compose.prod.yml up -d --build --remove-orphans

+ 1 - 0
deploy/deploy.sh

@@ -91,6 +91,7 @@ fi
 
 # 5. Build and deploy with --env-file
 echo ">>> Собираю и запускаю контейнеры..."
+export NEXT_PUBLIC_GIT_HASH="${NEXT_PUBLIC_GIT_HASH:-$(git rev-parse --short HEAD 2>/dev/null || echo dev)}"
 docker compose --env-file "$ENV_FILE" -f deploy/docker-compose.prod.yml up -d --build --remove-orphans
 
 # 6. Health check (Caddy -> backend -> migrations)

+ 2 - 1
deploy/docker-compose.prod.yml

@@ -122,9 +122,10 @@ services:
       dockerfile: Dockerfile
       args:
         NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL}
-        NEXT_PUBLIC_MAP_PROVIDER: yandex
+        NEXT_PUBLIC_MAP_PROVIDER: leaflet
         NEXT_PUBLIC_YANDEX_MAPS_API_KEY: ${YANDEX_MAPS_API_KEY}
         NEXT_PUBLIC_YANDEX_GEOCODER_API_KEY: ${YANDEX_GEOCODER_API_KEY}
+        NEXT_PUBLIC_GIT_HASH: ${NEXT_PUBLIC_GIT_HASH}
     depends_on:
       backend:
         condition: service_healthy

+ 2 - 0
frontend/Dockerfile

@@ -4,10 +4,12 @@ ARG NEXT_PUBLIC_API_URL
 ARG NEXT_PUBLIC_MAP_PROVIDER
 ARG NEXT_PUBLIC_YANDEX_MAPS_API_KEY
 ARG NEXT_PUBLIC_YANDEX_GEOCODER_API_KEY
+ARG NEXT_PUBLIC_GIT_HASH
 ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
 ENV NEXT_PUBLIC_MAP_PROVIDER=$NEXT_PUBLIC_MAP_PROVIDER
 ENV NEXT_PUBLIC_YANDEX_MAPS_API_KEY=$NEXT_PUBLIC_YANDEX_MAPS_API_KEY
 ENV NEXT_PUBLIC_YANDEX_GEOCODER_API_KEY=$NEXT_PUBLIC_YANDEX_GEOCODER_API_KEY
+ENV NEXT_PUBLIC_GIT_HASH=$NEXT_PUBLIC_GIT_HASH
 
 WORKDIR /app
 COPY package.json package-lock.json* ./

+ 11 - 1
frontend/src/app/layout.tsx

@@ -10,10 +10,13 @@ export const metadata: Metadata = {
   description: 'Находите лучшие места и студии для фотосъемок, бронируйте студии и общайтесь с фотографами',
 }
 
+const version = process.env.NEXT_PUBLIC_GIT_HASH || process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA || 'dev'
+const year = new Date().getFullYear()
+
 export default function RootLayout({ children }: { children: React.ReactNode }) {
   return (
     <html lang="ru">
-      <body className="h-screen overflow-hidden bg-[#0f172a]">
+      <body className="h-screen overflow-hidden bg-[#060606]">
         <ErrorBoundary>
           <AuthProvider>
             <Header />
@@ -21,6 +24,13 @@ export default function RootLayout({ children }: { children: React.ReactNode })
             {children}
           </AuthProvider>
         </ErrorBoundary>
+
+        <div className="absolute bottom-0 left-0 right-0 z-40 pb-3">
+          <div className="flex items-center justify-center">
+            <p className="text-xs text-white/20">&copy; {year} PhotoPlaces</p>
+          </div>
+          <p className="absolute right-4 bottom-3 text-xs text-white/20">{version}</p>
+        </div>
       </body>
     </html>
   )

+ 1 - 1
frontend/src/components/Header.tsx

@@ -26,7 +26,7 @@ export default function Header() {
             <span className="text-sm text-white/60">{user.email}</span>
             <button
               onClick={logout}
-              className="rounded-lg bg-white/10 px-4 py-2 text-sm text-white hover:bg-white/20 transition"
+              className="rounded-lg bg-white/10 backdrop-blur-md px-4 py-2 text-sm text-white hover:bg-white/20 transition"
             >
               Выйти
             </button>

+ 1 - 1
frontend/src/styles/globals.css

@@ -5,7 +5,7 @@
 :root {
   --color-primary: #22c55e;
   --color-primary-dark: #16a34a;
-  --color-bg: #0f172a;
+  --color-bg: #060606;
   --color-surface: #1e293b;
   --color-text: #f1f5f9;
   --color-text-muted: #94a3b8;