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
108 changes: 50 additions & 58 deletions api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@
<start-class>edu.wgu.osmt.ApplicationKt</start-class>
<testcontainers.version>1.15.3</testcontainers.version>
<spring-data-elasticsearch.version>4.1.0-RC2</spring-data-elasticsearch.version>
<ehcache.version>3.9.2</ehcache.version>
<bucket4j.version>4.10.0</bucket4j.version>
</properties>

<dependencies>
Expand Down Expand Up @@ -99,6 +97,7 @@
<dependency>
<groupId>com.okta.spring</groupId>
<artifactId>okta-spring-boot-starter</artifactId>
<version>${okta.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.exposed</groupId>
Expand Down Expand Up @@ -171,11 +170,6 @@
<artifactId>flyway-core</artifactId>
<version>${flywaydb.version}</version>
</dependency>
<dependency>
<groupId>com.okta.spring</groupId>
<artifactId>okta-spring-boot-starter</artifactId>
<version>${okta.version}</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
Expand Down Expand Up @@ -215,56 +209,6 @@
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.giffing.bucket4j.spring.boot.starter</groupId>
<artifactId>bucket4j-spring-boot-starter</artifactId>
<version>0.3.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
<dependency>
<groupId>com.github.vladimir-bukhtoyarov</groupId>
<artifactId>bucket4j-core</artifactId>
<version>${bucket4j.version}</version>
</dependency>
<dependency>
<groupId>com.github.vladimir-bukhtoyarov</groupId>
<artifactId>bucket4j-jcache</artifactId>
<version>${bucket4j.version}</version>
</dependency>
<dependency>
<groupId>com.giffing.bucket4j.spring.boot.starter</groupId>
<artifactId>bucket4j-spring-boot-starter</artifactId>
<version>0.3.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
<dependency>
<groupId>com.github.vladimir-bukhtoyarov</groupId>
<artifactId>bucket4j-core</artifactId>
<version>${bucket4j.version}</version>
</dependency>
<dependency>
<groupId>com.github.vladimir-bukhtoyarov</groupId>
<artifactId>bucket4j-jcache</artifactId>
<version>${bucket4j.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
Expand Down Expand Up @@ -320,7 +264,7 @@
<version>${flywaydb.version}</version>
<configuration>
<url>jdbc:mysql://localhost:3306/osmt_db</url>
<user>changeme</user>
<user>osmt</user>
<password>password</password>
<locations>
<location>classpath:db/migration</location>
Expand Down Expand Up @@ -352,7 +296,55 @@
<commitIdGenerationMode>full</commitIdGenerationMode>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-help-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>show-profiles</id>
<phase>compile</phase>
<goals>
<goal>active-profiles</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

<profiles>
<profile>
<id>dockerfile-build</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<!-- for Kotlin files, don't include the extension - https://stackoverflow.com/questions/39723763/kotlin-maven-not-executing-tests#39735811 -->
<exclude>AuditLogRepositoryTest</exclude>
<exclude>BatchImportRichSkillTest</exclude>
<exclude>BlsImportTest</exclude>
<exclude>CollectionEsRepoTest</exclude>
<exclude>CollectionRepositoryTest</exclude>
<exclude>ElasticSearchReindexerTest</exclude>
<exclude>JobCodeEsRepoTest</exclude>
<exclude>JobCodeRepositoryTest</exclude>
<exclude>KeywordEsRepoTest</exclude>
<exclude>KeywordRepositoryTest</exclude>
<exclude>OnetImportTest</exclude>
<exclude>RichSkillControllerTest</exclude>
<exclude>RichSkillEsRepoTest</exclude>
<exclude>RichSkillRepositoryTest</exclude>
<exclude>SearchControllerTest</exclude>
<exclude>TaskTest</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
2 changes: 0 additions & 2 deletions api/src/main/kotlin/edu/wgu/osmt/ApiServer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.cache.annotation.EnableCaching
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Profile
import org.springframework.stereotype.Component
Expand All @@ -28,7 +27,6 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc
@Component
@Profile("apiserver")
@EnableWebMvc
@EnableCaching
class ApiServer {
val logger: Logger = LoggerFactory.getLogger(ApiServer::class.java)

Expand Down
2 changes: 0 additions & 2 deletions api/src/main/kotlin/edu/wgu/osmt/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.ConfigurationPropertiesScan
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.runApplication
import org.springframework.cache.annotation.EnableCaching

@SpringBootApplication
@EnableCaching
@ConfigurationPropertiesScan("edu.wgu.osmt.config")
@EnableConfigurationProperties(DbConfig::class, EsConfig::class)
class Application
Expand Down
10 changes: 2 additions & 8 deletions api/src/main/kotlin/edu/wgu/osmt/HasAllPaginated.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import edu.wgu.osmt.elasticsearch.*
import org.springframework.http.HttpEntity
import org.springframework.http.HttpHeaders
import org.springframework.http.ResponseEntity
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.security.oauth2.jwt.Jwt
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.util.UriComponentsBuilder

Expand All @@ -35,14 +33,10 @@ interface HasAllPaginated<T> {
required = false,
defaultValue = PublishStatus.DEFAULT_API_PUBLISH_STATUS_SET
) status: Array<String>,
@RequestParam(required = false) sort: String?,
@AuthenticationPrincipal user: Jwt?
@RequestParam(required = false) sort: String?
): HttpEntity<List<T>> {

val publishStatuses = status.mapNotNull {
val status = PublishStatus.forApiValue(it)
if (user == null && (status == PublishStatus.Deleted || status == PublishStatus.Draft)) null else status
}.toSet()
val publishStatuses = status.mapNotNull { PublishStatus.forApiValue(it) }.toSet()
val sortEnum: SortOrder = sortOrderCompanion.forValueOrDefault(sort)
val pageable = OffsetPageable(from, size, sortEnum.sort)

Expand Down
10 changes: 2 additions & 8 deletions api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,15 @@ object RoutePaths {
const val SEARCH_COLLECTIONS = "$SEARCH_PATH/collections"

const val SKILLS_PATH = "/api/skills"
const val SKILLS_LIST = SKILLS_PATH
const val SKILLS_CREATE = SKILLS_PATH
const val SKILL_LIST = SKILLS_PATH
const val SKILL_PUBLISH = "$SKILLS_PATH/publish"
const val SKILL_DETAIL = "$SKILLS_PATH/{uuid}"
const val SKILL_UPDATE = "$SKILL_DETAIL/update"
const val SKILL_AUDIT_LOG = "${SKILL_DETAIL}/log"


const val COLLECTIONS_PATH = "/api/collections"
const val COLLECTIONS_LIST = COLLECTIONS_PATH
const val COLLECTION_CREATE = COLLECTIONS_PATH
const val COLLECTION_LIST = COLLECTIONS_PATH
const val COLLECTION_PUBLISH = "$COLLECTIONS_PATH/publish"
const val COLLECTION_DETAIL = "${COLLECTIONS_PATH}/{uuid}"
const val COLLECTION_UPDATE = "${COLLECTION_DETAIL}/update"
Expand All @@ -44,8 +42,4 @@ object RoutePaths {
const val SORT = "sort"
const val COLLECTION_ID = "collectionId"
}

fun scrubForConfigure(routePath: String): String {
return routePath.replace("{uuid}", "*")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package edu.wgu.osmt.collection

import edu.wgu.osmt.HasAllPaginated
import edu.wgu.osmt.RoutePaths
import edu.wgu.osmt.api.GeneralApiException
import edu.wgu.osmt.api.model.*
import edu.wgu.osmt.auditlog.AuditLog
import edu.wgu.osmt.auditlog.AuditLogRepository
Expand Down Expand Up @@ -37,23 +36,19 @@ class CollectionController @Autowired constructor(

override val elasticRepository = collectionEsRepo

override val allPaginatedPath: String = RoutePaths.COLLECTIONS_LIST
override val allPaginatedPath: String = RoutePaths.COLLECTIONS_PATH
override val sortOrderCompanion = CollectionSortEnum.Companion

@GetMapping(RoutePaths.COLLECTIONS_LIST, produces = [MediaType.APPLICATION_JSON_VALUE])
@GetMapping(RoutePaths.COLLECTIONS_PATH, produces = [MediaType.APPLICATION_JSON_VALUE])
@ResponseBody
override fun allPaginated(
uriComponentsBuilder: UriComponentsBuilder,
size: Int,
from: Int,
status: Array<String>,
sort: String?,
@AuthenticationPrincipal user: Jwt?
sort: String?
): HttpEntity<List<CollectionDoc>> {
if (!appConfig.allowPublicLists && user === null) {
throw GeneralApiException("Unauthorized", HttpStatus.UNAUTHORIZED)
}
return super.allPaginated(uriComponentsBuilder, size, from, status, sort, user)
return super.allPaginated(uriComponentsBuilder, size, from, status, sort)
}

@GetMapping(RoutePaths.COLLECTION_DETAIL, produces = [MediaType.APPLICATION_JSON_VALUE])
Expand All @@ -69,7 +64,7 @@ class CollectionController @Autowired constructor(
return "forward:/collections/$uuid"
}

@PostMapping(RoutePaths.COLLECTION_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE])
@PostMapping(RoutePaths.COLLECTIONS_PATH, produces = [MediaType.APPLICATION_JSON_VALUE])
@ResponseBody
fun createCollections(
@RequestBody apiCollectionUpdates: List<ApiCollectionUpdate>,
Expand Down
6 changes: 0 additions & 6 deletions api/src/main/kotlin/edu/wgu/osmt/config/AppConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,6 @@ class AppConfig(
@Value("\${app.loginSuccessRedirectUrl}")
val loginSuccessRedirectUrl: String,

@Value("\${app.allowPublicSearching}")
val allowPublicSearching: Boolean = true,

@Value("\${app.allowPublicLists}")
val allowPublicLists: Boolean = true,

@Value("\${app.baseLineAuditLogIfEmpty}")
val baseLineAuditLogIfEmpty: Boolean
) {
Expand Down
31 changes: 6 additions & 25 deletions api/src/main/kotlin/edu/wgu/osmt/elasticsearch/SearchController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ import edu.wgu.osmt.richskill.RichSkillEsRepo
import edu.wgu.osmt.richskill.RichSkillDoc
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.*
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.security.oauth2.jwt.Jwt
import org.springframework.stereotype.Controller
import org.springframework.transaction.annotation.Transactional
import org.springframework.web.bind.annotation.*
Expand Down Expand Up @@ -46,17 +44,9 @@ class SearchController @Autowired constructor(
defaultValue = PublishStatus.DEFAULT_API_PUBLISH_STATUS_SET
) status: Array<String>,
@RequestParam(required = false) sort: String?,
@RequestBody apiSearch: ApiSearch,
@AuthenticationPrincipal user: Jwt?
@RequestBody apiSearch: ApiSearch
): HttpEntity<List<CollectionDoc>> {
if (!appConfig.allowPublicSearching && user === null) {
throw GeneralApiException("Unauthorized", HttpStatus.UNAUTHORIZED)
}

val publishStatuses = status.mapNotNull {
val status = PublishStatus.forApiValue(it)
if (user == null && (status == PublishStatus.Deleted || status == PublishStatus.Draft)) null else status
}.toSet()
val publishStatuses = status.mapNotNull { PublishStatus.forApiValue(it) }.toSet()
val sortEnum: CollectionSortEnum = CollectionSortEnum.forValueOrDefault(sort)
val pageable = OffsetPageable(from, size, sortEnum.sort)

Expand Down Expand Up @@ -95,17 +85,9 @@ class SearchController @Autowired constructor(
) status: Array<String>,
@RequestParam(required = false) sort: String?,
@RequestParam(required = false) collectionId: String?,
@RequestBody apiSearch: ApiSearch,
@AuthenticationPrincipal user: Jwt?
@RequestBody apiSearch: ApiSearch
): HttpEntity<List<RichSkillDoc>> {
if (!appConfig.allowPublicSearching && user === null) {
throw GeneralApiException("Unauthorized", HttpStatus.UNAUTHORIZED)
}

val publishStatuses = status.mapNotNull {
val status = PublishStatus.forApiValue(it)
if (user == null && (status == PublishStatus.Deleted || status == PublishStatus.Draft)) null else status
}.toSet()
val publishStatuses = status.mapNotNull { PublishStatus.forApiValue(it) }.toSet()
val sortEnum = sort?.let{SkillSortEnum.forApiValue(it)}
val pageable = OffsetPageable(offset = from, limit = size, sort = sortEnum?.sort)

Expand Down Expand Up @@ -150,10 +132,9 @@ class SearchController @Autowired constructor(
) status: Array<String>,
@RequestParam(required = false) sort: String?,
@PathVariable uuid: String,
@RequestBody apiSearch: ApiSearch,
@AuthenticationPrincipal user: Jwt?
@RequestBody apiSearch: ApiSearch
): HttpEntity<List<RichSkillDoc>> {
return searchSkills(uriComponentsBuilder, size, from, status, sort, uuid, apiSearch, user)
return searchSkills(uriComponentsBuilder, size, from, status, sort, uuid, apiSearch)
}

@GetMapping(RoutePaths.SEARCH_JOBCODES_PATH, produces = [MediaType.APPLICATION_JSON_VALUE])
Expand Down
15 changes: 5 additions & 10 deletions api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package edu.wgu.osmt.richskill

import edu.wgu.osmt.HasAllPaginated
import edu.wgu.osmt.RoutePaths
import edu.wgu.osmt.api.GeneralApiException
import edu.wgu.osmt.api.model.*
import edu.wgu.osmt.auditlog.AuditLog
import edu.wgu.osmt.auditlog.AuditLogRepository
Expand Down Expand Up @@ -37,26 +36,22 @@ class RichSkillController @Autowired constructor(

val keywordDao = KeywordDao.Companion

override val allPaginatedPath: String = RoutePaths.SKILLS_LIST
override val allPaginatedPath: String = RoutePaths.SKILLS_PATH
override val sortOrderCompanion = SkillSortEnum.Companion

@GetMapping(RoutePaths.SKILLS_LIST, produces = [MediaType.APPLICATION_JSON_VALUE])
@GetMapping(RoutePaths.SKILLS_PATH, produces = [MediaType.APPLICATION_JSON_VALUE])
@ResponseBody
override fun allPaginated(
uriComponentsBuilder: UriComponentsBuilder,
size: Int,
from: Int,
status: Array<String>,
sort: String?,
@AuthenticationPrincipal user: Jwt?
sort: String?
): HttpEntity<List<RichSkillDoc>> {
if (!appConfig.allowPublicLists && user === null) {
throw GeneralApiException("Unauthorized", HttpStatus.UNAUTHORIZED)
}
return super.allPaginated(uriComponentsBuilder, size, from, status, sort, user)
return super.allPaginated(uriComponentsBuilder, size, from, status, sort)
}

@PostMapping(RoutePaths.SKILLS_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE])
@PostMapping(RoutePaths.SKILLS_PATH, produces = [MediaType.APPLICATION_JSON_VALUE])
@ResponseBody
fun createSkills(
@RequestBody apiSkillUpdates: List<ApiSkillUpdate>,
Expand Down
Loading