Skip to content

Commit 8d15cbf

Browse files
committed
feature:add K8S api Key figure
1 parent b04c44a commit 8d15cbf

File tree

8 files changed

+195
-0
lines changed

8 files changed

+195
-0
lines changed

src/main/java/org/poolc/api/auth/configurations/WebSecurityConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ protected void configure(HttpSecurity http) throws Exception {
152152
.antMatchers(HttpMethod.PUT, "/interview/slots/*").hasAuthority(MemberRole.ADMIN.name())
153153
.antMatchers(HttpMethod.DELETE, "/interview/slots/*").hasAuthority(MemberRole.ADMIN.name())
154154
.antMatchers(HttpMethod.PUT, "/interview/slots").hasAuthority(MemberRole.ADMIN.name())
155+
156+
.antMatchers(HttpMethod.GET, "/kubernetes/").permitAll()
157+
.antMatchers(HttpMethod.POST, "/kubernetes/").permitAll()
155158
.antMatchers("/**").permitAll()
156159

157160
.anyRequest().authenticated().and()
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.poolc.api.kubernetes.controller;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.poolc.api.kubernetes.dto.GetKubernetesResponseDto;
5+
import org.poolc.api.kubernetes.service.KubernetesService;
6+
import org.springframework.http.ResponseEntity;
7+
import org.springframework.web.bind.annotation.*;
8+
9+
import java.util.Map;
10+
11+
@RestController
12+
@RequestMapping("/kubernetes")
13+
@RequiredArgsConstructor
14+
public class KubernetesController {
15+
16+
private final KubernetesService kubernetesService;
17+
18+
@GetMapping(value="/")
19+
public ResponseEntity<GetKubernetesResponseDto> getAllActiveMembers(@RequestHeader("X-API-KEY") String apiKey){
20+
21+
GetKubernetesResponseDto response = new GetKubernetesResponseDto(
22+
kubernetesService.getAllActiveMembers(apiKey)
23+
);
24+
return ResponseEntity.ok().body(response);
25+
}
26+
27+
@PostMapping(value="/")
28+
public ResponseEntity<Void> refreshMamberKeys(@RequestHeader("X-API-KEY") String apiKey, @RequestBody Map<String,String> requestBody) {
29+
30+
kubernetesService.refreshMemberKey(requestBody, apiKey);
31+
return ResponseEntity.ok().build();
32+
}
33+
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.poolc.api.kubernetes.domain;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
import javax.persistence.Column;
7+
import javax.persistence.Entity;
8+
import javax.persistence.GeneratedValue;
9+
import javax.persistence.Id;
10+
11+
@Getter
12+
@Entity(name = "kubernetes_mappings")
13+
public class KubernetesMapping {
14+
15+
@Id
16+
@GeneratedValue
17+
private Long id;
18+
19+
@Column(name = "user_uuid",nullable = false)
20+
private String UUID;
21+
22+
@Column(name = "kubernetes_key", nullable = false)
23+
private String kubernetesKey;
24+
25+
@Builder
26+
public KubernetesMapping(String UUID, String kubernetesKey) {
27+
this.UUID = UUID;
28+
this.kubernetesKey = kubernetesKey;
29+
}
30+
31+
protected KubernetesMapping() {
32+
33+
}
34+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.poolc.api.kubernetes.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator;
4+
import lombok.Getter;
5+
6+
import java.util.List;
7+
8+
@Getter
9+
public class GetKubernetesResponseDto {
10+
private final List<String> activeMembers;
11+
12+
@JsonCreator
13+
public GetKubernetesResponseDto(List<String> activeMembers) {
14+
this.activeMembers = activeMembers;
15+
}
16+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.poolc.api.kubernetes.dto;
2+
3+
import lombok.Getter;
4+
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
@Getter
9+
public class PostKubernetesRequestDto {
10+
private final Map<String,String> activeMembersMap;
11+
12+
public PostKubernetesRequestDto(Map<String,String> activeMembersMap) {
13+
this.activeMembersMap = activeMembersMap;
14+
}
15+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.poolc.api.kubernetes.repository;
2+
3+
import org.poolc.api.kubernetes.domain.KubernetesMapping;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.Modifying;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.transaction.annotation.Transactional;
8+
9+
import java.util.List;
10+
import java.util.Optional;
11+
12+
public interface KubernetesRepository extends JpaRepository<KubernetesMapping, Long> {
13+
14+
15+
@Query(value = "SELECT DISTINCT MEMBER_UUID\n" +
16+
"FROM ROLES\n" +
17+
"WHERE MEMBER_UUID IN (\n" +
18+
" SELECT MEMBER_UUID\n" +
19+
" FROM ROLES\n" +
20+
" WHERE ROLES = 'MEMBER'\n" +
21+
")\n" +
22+
"AND MEMBER_UUID NOT IN (\n" +
23+
" SELECT MEMBER_UUID\n" +
24+
" FROM ROLES\n" +
25+
" WHERE ROLES = 'INACTIVE'\n" +
26+
")", nativeQuery = true)
27+
List<String> findAllActiveMembers();
28+
29+
@Modifying
30+
@Transactional
31+
@Query(value = "TRUNCATE TABLE KUBERNETES_MAPPINGS", nativeQuery = true)
32+
void truncateKubernetesMappingTable();
33+
34+
@Query(value = "SELECT kubernetesKey FROM kubernetes_mappings WHERE UUID IN (SELECT UUID FROM Member WHERE loginID = :userId)")
35+
Optional<String> findKubernetesKeyByUserId(String userId);
36+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.poolc.api.kubernetes.service;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.poolc.api.kubernetes.domain.KubernetesMapping;
5+
import org.poolc.api.kubernetes.repository.KubernetesRepository;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.stereotype.Service;
8+
import org.springframework.transaction.annotation.Transactional;
9+
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.stream.Collectors;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
public class KubernetesService {
17+
private final KubernetesRepository kubernetesRepository;
18+
19+
@Value("${kubernetes.api.key}")
20+
private String API_KEY;
21+
22+
public List<String> getAllActiveMembers(String apiKey) {
23+
if(!isValidApiKey(apiKey)) {
24+
throw new IllegalArgumentException("Invalid API key");
25+
}
26+
return kubernetesRepository.findAllActiveMembers();
27+
}
28+
29+
@Transactional
30+
public void refreshMemberKey(Map<String,String> requestBody, String apiKey) {
31+
if(!isValidApiKey(apiKey)) {
32+
throw new IllegalArgumentException("Invalid API key");
33+
}
34+
35+
kubernetesRepository.truncateKubernetesMappingTable();
36+
37+
List<KubernetesMapping> mappings = requestBody.entrySet().stream()
38+
.map(entry -> KubernetesMapping.builder()
39+
.UUID(entry.getKey())
40+
.kubernetesKey(entry.getValue())
41+
.build())
42+
.collect(Collectors.toList());
43+
kubernetesRepository.saveAll(mappings);
44+
}
45+
46+
public String getKubernetesKeyByUserId(String userId) {
47+
return kubernetesRepository.findKubernetesKeyByUserId(userId)
48+
.orElseThrow(() -> new IllegalArgumentException("No Kubernetes key found for user: " + userId));
49+
}
50+
51+
private boolean isValidApiKey(String apiKey) {
52+
return API_KEY.equals(apiKey);
53+
}
54+
}

src/main/resources/application.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,6 @@ book:
3838
id: ${NAVER_BOOK_CLIENT_ID}
3939
secret: ${NAVER_BOOK_CLIENT_SECRET}
4040

41+
kubernetes:
42+
api:
43+
key: ${KUBERNETES_API_KEY}

0 commit comments

Comments
 (0)