Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import devkor.ontime_back.global.oauth.google.GoogleLoginService;
import devkor.ontime_back.global.oauth.kakao.KakaoLoginFilter;
import devkor.ontime_back.global.oauth.google.GoogleLoginFilter;
import devkor.ontime_back.repository.UserAlarmSettingRepository;
import devkor.ontime_back.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
Expand Down Expand Up @@ -51,6 +52,7 @@ public class SecurityConfig {
private final LoginService loginService;
private final JwtTokenProvider jwtTokenProvider;
private final UserRepository userRepository;
private final UserAlarmSettingRepository userAlarmSettingRepository;
private final ObjectMapper objectMapper;
private final AppleLoginService appleLoginService;
private final GoogleLoginService googleLoginService;
Expand All @@ -75,7 +77,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.requestMatchers("/health").permitAll() // 로드밸런서 연결 확인용 url
.anyRequest().authenticated()
)
.addFilterBefore(new KakaoLoginFilter("/oauth2/kakao/login", jwtTokenProvider, userRepository),
.addFilterBefore(new KakaoLoginFilter("/oauth2/kakao/login", jwtTokenProvider, userRepository, userAlarmSettingRepository),
UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new GoogleLoginFilter("/oauth2/google/login", googleLoginService, userRepository),
UsernamePasswordAuthenticationFilter.class)
Expand Down Expand Up @@ -145,4 +147,4 @@ public CorsConfigurationSource corsConfigurationSource() {
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package devkor.ontime_back.controller;

import devkor.ontime_back.dto.*;
import devkor.ontime_back.response.ApiResponseForm;
import devkor.ontime_back.service.AlarmService;
import devkor.ontime_back.service.UserAuthService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequiredArgsConstructor
public class AlarmController {

private final UserAuthService userAuthService;
private final AlarmService alarmService;

@GetMapping("/users/me/alarm-settings")
public ResponseEntity<ApiResponseForm<AlarmSettingsResponseDto>> getAlarmSettings(HttpServletRequest request) {
Long userId = userAuthService.getUserIdFromToken(request);
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponseForm.success(alarmService.getAlarmSettings(userId)));
}

@PatchMapping("/users/me/alarm-settings")
public ResponseEntity<ApiResponseForm<AlarmSettingsResponseDto>> patchAlarmSettings(
HttpServletRequest request,
@RequestBody Map<String, Object> requestBody) {
Long userId = userAuthService.getUserIdFromToken(request);
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponseForm.success(alarmService.patchAlarmSettings(userId, requestBody)));
}

@PutMapping("/users/me/devices/current")
public ResponseEntity<ApiResponseForm<AlarmDeviceCurrentResponseDto>> registerCurrentDevice(
HttpServletRequest request,
@RequestBody AlarmDeviceCurrentRequestDto requestDto) {
Long userId = userAuthService.getUserIdFromToken(request);
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponseForm.success(alarmService.registerCurrentDevice(
userId,
requestDto,
userAuthService.getAccessTokenFromRequest(request),
userAuthService.getRefreshTokenFromRequest(request))));
}

@DeleteMapping("/users/me/devices/current")
public ResponseEntity<ApiResponseForm<AlarmDeviceUnregisterResponseDto>> unregisterCurrentDevice(
HttpServletRequest request,
@RequestBody(required = false) AlarmDeviceUnregisterRequestDto requestDto) {
Long userId = userAuthService.getUserIdFromToken(request);
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponseForm.success(alarmService.unregisterCurrentDevice(
userId,
requestDto,
userAuthService.getAccessTokenFromRequest(request))));
}

@PostMapping("/users/me/alarm-status")
public ResponseEntity<ApiResponseForm<AlarmStatusReportResponseDto>> reportAlarmStatus(
HttpServletRequest request,
@RequestBody AlarmStatusReportRequestDto requestDto) {
Long userId = userAuthService.getUserIdFromToken(request);
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponseForm.success(alarmService.reportAlarmStatus(
userId,
requestDto,
userAuthService.getAccessTokenFromRequest(request))));
}

@GetMapping("/users/me/alarm-status")
public ResponseEntity<ApiResponseForm<AlarmStatusCurrentResponseDto>> getCurrentAlarmStatus(HttpServletRequest request) {
Long userId = userAuthService.getUserIdFromToken(request);
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponseForm.success(alarmService.getCurrentAlarmStatus(
userId,
userAuthService.getAccessTokenFromRequest(request))));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,10 @@ public class FirebaseTokenController {
public ResponseEntity<ApiResponseForm<String>> registerFirebaseToken(HttpServletRequest request, @RequestBody FirebaseTokenAddDto firebaseTokenAddDto) {
Long userId = userAuthService.getUserIdFromToken(request);

firebaseTokenService.registerFirebaseToken(userId, firebaseTokenAddDto);
firebaseTokenService.registerFirebaseToken(
userId,
firebaseTokenAddDto,
userAuthService.getAccessTokenFromRequest(request));

String message = "FCM 토큰이 성공적으로 User테이블에 저장되었습니다!";
return ResponseEntity.ok(ApiResponseForm.success(null, message));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package devkor.ontime_back.controller;

import devkor.ontime_back.dto.*;
import devkor.ontime_back.response.GeneralException;
import devkor.ontime_back.response.ApiResponseForm;
import devkor.ontime_back.service.ScheduleService;
import devkor.ontime_back.service.UserAuthService;
Expand All @@ -17,10 +18,14 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.DateTimeException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.UUID;

import static devkor.ontime_back.response.ErrorCode.INVALID_INPUT;

@RestController
@RequestMapping("/schedules")
@RequiredArgsConstructor
Expand Down Expand Up @@ -65,6 +70,20 @@ public ResponseEntity<ApiResponseForm<List<ScheduleDto>>> getPeriodSchedule(Http
return ResponseEntity.status(HttpStatus.OK).body(ApiResponseForm.success(schedules));
}

@GetMapping("/alarm-window")
public ResponseEntity<ApiResponseForm<List<AlarmWindowScheduleDto>>> getAlarmWindowSchedules(
HttpServletRequest request,
@RequestParam String startDate,
@RequestParam String endDate) {
Long userId = userAuthService.getUserIdFromToken(request);
List<AlarmWindowScheduleDto> schedules = scheduleService.getAlarmWindowSchedules(
userId,
parseLocalWallClockDateTime(startDate),
parseLocalWallClockDateTime(endDate)
);
return ResponseEntity.status(HttpStatus.OK).body(ApiResponseForm.success(schedules));
}

// id로 스케줄 조회
@Operation(summary = "일정 id로 일정 조회",
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
Expand Down Expand Up @@ -262,6 +281,16 @@ public ResponseEntity<ApiResponseForm<?>> finishSchedule(
return ResponseEntity.ok(ApiResponseForm.success(null, message));
}

private LocalDateTime parseLocalWallClockDateTime(String value) {
if (value == null || value.isBlank()) {
throw new GeneralException(INVALID_INPUT);
}
try {
return LocalDateTime.from(DateTimeFormatter.ISO_DATE_TIME.parse(value));
} catch (DateTimeException e) {
throw new GeneralException(INVALID_INPUT);
}
}


}

Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package devkor.ontime_back.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Getter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class AlarmDeviceCurrentRequestDto {
private String deviceId;
private String platform;
private String appVersion;
private String osVersion;
private Boolean supportsNativeAlarm;
private String nativeAlarmProvider;
private String fallbackProvider;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package devkor.ontime_back.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

import java.time.Instant;

@Getter
@Builder
@AllArgsConstructor
public class AlarmDeviceCurrentResponseDto {
private String deviceId;
private Boolean active;
private Instant lastSeenAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package devkor.ontime_back.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Getter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class AlarmDeviceUnregisterRequestDto {
private String deviceId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package devkor.ontime_back.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
@AllArgsConstructor
public class AlarmDeviceUnregisterResponseDto {
private Boolean active;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package devkor.ontime_back.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

import java.time.Instant;

@Getter
@Builder
@AllArgsConstructor
public class AlarmSettingsResponseDto {
private Boolean alarmsEnabled;
private Integer defaultAlarmOffsetMinutes;
private Instant updatedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package devkor.ontime_back.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

import java.time.Instant;
import java.time.LocalDateTime;
import java.util.List;

@Getter
@Builder
@AllArgsConstructor
public class AlarmStatusCurrentResponseDto {
private String deviceId;
private Boolean active;
private String platform;
private String appVersion;
private String osVersion;
private Boolean supportsNativeAlarm;
private String nativeAlarmProvider;
private String fallbackProvider;
private Instant lastSeenAt;
private Instant reconciledAt;
private LocalDateTime scheduleWindowStart;
private LocalDateTime scheduleWindowEnd;
private LocalDateTime alarmCoverageStart;
private LocalDateTime alarmCoverageEnd;
private String status;
private String permissionIssue;
private Integer armedScheduleCount;
private List<String> armedScheduleIds;
private Integer skippedScheduleCount;
private List<AlarmStatusFailureDto> failures;
private Instant updatedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package devkor.ontime_back.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Getter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class AlarmStatusFailureDto {
private String scheduleId;
private String reason;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package devkor.ontime_back.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.util.List;

@Getter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class AlarmStatusReportRequestDto {
private String deviceId;
private OffsetDateTime reconciledAt;
private LocalDateTime scheduleWindowStart;
private LocalDateTime scheduleWindowEnd;
private LocalDateTime alarmCoverageStart;
private LocalDateTime alarmCoverageEnd;
private String status;
private String permissionIssue;
private String nativeAlarmProvider;
private String fallbackProvider;
private Integer armedScheduleCount;
private List<String> armedScheduleIds;
private Integer skippedScheduleCount;
private List<AlarmStatusFailureDto> failures;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package devkor.ontime_back.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
@AllArgsConstructor
public class AlarmStatusReportResponseDto {
private Boolean received;
}
Loading
Loading