Skip to content

Commit

Permalink
Merge branch 'feature/OPHKIOS-115' into feature/OPHKIOS-116
Browse files Browse the repository at this point in the history
  • Loading branch information
jrkkp committed Nov 6, 2024
2 parents 0d90d81 + 5ee0bd4 commit c720c98
Show file tree
Hide file tree
Showing 125 changed files with 3,922 additions and 369 deletions.
32 changes: 32 additions & 0 deletions backend/vkt/scripts/koodisto_municipalities.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/bash

# Fetch municipalities from koodisto, save returned json for backend to use, generate frontend localisation files.

BACKEND_PATH=../src/main/resources/koodisto
BACKEND_KOODISTO_FILE=${BACKEND_PATH}/koodisto_kunnat.json
mkdir -p $BACKEND_PATH
FRONTEND_PATH=../../../frontend/packages/vkt/public/i18n

mkdir -p $FRONTEND_PATH
function fetch_and_transform_koodisto_results_for_backend_use() {
koodistoURL="https://virkailija.opintopolku.fi/koodisto-service/rest/json/kunta/koodi"
# Read municipalities, filter out expired ones, filter out irrelevant codes (198,199,999), pick and transform relevant fields
jq_extract_cmd="[.[] | select(.voimassaLoppuPvm | type == \"null\") | select(.koodiArvo != \"198\" and .koodiArvo != \"199\" and .koodiArvo != \"999\")|{koodiUri, resourceUri, versio, koodiArvo, voimassaAlkuPvm, paivitysPvm, fi: (.metadata[] | select(.kieli == \"FI\") | .nimi), sv: (.metadata[] | select(.kieli == \"SV\") | .nimi)} ]"
curl -H "Caller-Id:kehittaja-vkt" "$koodistoURL" | jq -c "$jq_extract_cmd" > $BACKEND_KOODISTO_FILE
}

function extract_frontend_localisation() {
lang=$1
locale=$2
jq_extract_cmd="[.[] | {key: .koodiArvo, value: .${lang} }] | sort_by(.key) | from_entries"
jq_obj_wrap_cmd='. | {vkt:{koodisto:{municipalities:.}}}'
output="${FRONTEND_PATH}/${locale}/koodisto_municipalities.json"
echo "Command for jq: $jq_extract_cmd"
echo "Outputting to: $output"
jq "$jq_extract_cmd" $BACKEND_KOODISTO_FILE | jq "$jq_obj_wrap_cmd" >"${output}"
echo "ok"
}

fetch_and_transform_koodisto_results_for_backend_use
extract_frontend_localisation 'fi' 'fi-FI'
extract_frontend_localisation 'sv' 'sv-SE'
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import fi.oph.vkt.api.dto.clerk.ClerkExamEventDTO;
import fi.oph.vkt.api.dto.clerk.ClerkExamEventListDTO;
import fi.oph.vkt.api.dto.clerk.ClerkExamEventUpdateDTO;
import fi.oph.vkt.model.type.ExamLevel;
import fi.oph.vkt.service.ClerkExamEventService;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.annotation.Resource;
Expand Down Expand Up @@ -33,7 +34,7 @@ public class ClerkExamEventController {
@GetMapping
@Operation(tags = TAG_EXAM_EVENT, summary = "List all exam events")
public List<ClerkExamEventListDTO> list() {
return clerkExamEventService.list();
return clerkExamEventService.list(ExamLevel.EXCELLENT);
}

@GetMapping(path = "/{examEventId:\\d+}")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package fi.oph.vkt.api.clerk;

import fi.oph.vkt.api.dto.examiner.ExaminerDetailsDTO;
import fi.oph.vkt.service.ClerkExaminerService;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.annotation.Resource;
import java.util.List;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/api/v1/clerk/examiner", produces = MediaType.APPLICATION_JSON_VALUE)
public class ClerkExaminerController {

private static final String TAG_CLERK_EXAMINER = "Examiner API for OPH clerk users";

@Resource
private ClerkExaminerService clerkExaminerService;

@GetMapping
@Operation(tags = TAG_CLERK_EXAMINER, summary = "List examiner details")
public List<ExaminerDetailsDTO> listExaminers() {
return clerkExaminerService.listExaminers();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package fi.oph.vkt.api.clerk;

import fi.oph.vkt.api.dto.clerk.ClerkUserDTO;
import fi.oph.vkt.config.Constants;
import fi.oph.vkt.util.AuthorizationUtil;
import org.springframework.http.MediaType;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -13,7 +17,10 @@ public class ClerkUserController {

@GetMapping(path = "")
public ClerkUserDTO currentClerkUser() {
final String oid = SecurityContextHolder.getContext().getAuthentication().getName();
return ClerkUserDTO.builder().oid(oid).build();
final Authentication authn = SecurityContextHolder.getContext().getAuthentication();
final boolean isAdmin = AuthorizationUtil.hasRole(authn, Constants.APP_ROLE);
final boolean isExaminer = AuthorizationUtil.hasRole(authn, Constants.APP_TV_ROLE);
final String oid = authn.getName();
return ClerkUserDTO.builder().oid(oid).isAdmin(isAdmin).isExaminer(isExaminer).build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package fi.oph.vkt.api.dto;

import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.NonNull;

@Builder
public record MunicipalityDTO(@NonNull @NotNull String code) {}
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ public record PublicExaminerDTO(
@NonNull @NotNull String firstName,
@NonNull @NotNull List<ExamLanguage> languages,
@NonNull @NotNull List<PublicMunicipalityDTO> municipalities,
@NonNull @NotNull List<LocalDate> examDates
@NonNull @NotNull List<PublicExaminerExamDateDTO> examDates
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package fi.oph.vkt.api.dto;

import java.time.LocalDate;
import lombok.Builder;
import lombok.NonNull;

@Builder
public record PublicExaminerExamDateDTO(@NonNull LocalDate examDate, @NonNull Boolean isFull) {}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
import lombok.NonNull;

@Builder
public record ClerkUserDTO(@NonNull String oid) {}
public record ClerkUserDTO(@NonNull String oid, @NonNull Boolean isAdmin, @NonNull Boolean isExaminer) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package fi.oph.vkt.api.dto.examiner;

import fi.oph.vkt.api.dto.MunicipalityDTO;
import jakarta.validation.constraints.NotEmpty;
import java.util.List;
import lombok.Builder;
import lombok.NonNull;

@Builder
public record ExaminerDetailsDTO(
@NonNull Long id,
@NonNull Integer version,
@NonNull String oid,
@NonNull String email,
@NonNull String phoneNumber,
@NonNull String lastName,
@NonNull String firstName,
@NonNull Boolean examLanguageFinnish,
@NonNull Boolean examLanguageSwedish,
@NonNull Boolean isPublic,
@NonNull @NotEmpty List<MunicipalityDTO> municipalities
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package fi.oph.vkt.api.dto.examiner;

import lombok.Builder;
import lombok.NonNull;

@Builder
public record ExaminerDetailsInitDTO(@NonNull String oid, @NonNull String lastName, @NonNull String firstName) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package fi.oph.vkt.api.dto.examiner;

import fi.oph.vkt.api.dto.MunicipalityDTO;
import jakarta.validation.constraints.NotEmpty;
import java.util.List;
import lombok.Builder;
import lombok.NonNull;

@Builder
public record ExaminerDetailsUpsertDTO(
@NonNull String email,
@NonNull String phoneNumber,
@NonNull Boolean examLanguageFinnish,
@NonNull Boolean examLanguageSwedish,
@NonNull Boolean isPublic,
@NonNull @NotEmpty List<MunicipalityDTO> municipalities
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package fi.oph.vkt.api.dto.examiner;

import lombok.Builder;
import lombok.NonNull;

@Builder
public record ExaminerUserDTO(@NonNull String oid) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package fi.oph.vkt.api.examiner;

import fi.oph.vkt.api.dto.examiner.ExaminerDetailsDTO;
import fi.oph.vkt.api.dto.examiner.ExaminerDetailsInitDTO;
import fi.oph.vkt.api.dto.examiner.ExaminerDetailsUpsertDTO;
import fi.oph.vkt.service.ExaminerDetailsService;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.annotation.Resource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value = "/api/v1/tv/{oid}", produces = MediaType.APPLICATION_JSON_VALUE)
public class ExaminerDetailsController {

private static final String TAG_EXAMINER = "Examiner details API";

@Resource
private ExaminerDetailsService examinerDetailsService;

@GetMapping
@Operation(tags = TAG_EXAMINER, summary = "Get examiner details")
public ExaminerDetailsDTO getExaminerDetails(@PathVariable("oid") String oid) {
return examinerDetailsService.getExaminer(oid);
}

@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
@Operation(tags = TAG_EXAMINER, summary = "Create or update examiner")
public ExaminerDetailsDTO upsertExaminer(
@PathVariable("oid") String oid,
@RequestBody ExaminerDetailsUpsertDTO examinerDetailsUpsertDTO
) {
return examinerDetailsService.upsertExaminer(oid, examinerDetailsUpsertDTO);
}

@GetMapping(path = "/init")
@Operation(tags = TAG_EXAMINER, summary = "Get personal data needed for initializing examiner details")
public ExaminerDetailsInitDTO getInitialExaminerDetails(@PathVariable("oid") String oid) {
return examinerDetailsService.getInitialExaminerPersonalData(oid);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package fi.oph.vkt.api.examiner;

import fi.oph.vkt.api.dto.clerk.ClerkExamEventListDTO;
import io.swagger.v3.oas.annotations.Operation;
import java.util.List;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/api/v1/tv/{oid}/examEvent", produces = MediaType.APPLICATION_JSON_VALUE)
public class ExaminerExamEventController {

private static final String TAG_EXAMINER_EXAM_EVENT = "Exam event API for examiners";

@GetMapping
@Operation(tags = TAG_EXAMINER_EXAM_EVENT, summary = "List all exam events")
public List<ClerkExamEventListDTO> list(@PathVariable String oid) {
return List.of();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package fi.oph.vkt.api.examiner;

import fi.oph.vkt.api.dto.examiner.ExaminerUserDTO;
import org.springframework.http.MediaType;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/api/v1/tv/user", produces = MediaType.APPLICATION_JSON_VALUE)
public class ExaminerUserController {

@GetMapping(path = "")
public ExaminerUserDTO currentExaminerUser() {
final String oid = SecurityContextHolder.getContext().getAuthentication().getName();
return ExaminerUserDTO.builder().oid(oid).build();
}
}
34 changes: 34 additions & 0 deletions backend/vkt/src/main/java/fi/oph/vkt/config/AppConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@
import fi.oph.vkt.service.email.sender.EmailSender;
import fi.oph.vkt.service.email.sender.EmailSenderNoOp;
import fi.oph.vkt.service.email.sender.EmailSenderViestintapalvelu;
import fi.oph.vkt.service.onr.OnrOperationApi;
import fi.oph.vkt.service.onr.OnrOperationApiImpl;
import fi.oph.vkt.service.onr.mock.MockOnrOperationApiImpl;
import fi.oph.vkt.util.UUIDSource;
import fi.vm.sade.javautils.nio.cas.CasClient;
import fi.vm.sade.javautils.nio.cas.CasClientBuilder;
import fi.vm.sade.javautils.nio.cas.CasConfig;
import java.time.Duration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -143,6 +149,34 @@ public AwsCredentialsProvider defaultAwsCredentialsProvider() {
return ContainerCredentialsProvider.builder().build();
}

@Bean
@Profile("dev")
public OnrOperationApi onrOperationApiMock() {
LOG.warn("OnrOperationApiMock in use");
return new MockOnrOperationApiImpl();
}

@Bean
@Profile("!dev")
public OnrOperationApi onrOperationApiImpl(
@Value("${app.onr.service-url}") final String onrServiceUrl,
@Value("${cas.url}") final String casUrl,
@Value("${app.onr.cas.username}") final String casUsername,
@Value("${app.onr.cas.password}") final String casPassword
) {
LOG.info("onrServiceUrl: {}", onrServiceUrl);
final CasConfig casConfig = CasConfig.SpringSessionCasConfig(
casUsername,
casPassword,
casUrl,
onrServiceUrl,
Constants.CALLER_ID,
Constants.CALLER_ID
);
final CasClient casClient = CasClientBuilder.build(casConfig);
return new OnrOperationApiImpl(casClient, onrServiceUrl);
}

private static WebClient.Builder webClientBuilderWithCallerId(final String connectionProviderName) {
ConnectionProvider connectionProvider = ConnectionProvider
.builder(connectionProviderName)
Expand Down
4 changes: 4 additions & 0 deletions backend/vkt/src/main/java/fi/oph/vkt/config/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ public class Constants {
public static final String EMAIL_SENDER_NAME = "Valtionhallinnon kielitutkinnot | Opetushallitus";
public static final String SERVICENAME = "vkt";
public static final String APP_ROLE = "APP_VKT";
// TODO Get actual role
public static final String APP_ADMIN_ROLE = "APP_VKT_PAAKAYTTAJA";
// TODO Get actual role
public static final String APP_TV_ROLE = "APP_VKT_TUTKINNON_VASTAANOTTAJA";

// For now, no containers are run in untuva during nighttime
// Daily at 9:00
Expand Down
Loading

0 comments on commit c720c98

Please sign in to comment.