Commit Graph

29 Commits

Author SHA1 Message Date
sb ceba15df42 feat: 스팟별 '이 시간대 자주 오는 견종' 통계 API
Deploy (dev) / deploy (push) Failing after 12m57s
CI / build (push) Failing after 15m1s
체크인 이력(check_ins)에서 현재와 같은 요일·시간대 방문을 집계해 상위 견종 반환.
GET /api/spots/{id}/frequent-breeds. 집계는 Java(요일/시간대, KST) — H2/Postgres 공용.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 19:15:41 +09:00
sb a29aadc5ff fix(ci): 배포 시 jar 경로 자가치유 (컨테이너 stop→경로 정리→배치→재기동)
CI / build (push) Has been cancelled
Deploy (dev) / deploy (push) Failing after 11m58s
빈 디렉토리로 잘못 생성된 마운트 경로(corrupt jarfile 원인)까지 rm -rf 로 정리.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 18:14:35 +09:00
sb 1cdff136c3 fix(ci): jar 전송을 scp→ssh(cat)로 변경 + 접속 확인
Deploy (dev) / deploy (push) Has been cancelled
CI / build (push) Failing after 15m10s
최신 OpenSSH scp(SFTP 모드)의 'open: no such file' 경로 이슈 회피.
ssh stdin 으로 jar 전송, 배포 전 SSH 접속 체크 추가.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 18:10:34 +09:00
sb f6a54d9f33 ci: 운영(prod) 자동배포 워크플로 추가 (main push → api 컨테이너)
CI / build (push) Failing after 16m2s
Deploy (dev) / deploy (push) Failing after 15m47s
dev 와 동일한 jar 방식. 운영 jar 경로는 DEPLOY_JAR_PATH_PROD.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 17:24:41 +09:00
sb de8b5dac19 ci: dev 자동배포를 jar 방식으로 변경 (CI 빌드 → scp → 컨테이너 재기동)
Deploy (dev) / deploy (push) Failing after 12m51s
CI / build (push) Failing after 15m6s
서버에 소스/git 불필요. JRE 컨테이너가 마운트된 jar 실행.
시크릿: DEPLOY_JAR_PATH(컴포즈 볼륨 경로), COMPOSE_FILE 등.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 17:20:38 +09:00
ByungCheol 4b6dc8618a chore(cors): 관리자 콘솔(dognation_AT) dev 오리진(localhost:9100) 허용
Deploy (dev) / deploy (push) Failing after 11m19s
CI / build (push) Failing after 13m23s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 17:05:21 +09:00
sb f6efb647ea ci: dev 자동 배포 워크플로 (Gitea Actions → SSH → docker compose)
CI / build (push) Failing after 11m24s
Deploy (dev) / deploy (push) Failing after 14m16s
dev push 시 서버에서 git reset --hard origin/dev + docker compose up -d --build dev-api.
시크릿: DEPLOY_HOST/USER/SSH_KEY/PATH/COMPOSE_FILE/PORT.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 17:04:20 +09:00
sb 7142a3128e feat: Redis 논리 DB로 dev/prod 격리 (dev=3, prod=4)
CI / build (push) Failing after 12m11s
Redis 한 인스턴스를 공용할 때 체크인 키(spot:checkin:*) 충돌 방지.
spring.data.redis.database 를 프로파일별로 지정.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 16:48:32 +09:00
sb b124e60c88 build: Dockerfile + .dockerignore (컨테이너 배포용)
CI / build (push) Failing after 13m26s
멀티스테이지(JDK 빌드→JRE 런타임), bootJar -x test 로 실행가능 jar 하나 생성.
프로파일/포트는 런타임 env(SPRING_PROFILES_ACTIVE)로 결정 → dev/prod 이미지 공용.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 16:27:16 +09:00
sb ca14f8ee64 feat: 받은 매칭 조회에 신청 견 정보 포함 (수락/거절 UI용)
CI / build (push) Failing after 11m22s
GET /api/matches/received/{dogId} → 신청 견 이름·견종 포함(ReceivedMatchResponse).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 15:04:20 +09:00
sb f6882aef44 feat: 매칭 플로우 완성 (진행중·알림·수락 1:1채팅·거절·20분 자동만료)
CI / build (push) Failing after 16m2s
- 20분 미수락 자동 종료: MatchingRequest.expiresAt + EXPIRED 상태 + 1분 스케줄러
- 신청/수락/거절/만료 시 상대에게 STOMP 알림 (/topic/users/{userId})
- 수락 시 1:1 매칭 채팅방 생성 + 결과(양쪽 강아지 정보) 메시지, /topic/matches/{id}
- 보낸 대기중 조회 GET /api/matches/sent/{dogId} (진행중 표시용)
- 마이그레이션 V7: matching_requests.expires_at, EXPIRED, chat_rooms.match_id

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 14:49:39 +09:00
sb 29982e3572 fix(local): 데모 메이트·한줄평을 기본 선택 스팟(첫 스팟)에 배치
CI / build (push) Failing after 15m47s
StatsSeedData 가 통계용 스팟을 먼저 넣어 데모 메이트가 안 보이던 문제.
프론트가 기본 선택하는 min-id 스팟에 콩이·보리 체크인 → 앱 열자마자 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 14:04:56 +09:00
sb ea61eaf47e feat: 산책 메이트 목록에서 본인 강아지 제외
CI / build (push) Failing after 12m12s
GET /api/spots/{id}/mates?userId= 로 회원 소유 강아지를 제외.
본인 강아지가 메이트로 노출되던 혼란 해소.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 13:58:30 +09:00
sb 00af95bf6e feat: AI(Gemini) 스팟 궁합 메이트 추천
CI / build (push) Failing after 15m45s
체크인한 스팟의 활성 강아지(Redis 24h) 중 내 강아지와 사이좋게 지낼 만한
강아지만 Gemini 로 골라 궁합점수·이유와 함께 반환.
GET /api/spots/{id}/ai-mates?dogId=...

- GeminiClient: responseSchema 로 구조화 JSON 강제(gemini-flash-latest)
- MateAiService: 후보 성향/크기로 프롬프트 구성, 후보 밖 dogId(환각) 필터, 점수 내림차순
- application.yml: app.ai.gemini (env GEMINI_API_KEY, 미설정 시 503)
- 키 없이도 컨텍스트/테스트 통과 → CI 안전

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 13:44:46 +09:00
sb 8d3be8493c feat: 스팟 체크인 실시간 저장소 Redis 도입 (24h TTL)
CI / build (push) Failing after 13m37s
체크인 시 PostgreSQL(통계용 영구 기록)과 Redis(실시간 활성 체크인)에 함께 저장.
활성 메이트 조회를 Redis ZSet(member=dogId, score=체크인시각, 24h TTL)에서
최근 24시간·최신순으로 수행. Postgres 는 이벤트마다 누적(통계).

- CheckInRedisStore: ZSet + 24h 키 TTL, 조회 시 만료 정리
- application.yml: spring.data.redis (env 주입, 기본 localhost:6379)
- Redis 미기동 시에도 컨텍스트 로드(Lettuce 지연연결) → CI/테스트 안전

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 13:27:05 +09:00
ByungCheol 6da7339626 feat(admin): 구독/결제 관리 API
CI / build (push) Failing after 15m7s
- GET /api/admin/subscriptions (filter=active|inactive|all) + /summary(활성·만료임박·티어/플랫폼 분포)
- POST /grant: 관리자 수동 부여(회원 tier 동기화, platform=ADMIN), PUT /{id}/extend, /{id}/cancel(tier FREE 환원)
- V6: subscriptions.platform CHECK 에 ADMIN 허용
- Subscription 엔티티 확장 + 리포지토리, StatsSeedData 구독 더미(활성/만료/임박)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 12:40:32 +09:00
ByungCheol 2061974695 feat(admin): 대시보드 통계 + 회원 상세
CI / build (push) Failing after 13m11s
대시보드(체크인 기반):
- V5 마이그레이션: spots.region(시군구) + withdrawal_log
- AdminStatsController/Service: 회원수(티어/상태)·금일 신규/탈퇴·DAU/WAU/MAU(체크인 distinct)·시군구 지역
- 접속자 일/주/월 버킷은 DB 함수 의존 없이 서버 집계(H2·PG 공용)
- WithdrawalLog 엔티티 + MemberAdmin.delete 훅(금일 탈퇴 집계)
- StatsSeedData(local): 시군구 스팟·최근 30일 체크인·탈퇴 더미

회원 상세:
- GET /api/admin/members/{id}: 강아지/체크인/매칭(양방향)/구독 이력 조립
- Subscription 엔티티 추가(로컬 H2 테이블 생성 + prod 검증)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 11:37:29 +09:00
sb ccfde5dc95 ci: Gitea Actions 로 전환 (dev 전용, .gitlab-ci.yml 제거)
CI / build (push) Failing after 16m0s
이 인스턴스는 Gitea → .gitlab-ci.yml 미사용. sb_bt 컨벤션 따라 .gitea/workflows/ci.yaml.
테스트는 H2 인메모리라 서비스 컨테이너 불필요.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 11:29:41 +09:00
sb ffb936bb76 feat: dev/prod 프로파일 서버 포트 분리 (dev 9091, prod 9090)
SPRING_PROFILES_ACTIVE 로 활성화. local 은 기존 8080 유지.
DB 등 나머지 설정은 application.yml 환경변수 주입을 그대로 사용.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 10:58:54 +09:00
sb 5bb3166a54 ci: GitLab CI 파이프라인 추가 (dev 전용)
Gradle build(H2 테스트 포함) + jar/junit 리포트. dev 브랜치 푸시에서만 실행.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 10:40:46 +09:00
sb c2fc408fcc feat: 실시간 인앱 채팅 (STOMP over WebSocket)
- 스팟별 채팅방(/topic/spots/{id}), 전송 /app/spots/{id}/chat, 엔드포인트 /ws
- STOMP CONNECT Bearer 토큰 인증(ChannelInterceptor) → 미인증 전송 무시
- ChatRoom/ChatMessage 도메인, 방 없으면 최초 메시지 시 생성, 발신자 닉네임 포함
- GET /api/chat/spots/{id}/messages 히스토리(보호), 전역 WebSocket 브로커(인메모리)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 09:17:25 +09:00
sb c6cd754857 feat: 강아지 관리 API (CRUD + 댕비티아이 성향 태그)
- GET/POST/PUT/DELETE /api/dogs (로그인 필요, 소유권 검증 → 403)
- GET /api/trait-tags 성향 태그 마스터 (공개)
- Dog-TraitTag 다대다(dog_trait_tags), @EntityGraph 로 지연로딩 예외 방지
- V4 마이그레이션: 성향 태그 시드 / local 시드에 태그+대표견 성향 부여
- /api/dogs/** 인증 인터셉터 보호

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 08:59:18 +09:00
ByungCheol ffbb365c41 feat(local): 관리자 개발자 로그인(dev-login) + 관리자 시드 분리
- DevAuthController: @Profile("local") 전용 /api/auth/dev-login (이메일로 세션 발급) — 관리자 콘솔 로컬 확인용
- AdminSeedData: admin@dog.com(ADMIN) + 더미 회원 시드. 앱 시드(LocalSeedData)와 분리, @Order로 선실행

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 08:49:19 +09:00
sb 9bd02dd63e feat: local 시드에 개발용 세션 토큰 추가
- auth_session 에 'dev-local-token' 시드 (local 프로파일 전용)
- 프론트가 실제 소셜 토큰 없이 로그인→/me→로그아웃 플로우를 로컬 검증 가능

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 08:34:41 +09:00
sb fe937f1724 fix: local 시드 users INSERT를 소셜 로그인 스키마(V3)에 맞게 수정
- password_hash 제거, role/provider 컬럼 반영 (V3 이후 컬럼 불일치로 local 기동 실패하던 문제)
- local 프로파일 기동 및 시드 정상화 확인

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 08:23:33 +09:00
ByungCheol 19b26ebe37 feat: 소셜 로그인(구글/애플)·세션·관리자 회원관리 백엔드
- users: 소셜 전용 전환(password_hash 제거) + role/provider/google_id/apple_id/profile_image (V2 마이그레이션)
- auth_session 테이블: Redis 없이 DB 세션(슬라이딩 만료), Bearer 토큰
- 소셜 로그인: 구글 tokeninfo(aud) · 애플 JWKS(iss/aud/exp) 검증 → 이메일 계정연결/신규가입
- AuthInterceptor(세션)+AdminInterceptor(role=ADMIN) 2단 보호, 관리자 페이지는 웹 전용
- /api/admin/members: 목록·상태·티어·역할·삭제 (본인 잠금방지, 정지/삭제/역할변경 시 세션 무효화)
- 예외는 기존 ApiExceptionHandler로 통합(ApiException 매핑 추가)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 08:10:42 +09:00
sb 115bc13ea1 feat: 스팟/체크인/한줄평 API 및 로컬(H2) 실행 프로파일
- GET /api/spots, POST /{id}/checkins, GET /{id}/mates, GET·POST /{id}/reviews
- Spot/CheckIn/SpotReview 엔티티·서비스 (체크인 2시간 TTL, 만료 비노출)
- CORS 허용(Vite dev, Capacitor iOS/AOS)
- local 프로파일: Postgres 없이 H2로 기동 + 시드 데이터 (연동 검증용)
- V2 마이그레이션: spots 위경도 컬럼 추가, geom NOT NULL 완화

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 08:07:43 +09:00
sb 1befad06d2 feat: 매칭 신청/응답 API 및 티어별 쿼터 가드
- POST /api/matches (신청), /{id}/accept·/reject (응답), GET /received/{dogId}
- 티어 가드: PREMIUM 무제한, FREE/AD_FREE 하루 3회 소진 시 429
- 자기신청/중복신청 차단, 전역 예외 핸들러(404/409/400/429)
- Dog/MatchingRequest 엔티티 및 리포지토리, 통합 테스트 4건 추가(총 7건 통과)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 07:56:41 +09:00
sb e53e4e12f2 feat: 매칭 쿼터 자정 초기화 스케줄러 및 초기 DB 스키마
- PostgreSQL/PostGIS 초기 스키마(users/dogs/성향태그/스팟/체크인/한줄평/채팅/구독/매칭쿼터)
- 매일 자정(KST) 무료·광고제거 유저 매칭 3회 초기화 스케줄러(벌크 UPDATE, PREMIUM 제외)
- 매칭 소진/차단 서비스 및 통합 테스트(H2) 3건 통과

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 07:36:49 +09:00