gc-guide-api/src/main/java/com/gcsc/guide/service/ActivityService.java
htlee 9db7b8bfb4 feat: 관리자/활동/이슈 API 전체 구현
- Entity: LoginHistory, PageView, Issue, IssueComment 추가
- Repository: 각 엔티티별 JpaRepository 추가
- Service: UserService, RoleService, ActivityService, IssueService
- Admin API: 사용자 관리 7개, 롤/권한 관리 7개, 통계 1개 엔드포인트
- Activity API: 페이지뷰 기록, 로그인 이력 조회
- Issue API: CRUD + 코멘트, 프로젝트/위치/Gitea 링크 지원
- Exception: GlobalExceptionHandler, ResourceNotFoundException, BusinessException
- AuthController: 로그인 시 LoginHistory 기록 추가
- Dockerfile 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 21:13:14 +09:00

46 lines
1.7 KiB
Java

package com.gcsc.guide.service;
import com.gcsc.guide.dto.LoginHistoryResponse;
import com.gcsc.guide.entity.LoginHistory;
import com.gcsc.guide.entity.PageView;
import com.gcsc.guide.entity.User;
import com.gcsc.guide.exception.ResourceNotFoundException;
import com.gcsc.guide.repository.LoginHistoryRepository;
import com.gcsc.guide.repository.PageViewRepository;
import com.gcsc.guide.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@RequiredArgsConstructor
public class ActivityService {
private final LoginHistoryRepository loginHistoryRepository;
private final PageViewRepository pageViewRepository;
private final UserRepository userRepository;
@Transactional
public void recordLogin(Long userId, String ipAddress, String userAgent) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new ResourceNotFoundException("사용자", userId));
loginHistoryRepository.save(new LoginHistory(user, ipAddress, userAgent));
}
@Transactional
public void trackPageView(Long userId, String pagePath) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new ResourceNotFoundException("사용자", userId));
pageViewRepository.save(new PageView(user, pagePath));
}
@Transactional(readOnly = true)
public List<LoginHistoryResponse> getLoginHistory(Long userId) {
return loginHistoryRepository.findByUserIdOrderByLoginAtDesc(userId).stream()
.map(LoginHistoryResponse::from)
.toList();
}
}