From 36f84e345a5b1070b8ffa0827313e7173dcc8013 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Thu, 4 May 2023 15:57:24 -0600 Subject: [PATCH 01/16] Add paths for jobcodes --- api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt index 6ad9e2c57..60c5bc265 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt @@ -58,6 +58,14 @@ object RoutePaths { const val ES_ADMIN_DELETE_INDICES = "$ES_ADMIN/delete-indices" const val ES_ADMIN_REINDEX = "$ES_ADMIN/reindex" + const val METADATA_PATH = "$API/metadata" + const val JOB_CODE_PATH = "$METADATA_PATH/job-codes" + const val JOB_CODE_CREATE = JOB_CODE_PATH + const val JOB_CODE_LIST = JOB_CODE_PATH + const val JOB_CODE_DETAIL = "$JOB_CODE_PATH/{uuid}" + const val JOB_CODE_UPDATE = "$JOB_CODE_DETAIL/update" + const val JOB_CODE_REMOVE = "$JOB_CODE_DETAIL/remove" + object QueryParams { const val FROM = "from" const val SIZE = "size" From 9d43ec46d5477aac900c09c0cb0b1a9fcdce1dce Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Thu, 4 May 2023 15:58:10 -0600 Subject: [PATCH 02/16] Enable EnableGlobalMethodSecurity - Add EnableGlobalMethodSecurity annotation in SecurityConfig --- api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt b/api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt index 95b106eaf..ba6a00055 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt @@ -12,6 +12,7 @@ import edu.wgu.osmt.RoutePaths.COLLECTION_SKILLS import edu.wgu.osmt.RoutePaths.COLLECTION_SKILLS_UPDATE import edu.wgu.osmt.RoutePaths.COLLECTION_UPDATE import edu.wgu.osmt.RoutePaths.COLLECTION_XLSX +import edu.wgu.osmt.RoutePaths.JOB_CODE_PATH import edu.wgu.osmt.RoutePaths.SEARCH_COLLECTIONS import edu.wgu.osmt.RoutePaths.SEARCH_JOBCODES_PATH import edu.wgu.osmt.RoutePaths.SEARCH_KEYWORDS_PATH @@ -34,6 +35,7 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Profile import org.springframework.http.HttpMethod.* +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter @@ -58,6 +60,7 @@ import javax.servlet.http.HttpServletResponse @Configuration @EnableWebSecurity @Profile("oauth2-okta | OTHER-OAUTH-PROFILE") +@EnableGlobalMethodSecurity(prePostEnabled = true) class SecurityConfig : WebSecurityConfigurerAdapter() { @Autowired @@ -83,6 +86,7 @@ class SecurityConfig : WebSecurityConfigurerAdapter() { .mvcMatchers(GET, TASK_DETAIL_BATCH).authenticated() .mvcMatchers(GET, SEARCH_JOBCODES_PATH).authenticated() .mvcMatchers(GET, SEARCH_KEYWORDS_PATH).authenticated() + // .mvcMatchers(JOB_CODE_PATH).hasAnyAuthority("ROLE_Osmt_View", "ROLE_Osmt_Admin") // public search endpoints .mvcMatchers(POST, SEARCH_SKILLS).permitAll() @@ -129,6 +133,7 @@ class SecurityConfig : WebSecurityConfigurerAdapter() { .mvcMatchers(POST, SKILL_UPDATE).hasAnyAuthority(ADMIN, CURATOR) .mvcMatchers(POST, SKILLS_CREATE).hasAnyAuthority(ADMIN, CURATOR) .mvcMatchers(POST, SKILL_PUBLISH).hasAnyAuthority(ADMIN) + // .mvcMatchers(JOB_CODE_PATH).hasAnyAuthority(ADMIN, VIEW) .mvcMatchers(POST, COLLECTION_CREATE).hasAnyAuthority(ADMIN, CURATOR) .mvcMatchers(POST, COLLECTION_PUBLISH).hasAnyAuthority(ADMIN) From 2e8bb85ef170f25a920ce8a47ca9b69ce0e3ebc9 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Fri, 5 May 2023 10:32:11 -0600 Subject: [PATCH 03/16] Add crud methods for job code --- .../main/kotlin/edu/wgu/osmt/RoutePaths.kt | 6 +- .../edu/wgu/osmt/api/model/JobCodeUpdate.kt | 17 ++++ .../edu/wgu/osmt/jobcode/JobCodeController.kt | 79 +++++++++++++++++++ .../edu/wgu/osmt/jobcode/JobCodeEsRepo.kt | 11 +++ .../edu/wgu/osmt/jobcode/JobCodeRepository.kt | 13 +++ 5 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt create mode 100644 api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt diff --git a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt index 60c5bc265..0e1f63106 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt @@ -62,9 +62,9 @@ object RoutePaths { const val JOB_CODE_PATH = "$METADATA_PATH/job-codes" const val JOB_CODE_CREATE = JOB_CODE_PATH const val JOB_CODE_LIST = JOB_CODE_PATH - const val JOB_CODE_DETAIL = "$JOB_CODE_PATH/{uuid}" - const val JOB_CODE_UPDATE = "$JOB_CODE_DETAIL/update" - const val JOB_CODE_REMOVE = "$JOB_CODE_DETAIL/remove" + const val JOB_CODE_DETAIL = "$JOB_CODE_PATH/{id}" + const val JOB_CODE_UPDATE = JOB_CODE_DETAIL + const val JOB_CODE_REMOVE = JOB_CODE_DETAIL object QueryParams { const val FROM = "from" diff --git a/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt b/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt new file mode 100644 index 000000000..78481c4b0 --- /dev/null +++ b/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt @@ -0,0 +1,17 @@ +package edu.wgu.osmt.api.model + +import com.fasterxml.jackson.annotation.JsonProperty + +data class JobCodeUpdate( + @JsonProperty("code") + val code: String = "", + @JsonProperty("frameworkName") + val framework: String = "", + @JsonProperty("targetNodeName") + val targetNodeName: String = "", + @JsonProperty("level") + val level: String = "", + @JsonProperty("description") + val description: String = "" +) { +} \ No newline at end of file diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt new file mode 100644 index 000000000..8ff45e783 --- /dev/null +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt @@ -0,0 +1,79 @@ +package edu.wgu.osmt.jobcode; + +import edu.wgu.osmt.PaginationDefaults +import edu.wgu.osmt.RoutePaths +import edu.wgu.osmt.api.model.ApiJobCode +import edu.wgu.osmt.api.model.JobCodeUpdate +import edu.wgu.osmt.collection.CollectionDao +import edu.wgu.osmt.config.AppConfig +import edu.wgu.osmt.elasticsearch.OffsetPageable +import edu.wgu.osmt.task.TaskResult +import edu.wgu.osmt.task.TaskStatus +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.security.access.annotation.Secured +import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.* +import java.util.* +import javax.annotation.security.RolesAllowed + +@Controller +@Transactional +class JobCodeController @Autowired constructor( + val jobCodeEsRepo: JobCodeEsRepo, + val jobCodeRepository: JobCodeRepository, + val appConfig: AppConfig +) { + + val dao = JobCodeDao.Companion + + @GetMapping(RoutePaths.JOB_CODE_LIST, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("hasRole('Osmt_Admin') or hasRole('Osmt_Curator')") + fun allPaginated( + @RequestParam query: String, + @RequestParam(required = false, defaultValue = PaginationDefaults.size.toString()) size: Int, + @RequestParam(required = false, defaultValue = "0") from: Int, + ): HttpEntity> { + val searchResults = jobCodeEsRepo.typeAheadSearch(query, OffsetPageable(from, size, null)) + return ResponseEntity.status(200).body(searchResults.map { ApiJobCode.fromJobCode(it.content) }.toList()) + } + + @GetMapping(RoutePaths.JOB_CODE_DETAIL, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("hasRole('Osmt_Admin') or hasRole('Osmt_Curator')") + fun byUuid( + @PathVariable id: Int, + ): HttpEntity { + val jobCode = jobCodeEsRepo.findById(id) + return ResponseEntity.status(200).body(ApiJobCode.fromJobCode(jobCode.get())) + } + + @PostMapping(RoutePaths.JOB_CODE_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("hasRole('Osmt_Admin')") + fun createJobCode( + @RequestBody jobCodeUpdate: JobCodeUpdate + ): HttpEntity { + val newJobCode = jobCodeRepository.create("20-300", "vn") + return ResponseEntity.status(200).body(ApiJobCode.fromJobCode(newJobCode.toModel())) + } + + @PutMapping(RoutePaths.JOB_CODE_UPDATE, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("hasRole('Osmt_Admin')") + fun updateJobCode( + @PathVariable id: Int, + ): HttpEntity { + return ResponseEntity.status(200).body(ApiJobCode(code = "1", targetNode = "target", targetNodeName = "targetNodeName", frameworkName = "frameworkName")) + } + + @DeleteMapping(RoutePaths.JOB_CODE_REMOVE) + @PreAuthorize("hasRole('Osmt_Admin')") + fun deleteJobCode( + @PathVariable id: Int, + ): HttpEntity { + return ResponseEntity.status(200).body(TaskResult(uuid = "uuid", contentType = "json", status = TaskStatus.Processing, apiResultPath = "path")) + } + +} \ No newline at end of file diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeEsRepo.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeEsRepo.kt index 6bc1208bc..f2e1b21a7 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeEsRepo.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeEsRepo.kt @@ -20,6 +20,8 @@ interface CustomJobCodeRepository { val elasticSearchTemplate: ElasticsearchRestTemplate fun typeAheadSearch(query: String): SearchHits + fun typeAheadSearch(query: String, pageable: OffsetPageable): SearchHits + fun deleteIndex() { elasticSearchTemplate.indexOps(IndexCoordinates.of(INDEX_JOBCODE_DOC)).delete() } @@ -28,6 +30,15 @@ interface CustomJobCodeRepository { class CustomJobCodeRepositoryImpl @Autowired constructor(override val elasticSearchTemplate: ElasticsearchRestTemplate) : CustomJobCodeRepository { + override fun typeAheadSearch(query: String, pageable: OffsetPageable): SearchHits { + val nsq: NativeSearchQueryBuilder + val disjunctionQuery = JobCodeQueries.multiPropertySearch(query) + nsq = + NativeSearchQueryBuilder().withPageable(pageable).withQuery(disjunctionQuery) + .withSort(SortBuilders.fieldSort("${JobCode::code.name}.keyword").order(SortOrder.ASC)) + return elasticSearchTemplate.search(nsq.build(), JobCode::class.java) + } + override fun typeAheadSearch(query: String): SearchHits { val nsq: NativeSearchQueryBuilder diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt index e7d2186cd..42a0b160e 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt @@ -1,5 +1,6 @@ package edu.wgu.osmt.jobcode +import edu.wgu.osmt.api.model.JobCodeUpdate import org.jetbrains.exposed.sql.SizedIterable import org.jetbrains.exposed.sql.Table import org.jetbrains.exposed.sql.and @@ -19,6 +20,7 @@ interface JobCodeRepository { fun findByCodeOrCreate(code: String, framework: String? = null): JobCodeDao fun findBlsCode(code: String): JobCodeDao? fun create(code: String, framework: String? = null): JobCodeDao + fun createFromApi(jobCodeUpdate: JobCodeUpdate): JobCodeDao fun onetsByDetailCode(detailedCode: String): SizedIterable companion object { @@ -52,6 +54,17 @@ class JobCodeRepositoryImpl: JobCodeRepository { .firstOrNull()?.let { dao.wrapRow(it) } } + override fun createFromApi(jobCodeUpdate: JobCodeUpdate): JobCodeDao { + return dao.new { + this.code = jobCodeUpdate.code + this.framework = jobCodeUpdate.framework + this.name = jobCodeUpdate.targetNodeName + this.description = jobCodeUpdate.description + this.name = "my name" + this.major = "my major" + } + } + override fun findByCodeOrCreate(code: String, framework: String?): JobCodeDao { val existing = findByCode(code) return existing ?: create(code, framework) From 8ceff63629ec44d6a1f1b90de13434626138b19e Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Mon, 8 May 2023 09:27:10 -0600 Subject: [PATCH 04/16] Add paths for named references --- .../main/kotlin/edu/wgu/osmt/RoutePaths.kt | 7 ++ .../edu/wgu/osmt/jobcode/JobCodeController.kt | 28 +++---- .../edu/wgu/osmt/jobcode/JobCodeRepository.kt | 3 +- .../kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt | 19 +++++ .../osmt/keyword/NamedReferencesController.kt | 75 +++++++++++++++++++ 5 files changed, 115 insertions(+), 17 deletions(-) create mode 100644 api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt create mode 100644 api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt diff --git a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt index 0e1f63106..84a33b926 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt @@ -66,6 +66,13 @@ object RoutePaths { const val JOB_CODE_UPDATE = JOB_CODE_DETAIL const val JOB_CODE_REMOVE = JOB_CODE_DETAIL + const val NAMED_REFERENCES_PATH = "$METADATA_PATH/named-references" + const val NAMED_REFERENCES_CREATE = NAMED_REFERENCES_PATH + const val NAMED_REFERENCES_LIST = NAMED_REFERENCES_PATH + const val NAMED_REFERENCES_DETAIL = "$NAMED_REFERENCES_PATH/{id}" + const val NAMED_REFERENCES_UPDATE = NAMED_REFERENCES_DETAIL + const val NAMED_REFERENCES_REMOVE = NAMED_REFERENCES_DETAIL + object QueryParams { const val FROM = "from" const val SIZE = "size" diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt index 8ff45e783..ad1ea0263 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt @@ -4,35 +4,30 @@ import edu.wgu.osmt.PaginationDefaults import edu.wgu.osmt.RoutePaths import edu.wgu.osmt.api.model.ApiJobCode import edu.wgu.osmt.api.model.JobCodeUpdate -import edu.wgu.osmt.collection.CollectionDao import edu.wgu.osmt.config.AppConfig import edu.wgu.osmt.elasticsearch.OffsetPageable import edu.wgu.osmt.task.TaskResult import edu.wgu.osmt.task.TaskStatus -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpEntity import org.springframework.http.MediaType import org.springframework.http.ResponseEntity -import org.springframework.security.access.annotation.Secured import org.springframework.security.access.prepost.PreAuthorize -import org.springframework.stereotype.Controller; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.stereotype.Controller +import org.springframework.transaction.annotation.Transactional import org.springframework.web.bind.annotation.* import java.util.* -import javax.annotation.security.RolesAllowed @Controller @Transactional class JobCodeController @Autowired constructor( val jobCodeEsRepo: JobCodeEsRepo, - val jobCodeRepository: JobCodeRepository, - val appConfig: AppConfig + val jobCodeRepository: JobCodeRepository ) { - val dao = JobCodeDao.Companion - @GetMapping(RoutePaths.JOB_CODE_LIST, produces = [MediaType.APPLICATION_JSON_VALUE]) - @PreAuthorize("hasRole('Osmt_Admin') or hasRole('Osmt_Curator')") + @PreAuthorize("isAuthenticated()") fun allPaginated( @RequestParam query: String, @RequestParam(required = false, defaultValue = PaginationDefaults.size.toString()) size: Int, @@ -43,7 +38,7 @@ class JobCodeController @Autowired constructor( } @GetMapping(RoutePaths.JOB_CODE_DETAIL, produces = [MediaType.APPLICATION_JSON_VALUE]) - @PreAuthorize("hasRole('Osmt_Admin') or hasRole('Osmt_Curator')") + @PreAuthorize("isAuthenticated()") fun byUuid( @PathVariable id: Int, ): HttpEntity { @@ -52,24 +47,25 @@ class JobCodeController @Autowired constructor( } @PostMapping(RoutePaths.JOB_CODE_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE]) - @PreAuthorize("hasRole('Osmt_Admin')") + @PreAuthorize("hasAuthority(@appConfig.roleAdmin)") fun createJobCode( @RequestBody jobCodeUpdate: JobCodeUpdate ): HttpEntity { - val newJobCode = jobCodeRepository.create("20-300", "vn") + val newJobCode = jobCodeRepository.createFromApi(jobCodeUpdate) return ResponseEntity.status(200).body(ApiJobCode.fromJobCode(newJobCode.toModel())) } @PutMapping(RoutePaths.JOB_CODE_UPDATE, produces = [MediaType.APPLICATION_JSON_VALUE]) - @PreAuthorize("hasRole('Osmt_Admin')") + @PreAuthorize("hasAuthority(appConfig.roleAdmin)") fun updateJobCode( @PathVariable id: Int, + @RequestBody jobCodeUpdate: JobCodeUpdate ): HttpEntity { return ResponseEntity.status(200).body(ApiJobCode(code = "1", targetNode = "target", targetNodeName = "targetNodeName", frameworkName = "frameworkName")) } @DeleteMapping(RoutePaths.JOB_CODE_REMOVE) - @PreAuthorize("hasRole('Osmt_Admin')") + @PreAuthorize("hasAuthority(appConfig.roleAdmin)") fun deleteJobCode( @PathVariable id: Int, ): HttpEntity { diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt index 42a0b160e..aa176f7d5 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt @@ -59,10 +59,11 @@ class JobCodeRepositoryImpl: JobCodeRepository { this.code = jobCodeUpdate.code this.framework = jobCodeUpdate.framework this.name = jobCodeUpdate.targetNodeName + this.creationDate = LocalDateTime.now(ZoneOffset.UTC) this.description = jobCodeUpdate.description this.name = "my name" this.major = "my major" - } + }.also { jobCodeEsRepo.save(it.toModel()) } } override fun findByCodeOrCreate(code: String, framework: String?): JobCodeDao { diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt new file mode 100644 index 000000000..cd5b770e3 --- /dev/null +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt @@ -0,0 +1,19 @@ +package edu.wgu.osmt.keyword + +import edu.wgu.osmt.api.model.ApiNamedReference + +data class ApiKeyword( + val id: Long?, + val name: String?, + val value: String?, + val type: KeywordTypeEnum, + val framework: String? +) { + + companion object factory { + fun fromKeyword(keyword: Keyword): ApiKeyword { + return ApiKeyword(keyword.id, keyword.value, keyword.value, keyword.type, keyword.framework) + } + } + +} \ No newline at end of file diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt new file mode 100644 index 000000000..ba29d189d --- /dev/null +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt @@ -0,0 +1,75 @@ +package edu.wgu.osmt.keyword + +import edu.wgu.osmt.PaginationDefaults +import edu.wgu.osmt.RoutePaths +import edu.wgu.osmt.api.model.ApiJobCode +import edu.wgu.osmt.api.model.ApiNamedReference +import edu.wgu.osmt.api.model.JobCodeUpdate +import edu.wgu.osmt.task.TaskResult +import edu.wgu.osmt.task.TaskStatus +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpEntity +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.stereotype.Controller +import org.springframework.transaction.annotation.Transactional +import org.springframework.web.bind.annotation.* +import org.springframework.web.server.ResponseStatusException + +@Controller +@Transactional +class NamedReferencesController @Autowired constructor( + val keywordEsRepo: KeywordEsRepo, + val keywordRepository: KeywordRepository +) { + + @GetMapping(RoutePaths.NAMED_REFERENCES_LIST, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("isAuthenticated()") + fun allPaginated( + @RequestParam query: String, + @RequestParam(required = false, defaultValue = PaginationDefaults.size.toString()) size: Int, + @RequestParam(required = false, defaultValue = "0") from: Int, + @RequestParam(required = true) type: String + ): HttpEntity> { + val keywordType = KeywordTypeEnum.forApiValue(type) ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST) + val searchResults = keywordEsRepo.typeAheadSearch(query, keywordType) + return ResponseEntity.status(200).body(searchResults.map { ApiKeyword.fromKeyword(it.content) }.toList()) + } + + @GetMapping(RoutePaths.NAMED_REFERENCES_DETAIL, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("isAuthenticated()") + fun byUuid( + @PathVariable id: Int, + ): HttpEntity { + val keyword = keywordEsRepo.findById(id) + return ResponseEntity.status(200).body(ApiKeyword.fromKeyword(keyword.get())) + } + + @PostMapping(RoutePaths.JOB_CODE_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("hasAuthority(@appConfig.roleAdmin)") + fun createNamedReference( + @RequestBody apiKeyword: ApiKeyword + ): HttpEntity { + return ResponseEntity.status(200).body(ApiKeyword(2, "my keyword", "my value", KeywordTypeEnum.Keyword, "my framework")) + } + + @PutMapping(RoutePaths.NAMED_REFERENCES_UPDATE, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("hasAuthority(appConfig.roleAdmin)") + fun updateNamedReference( + @PathVariable id: Int, + @RequestBody apiKeyword: ApiKeyword + ): HttpEntity { + return ResponseEntity.status(200).body(ApiKeyword(134, "my name", "my value", KeywordTypeEnum.Keyword, "my framework")) + } + + @DeleteMapping(RoutePaths.NAMED_REFERENCES_REMOVE) + @PreAuthorize("hasAuthority(appConfig.roleAdmin)") + fun deleteNamedReference( + @PathVariable id: Int, + ): HttpEntity { + return ResponseEntity.status(200).body(TaskResult(uuid = "uuid", contentType = "json", status = TaskStatus.Processing, apiResultPath = "path")) + } + +} \ No newline at end of file From 9e7f963522a81f3522bd2fc8fea60b43d4988e30 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Tue, 9 May 2023 11:35:53 -0600 Subject: [PATCH 05/16] Update request and response properties --- .../edu/wgu/osmt/api/model/JobCodeUpdate.kt | 19 +++++++----- .../edu/wgu/osmt/jobcode/JobCodeController.kt | 29 +++++++++---------- .../edu/wgu/osmt/jobcode/JobCodeRepository.kt | 24 ++++++++------- .../kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt | 14 ++++++++- .../osmt/keyword/NamedReferencesController.kt | 28 ++++++++++-------- 5 files changed, 67 insertions(+), 47 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt b/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt index 78481c4b0..0af29d829 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt @@ -1,17 +1,22 @@ package edu.wgu.osmt.api.model import com.fasterxml.jackson.annotation.JsonProperty +import edu.wgu.osmt.db.JobCodeLevel data class JobCodeUpdate( @JsonProperty("code") - val code: String = "", - @JsonProperty("frameworkName") - val framework: String = "", + val code: String, + @JsonProperty("targetNode") + val targetNode: String? = null, @JsonProperty("targetNodeName") - val targetNodeName: String = "", + val targetNodeName: String? = null, + @JsonProperty("frameworkName") + val framework: String? = null, @JsonProperty("level") - val level: String = "", - @JsonProperty("description") - val description: String = "" + val level: JobCodeLevel? = null, + @JsonProperty("parents") + val parents: List? = null + // @JsonProperty("description") + // val description: String = "" ) { } \ No newline at end of file diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt index ad1ea0263..2cd671abd 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt @@ -1,15 +1,12 @@ package edu.wgu.osmt.jobcode; -import edu.wgu.osmt.PaginationDefaults import edu.wgu.osmt.RoutePaths import edu.wgu.osmt.api.model.ApiJobCode import edu.wgu.osmt.api.model.JobCodeUpdate -import edu.wgu.osmt.config.AppConfig import edu.wgu.osmt.elasticsearch.OffsetPageable import edu.wgu.osmt.task.TaskResult import edu.wgu.osmt.task.TaskStatus import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpEntity import org.springframework.http.MediaType import org.springframework.http.ResponseEntity @@ -29,11 +26,11 @@ class JobCodeController @Autowired constructor( @GetMapping(RoutePaths.JOB_CODE_LIST, produces = [MediaType.APPLICATION_JSON_VALUE]) @PreAuthorize("isAuthenticated()") fun allPaginated( - @RequestParam query: String, - @RequestParam(required = false, defaultValue = PaginationDefaults.size.toString()) size: Int, - @RequestParam(required = false, defaultValue = "0") from: Int, + @RequestParam(required = true) size: Int, + @RequestParam(required = true) from: Int, + @RequestParam(required = false) sort: String? ): HttpEntity> { - val searchResults = jobCodeEsRepo.typeAheadSearch(query, OffsetPageable(from, size, null)) + val searchResults = jobCodeEsRepo.typeAheadSearch("", OffsetPageable(from, size, null)) return ResponseEntity.status(200).body(searchResults.map { ApiJobCode.fromJobCode(it.content) }.toList()) } @@ -49,27 +46,27 @@ class JobCodeController @Autowired constructor( @PostMapping(RoutePaths.JOB_CODE_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE]) @PreAuthorize("hasAuthority(@appConfig.roleAdmin)") fun createJobCode( - @RequestBody jobCodeUpdate: JobCodeUpdate - ): HttpEntity { - val newJobCode = jobCodeRepository.createFromApi(jobCodeUpdate) - return ResponseEntity.status(200).body(ApiJobCode.fromJobCode(newJobCode.toModel())) + @RequestBody jobCodes: List + ): HttpEntity> { + val newJobCodes = jobCodeRepository.createFromApi(jobCodes) + return ResponseEntity.status(200).body(newJobCodes.map { ApiJobCode.fromJobCode(it.toModel()) }.toList()) } - @PutMapping(RoutePaths.JOB_CODE_UPDATE, produces = [MediaType.APPLICATION_JSON_VALUE]) - @PreAuthorize("hasAuthority(appConfig.roleAdmin)") + @PostMapping(RoutePaths.JOB_CODE_UPDATE, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("hasAuthority(@appConfig.roleAdmin)") fun updateJobCode( @PathVariable id: Int, @RequestBody jobCodeUpdate: JobCodeUpdate ): HttpEntity { - return ResponseEntity.status(200).body(ApiJobCode(code = "1", targetNode = "target", targetNodeName = "targetNodeName", frameworkName = "frameworkName")) + return ResponseEntity.status(200).body(ApiJobCode(code = "1", targetNode = "target", targetNodeName = "targetNodeName", frameworkName = "frameworkName", parents = listOf())) } @DeleteMapping(RoutePaths.JOB_CODE_REMOVE) - @PreAuthorize("hasAuthority(appConfig.roleAdmin)") + @PreAuthorize("hasAuthority(@appConfig.roleAdmin)") fun deleteJobCode( @PathVariable id: Int, ): HttpEntity { - return ResponseEntity.status(200).body(TaskResult(uuid = "uuid", contentType = "json", status = TaskStatus.Processing, apiResultPath = "path")) + return ResponseEntity.status(200).body(TaskResult(uuid = "uuid", contentType = "application/json", status = TaskStatus.Processing, apiResultPath = "path")) } } \ No newline at end of file diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt index aa176f7d5..f35224613 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt @@ -20,7 +20,7 @@ interface JobCodeRepository { fun findByCodeOrCreate(code: String, framework: String? = null): JobCodeDao fun findBlsCode(code: String): JobCodeDao? fun create(code: String, framework: String? = null): JobCodeDao - fun createFromApi(jobCodeUpdate: JobCodeUpdate): JobCodeDao + fun createFromApi(jobCodes: List): List fun onetsByDetailCode(detailedCode: String): SizedIterable companion object { @@ -54,16 +54,18 @@ class JobCodeRepositoryImpl: JobCodeRepository { .firstOrNull()?.let { dao.wrapRow(it) } } - override fun createFromApi(jobCodeUpdate: JobCodeUpdate): JobCodeDao { - return dao.new { - this.code = jobCodeUpdate.code - this.framework = jobCodeUpdate.framework - this.name = jobCodeUpdate.targetNodeName - this.creationDate = LocalDateTime.now(ZoneOffset.UTC) - this.description = jobCodeUpdate.description - this.name = "my name" - this.major = "my major" - }.also { jobCodeEsRepo.save(it.toModel()) } + override fun createFromApi(jobCodes: List): List { + return jobCodes.map { jobCodeUpdate -> + dao.new { + this.code = jobCodeUpdate.code + this.framework = jobCodeUpdate.framework + this.name = jobCodeUpdate.targetNodeName + this.creationDate = LocalDateTime.now(ZoneOffset.UTC) + // this.description = jobCodeUpdate.description + this.name = "my name" + this.major = "my major" + }.also { jobCodeEsRepo.save(it.toModel()) } + } } override fun findByCodeOrCreate(code: String, framework: String?): JobCodeDao { diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt index cd5b770e3..2849a51b8 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt @@ -1,6 +1,18 @@ package edu.wgu.osmt.keyword -import edu.wgu.osmt.api.model.ApiNamedReference +import com.fasterxml.jackson.annotation.JsonProperty + +data class ApiKeywordUpdate( + @JsonProperty("name") + val name: String?, + @JsonProperty("value") + val value: String?, + @JsonProperty("type") + val type: KeywordTypeEnum, + @JsonProperty("framework") + val framework: String? +) { +} data class ApiKeyword( val id: Long?, diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt index ba29d189d..c775efa7c 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt @@ -2,6 +2,7 @@ package edu.wgu.osmt.keyword import edu.wgu.osmt.PaginationDefaults import edu.wgu.osmt.RoutePaths +import edu.wgu.osmt.api.GeneralApiException import edu.wgu.osmt.api.model.ApiJobCode import edu.wgu.osmt.api.model.ApiNamedReference import edu.wgu.osmt.api.model.JobCodeUpdate @@ -28,13 +29,12 @@ class NamedReferencesController @Autowired constructor( @GetMapping(RoutePaths.NAMED_REFERENCES_LIST, produces = [MediaType.APPLICATION_JSON_VALUE]) @PreAuthorize("isAuthenticated()") fun allPaginated( - @RequestParam query: String, + @RequestParam(required = true) type: String, @RequestParam(required = false, defaultValue = PaginationDefaults.size.toString()) size: Int, @RequestParam(required = false, defaultValue = "0") from: Int, - @RequestParam(required = true) type: String ): HttpEntity> { val keywordType = KeywordTypeEnum.forApiValue(type) ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST) - val searchResults = keywordEsRepo.typeAheadSearch(query, keywordType) + val searchResults = keywordEsRepo.typeAheadSearch("", keywordType) return ResponseEntity.status(200).body(searchResults.map { ApiKeyword.fromKeyword(it.content) }.toList()) } @@ -47,29 +47,33 @@ class NamedReferencesController @Autowired constructor( return ResponseEntity.status(200).body(ApiKeyword.fromKeyword(keyword.get())) } - @PostMapping(RoutePaths.JOB_CODE_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PostMapping(RoutePaths.NAMED_REFERENCES_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE]) @PreAuthorize("hasAuthority(@appConfig.roleAdmin)") fun createNamedReference( - @RequestBody apiKeyword: ApiKeyword - ): HttpEntity { - return ResponseEntity.status(200).body(ApiKeyword(2, "my keyword", "my value", KeywordTypeEnum.Keyword, "my framework")) + @RequestBody keywords: List + ): HttpEntity> { + return ResponseEntity.status(200).body( + keywords.map { + ApiKeyword(id = 1, name = it.name, value = it.value, type = it.type, framework = it.framework) + } + ) } - @PutMapping(RoutePaths.NAMED_REFERENCES_UPDATE, produces = [MediaType.APPLICATION_JSON_VALUE]) - @PreAuthorize("hasAuthority(appConfig.roleAdmin)") + @PostMapping(RoutePaths.NAMED_REFERENCES_UPDATE, produces = [MediaType.APPLICATION_JSON_VALUE]) + @PreAuthorize("hasAuthority(@appConfig.roleAdmin)") fun updateNamedReference( @PathVariable id: Int, - @RequestBody apiKeyword: ApiKeyword + @RequestBody apiKeyword: ApiKeywordUpdate ): HttpEntity { return ResponseEntity.status(200).body(ApiKeyword(134, "my name", "my value", KeywordTypeEnum.Keyword, "my framework")) } @DeleteMapping(RoutePaths.NAMED_REFERENCES_REMOVE) - @PreAuthorize("hasAuthority(appConfig.roleAdmin)") + @PreAuthorize("hasAuthority(@appConfig.roleAdmin)") fun deleteNamedReference( @PathVariable id: Int, ): HttpEntity { - return ResponseEntity.status(200).body(TaskResult(uuid = "uuid", contentType = "json", status = TaskStatus.Processing, apiResultPath = "path")) + return ResponseEntity.status(200).body(TaskResult(uuid = "uuid", contentType = "application/json", status = TaskStatus.Processing, apiResultPath = "path")) } } \ No newline at end of file From 7a61c3b6047e0745a4c854e500c9b03be37002a7 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Tue, 9 May 2023 14:11:44 -0600 Subject: [PATCH 06/16] Remove commented lines --- api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt b/api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt index ba6a00055..1e6b47949 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/security/SecurityConfig.kt @@ -12,7 +12,6 @@ import edu.wgu.osmt.RoutePaths.COLLECTION_SKILLS import edu.wgu.osmt.RoutePaths.COLLECTION_SKILLS_UPDATE import edu.wgu.osmt.RoutePaths.COLLECTION_UPDATE import edu.wgu.osmt.RoutePaths.COLLECTION_XLSX -import edu.wgu.osmt.RoutePaths.JOB_CODE_PATH import edu.wgu.osmt.RoutePaths.SEARCH_COLLECTIONS import edu.wgu.osmt.RoutePaths.SEARCH_JOBCODES_PATH import edu.wgu.osmt.RoutePaths.SEARCH_KEYWORDS_PATH @@ -86,7 +85,6 @@ class SecurityConfig : WebSecurityConfigurerAdapter() { .mvcMatchers(GET, TASK_DETAIL_BATCH).authenticated() .mvcMatchers(GET, SEARCH_JOBCODES_PATH).authenticated() .mvcMatchers(GET, SEARCH_KEYWORDS_PATH).authenticated() - // .mvcMatchers(JOB_CODE_PATH).hasAnyAuthority("ROLE_Osmt_View", "ROLE_Osmt_Admin") // public search endpoints .mvcMatchers(POST, SEARCH_SKILLS).permitAll() @@ -133,7 +131,6 @@ class SecurityConfig : WebSecurityConfigurerAdapter() { .mvcMatchers(POST, SKILL_UPDATE).hasAnyAuthority(ADMIN, CURATOR) .mvcMatchers(POST, SKILLS_CREATE).hasAnyAuthority(ADMIN, CURATOR) .mvcMatchers(POST, SKILL_PUBLISH).hasAnyAuthority(ADMIN) - // .mvcMatchers(JOB_CODE_PATH).hasAnyAuthority(ADMIN, VIEW) .mvcMatchers(POST, COLLECTION_CREATE).hasAnyAuthority(ADMIN, CURATOR) .mvcMatchers(POST, COLLECTION_PUBLISH).hasAnyAuthority(ADMIN) From 24501cf9172dc30d977d4a7011e67f957b1cdfd4 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Tue, 9 May 2023 19:07:18 -0600 Subject: [PATCH 07/16] Remove star import --- .../kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt | 8 ++++++-- .../edu/wgu/osmt/keyword/NamedReferencesController.kt | 11 ++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt index 2cd671abd..f646a6e35 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt @@ -13,8 +13,12 @@ import org.springframework.http.ResponseEntity import org.springframework.security.access.prepost.PreAuthorize import org.springframework.stereotype.Controller import org.springframework.transaction.annotation.Transactional -import org.springframework.web.bind.annotation.* -import java.util.* +import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestParam @Controller @Transactional diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt index c775efa7c..ab5c0cb20 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt @@ -2,10 +2,6 @@ package edu.wgu.osmt.keyword import edu.wgu.osmt.PaginationDefaults import edu.wgu.osmt.RoutePaths -import edu.wgu.osmt.api.GeneralApiException -import edu.wgu.osmt.api.model.ApiJobCode -import edu.wgu.osmt.api.model.ApiNamedReference -import edu.wgu.osmt.api.model.JobCodeUpdate import edu.wgu.osmt.task.TaskResult import edu.wgu.osmt.task.TaskStatus import org.springframework.beans.factory.annotation.Autowired @@ -16,7 +12,12 @@ import org.springframework.http.ResponseEntity import org.springframework.security.access.prepost.PreAuthorize import org.springframework.stereotype.Controller import org.springframework.transaction.annotation.Transactional -import org.springframework.web.bind.annotation.* +import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.server.ResponseStatusException @Controller From 20ea1e5d45a2fe37c7232167370ec9aa6de1cd53 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Thu, 11 May 2023 14:18:41 -0600 Subject: [PATCH 08/16] Add tests for named references and job codes --- .../edu/wgu/osmt/jobcode/JobCodeController.kt | 4 +- .../osmt/keyword/NamedReferencesController.kt | 3 +- .../wgu/osmt/jobcode/JobCodeControllerTest.kt | 81 +++++++++++++++++++ .../keyword/NamedReferencesControllerTest.kt | 80 ++++++++++++++++++ 4 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt create mode 100644 api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt index f646a6e35..0bcf7bb96 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt @@ -8,6 +8,7 @@ import edu.wgu.osmt.task.TaskResult import edu.wgu.osmt.task.TaskStatus import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.HttpEntity +import org.springframework.http.HttpStatus import org.springframework.http.MediaType import org.springframework.http.ResponseEntity import org.springframework.security.access.prepost.PreAuthorize @@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.server.ResponseStatusException @Controller @Transactional @@ -40,7 +42,7 @@ class JobCodeController @Autowired constructor( @GetMapping(RoutePaths.JOB_CODE_DETAIL, produces = [MediaType.APPLICATION_JSON_VALUE]) @PreAuthorize("isAuthenticated()") - fun byUuid( + fun byId( @PathVariable id: Int, ): HttpEntity { val jobCode = jobCodeEsRepo.findById(id) diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt index ab5c0cb20..c2941c266 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt @@ -33,6 +33,7 @@ class NamedReferencesController @Autowired constructor( @RequestParam(required = true) type: String, @RequestParam(required = false, defaultValue = PaginationDefaults.size.toString()) size: Int, @RequestParam(required = false, defaultValue = "0") from: Int, + @RequestParam(required = false) sort: String? ): HttpEntity> { val keywordType = KeywordTypeEnum.forApiValue(type) ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST) val searchResults = keywordEsRepo.typeAheadSearch("", keywordType) @@ -41,7 +42,7 @@ class NamedReferencesController @Autowired constructor( @GetMapping(RoutePaths.NAMED_REFERENCES_DETAIL, produces = [MediaType.APPLICATION_JSON_VALUE]) @PreAuthorize("isAuthenticated()") - fun byUuid( + fun byId( @PathVariable id: Int, ): HttpEntity { val keyword = keywordEsRepo.findById(id) diff --git a/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt new file mode 100644 index 000000000..4b4ad858a --- /dev/null +++ b/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt @@ -0,0 +1,81 @@ +package edu.wgu.osmt.jobcode + +import edu.wgu.osmt.SpringTest +import edu.wgu.osmt.api.model.JobCodeUpdate +import org.assertj.core.api.Assertions +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity +import org.springframework.transaction.annotation.Transactional +import java.time.LocalDateTime +import java.time.ZoneOffset + +@Transactional +internal class JobCodeControllerTest @Autowired constructor( + val jobCodeEsRepo: JobCodeEsRepo, + val jobCodeRepository: JobCodeRepository +) : SpringTest() { + + @Autowired + lateinit var jobCodeController: JobCodeController + val dao = JobCodeDao.Companion + + @Test + fun `Index should return an array with almost one job code`() { + dao.new { + this.code = "code" + this.framework = "framework" + this.name = "targetNodeName" + this.creationDate = LocalDateTime.now(ZoneOffset.UTC) + this.name = "my name" + this.major = "my major" + }.also { jobCodeEsRepo.save(it.toModel()) } + val result = jobCodeController.allPaginated(50, 0, null) + Assertions.assertThat(result.body).hasSizeGreaterThan(0) + } + + @Test + fun `By id should find a job code`() { + dao.new { + this.code = "code" + this.framework = "framework" + this.name = "targetNodeName" + this.creationDate = LocalDateTime.now(ZoneOffset.UTC) + this.name = "my name" + this.major = "my major" + }.also { jobCodeEsRepo.save(it.toModel()) } + val result = jobCodeController.byId(1) + Assertions.assertThat(result.body).isNotNull + Assertions.assertThat((result as ResponseEntity).statusCode).isEqualTo(HttpStatus.OK) + } + + @Test + fun `Create should return created job codes`() { + val result = jobCodeController.createJobCode( + listOf(JobCodeUpdate("my code", "my framework")) + ) + Assertions.assertThat(result.body).hasSizeGreaterThan(0) + } + + @Test + fun `Update should return job codes with updated properties`() { + val result = jobCodeController.updateJobCode( + 1, + JobCodeUpdate("my code", "my framework") + ) + Assertions.assertThat(result).isNotNull + Assertions.assertThat((result as ResponseEntity).statusCode).isEqualTo(HttpStatus.OK) + } + + @Test + fun `Delete should return status 200`() { + val result = jobCodeController.deleteJobCode( + 1 + ) + Assertions.assertThat(result).isNotNull + Assertions.assertThat((result as ResponseEntity).statusCode).isEqualTo(HttpStatus.OK) + } + + +} \ No newline at end of file diff --git a/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt new file mode 100644 index 000000000..fd3530cfb --- /dev/null +++ b/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt @@ -0,0 +1,80 @@ +package edu.wgu.osmt.keyword + +import edu.wgu.osmt.SpringTest +import org.assertj.core.api.Assertions +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity +import org.springframework.transaction.annotation.Transactional +import java.time.LocalDateTime +import java.time.ZoneOffset + +@Transactional +internal class NamedReferencesControllerTest @Autowired constructor( + val keywordRepository: KeywordRepository, + val keywordEsRepo: KeywordEsRepo +) : SpringTest() { + + @Autowired + lateinit var namedReferencesController: NamedReferencesController + + val dao = KeywordDao.Companion + + @Test + fun `Index should return an array with almost one named reference`() { + dao.new { + this.uri = "uri" + this.value = "value" + this.framework = "my framework" + this.type = KeywordTypeEnum.Keyword + this.creationDate = LocalDateTime.now(ZoneOffset.UTC) + this.updateDate = LocalDateTime.now(ZoneOffset.UTC) + }.also { keywordEsRepo.save(it.toModel()) } + val result = namedReferencesController.allPaginated(KeywordTypeEnum.Keyword.toString(), 50, 0, null) + Assertions.assertThat(result.body).hasSizeGreaterThan(0) + } + + @Test + fun `By id should find a named reference`() { + dao.new { + this.uri = "uri" + this.value = "value" + this.framework = "my framework" + this.type = KeywordTypeEnum.Keyword + this.creationDate = LocalDateTime.now(ZoneOffset.UTC) + this.updateDate = LocalDateTime.now(ZoneOffset.UTC) + }.also { keywordEsRepo.save(it.toModel()) } + val result = namedReferencesController.byId(1) + Assertions.assertThat(result.body).isNotNull + Assertions.assertThat((result as ResponseEntity).statusCode).isEqualTo(HttpStatus.OK) + } + + @Test + fun `Create should return created job codes`() { + val result = namedReferencesController.createNamedReference( + listOf(ApiKeywordUpdate("my keyword", "my value", KeywordTypeEnum.Keyword, "my framework")) + ) + Assertions.assertThat(result.body).hasSizeGreaterThan(0) + } + + @Test + fun `Update should return job codes with updated properties`() { + val result = namedReferencesController.updateNamedReference( + 1, + ApiKeywordUpdate("my keyword", "my value", KeywordTypeEnum.Keyword, "my framework") + ) + Assertions.assertThat(result).isNotNull + Assertions.assertThat((result as ResponseEntity).statusCode).isEqualTo(HttpStatus.OK) + } + + @Test + fun `Delete should return status 200`() { + val result = namedReferencesController.deleteNamedReference( + 1 + ) + Assertions.assertThat(result).isNotNull + Assertions.assertThat((result as ResponseEntity).statusCode).isEqualTo(HttpStatus.OK) + } + +} \ No newline at end of file From e12eb8e78ba9035e6a23ebdd4009ef19822d9a79 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Thu, 11 May 2023 15:02:22 -0600 Subject: [PATCH 09/16] Fix front end tests --- ui/src/app/my-workspace/my-workspace.component.spec.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ui/src/app/my-workspace/my-workspace.component.spec.ts b/ui/src/app/my-workspace/my-workspace.component.spec.ts index 1951e9fed..8ea9f2d45 100644 --- a/ui/src/app/my-workspace/my-workspace.component.spec.ts +++ b/ui/src/app/my-workspace/my-workspace.component.spec.ts @@ -32,6 +32,7 @@ import {LabelWithFilterComponent} from "../table/skills-library-table/label-with import {SkillListRowComponent} from "../richskill/list/skill-list-row.component" import {StatusBarComponent} from "../core/status-bar.component" import {DotsMenuComponent} from "../table/skills-library-table/dots-menu.component" +import { ConvertToCollectionComponent } from "./convert-to-collection/convert-to-collection.component" describe("MyWorkspaceComponent", () => { let component: MyWorkspaceComponent @@ -45,6 +46,10 @@ describe("MyWorkspaceComponent", () => { { path: "my-workspace/uuid1/add-skills", component: ManageCollectionComponent + }, + { + path: "my-workspace/convert-to-collection", + component: ConvertToCollectionComponent } ]), HttpClientTestingModule, From 500c65577dccd4e0652e17037c545449e7e5bedd Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Thu, 11 May 2023 16:34:27 -0600 Subject: [PATCH 10/16] Add base dockerized --- .../kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt | 5 ++++- .../edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt index 4b4ad858a..cca6c9a6a 100644 --- a/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt +++ b/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt @@ -1,5 +1,8 @@ package edu.wgu.osmt.jobcode +import edu.wgu.osmt.BaseDockerizedTest +import edu.wgu.osmt.HasDatabaseReset +import edu.wgu.osmt.HasElasticsearchReset import edu.wgu.osmt.SpringTest import edu.wgu.osmt.api.model.JobCodeUpdate import org.assertj.core.api.Assertions @@ -15,7 +18,7 @@ import java.time.ZoneOffset internal class JobCodeControllerTest @Autowired constructor( val jobCodeEsRepo: JobCodeEsRepo, val jobCodeRepository: JobCodeRepository -) : SpringTest() { +) : SpringTest(), BaseDockerizedTest, HasDatabaseReset { @Autowired lateinit var jobCodeController: JobCodeController diff --git a/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt index fd3530cfb..474f1d027 100644 --- a/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt +++ b/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt @@ -1,5 +1,7 @@ package edu.wgu.osmt.keyword +import edu.wgu.osmt.BaseDockerizedTest +import edu.wgu.osmt.HasDatabaseReset import edu.wgu.osmt.SpringTest import org.assertj.core.api.Assertions import org.junit.jupiter.api.Test @@ -14,7 +16,7 @@ import java.time.ZoneOffset internal class NamedReferencesControllerTest @Autowired constructor( val keywordRepository: KeywordRepository, val keywordEsRepo: KeywordEsRepo -) : SpringTest() { +) : SpringTest(), BaseDockerizedTest, HasDatabaseReset { @Autowired lateinit var namedReferencesController: NamedReferencesController From bce397e52bdcffad4566b866f745ec8a7a4260d7 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Thu, 11 May 2023 17:46:02 -0600 Subject: [PATCH 11/16] Fix tests find by id --- .../kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt | 10 +++++++--- .../edu/wgu/osmt/keyword/NamedReferencesController.kt | 11 ++++++++--- .../edu/wgu/osmt/jobcode/JobCodeControllerTest.kt | 11 +++++++---- .../wgu/osmt/keyword/NamedReferencesControllerTest.kt | 11 +++++++---- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt index 0bcf7bb96..99fb58d6c 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeController.kt @@ -43,10 +43,14 @@ class JobCodeController @Autowired constructor( @GetMapping(RoutePaths.JOB_CODE_DETAIL, produces = [MediaType.APPLICATION_JSON_VALUE]) @PreAuthorize("isAuthenticated()") fun byId( - @PathVariable id: Int, + @PathVariable id: Long, ): HttpEntity { - val jobCode = jobCodeEsRepo.findById(id) - return ResponseEntity.status(200).body(ApiJobCode.fromJobCode(jobCode.get())) + val jobCode = jobCodeRepository.findById(id) + if (jobCode != null) { + return ResponseEntity.status(200).body(ApiJobCode.fromJobCode(jobCode.toModel())) + } else { + throw ResponseStatusException(HttpStatus.NOT_FOUND) + } } @PostMapping(RoutePaths.JOB_CODE_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE]) diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt index c2941c266..0926f6cd9 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt @@ -2,6 +2,7 @@ package edu.wgu.osmt.keyword import edu.wgu.osmt.PaginationDefaults import edu.wgu.osmt.RoutePaths +import edu.wgu.osmt.api.model.ApiJobCode import edu.wgu.osmt.task.TaskResult import edu.wgu.osmt.task.TaskStatus import org.springframework.beans.factory.annotation.Autowired @@ -43,10 +44,14 @@ class NamedReferencesController @Autowired constructor( @GetMapping(RoutePaths.NAMED_REFERENCES_DETAIL, produces = [MediaType.APPLICATION_JSON_VALUE]) @PreAuthorize("isAuthenticated()") fun byId( - @PathVariable id: Int, + @PathVariable id: Long, ): HttpEntity { - val keyword = keywordEsRepo.findById(id) - return ResponseEntity.status(200).body(ApiKeyword.fromKeyword(keyword.get())) + val keyword = keywordRepository.findById(id) + if (keyword != null) { + return ResponseEntity.status(200).body(ApiKeyword.fromKeyword(keyword.toModel())) + } else { + throw ResponseStatusException(HttpStatus.NOT_FOUND) + } } @PostMapping(RoutePaths.NAMED_REFERENCES_CREATE, produces = [MediaType.APPLICATION_JSON_VALUE]) diff --git a/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt index cca6c9a6a..ae5e39916 100644 --- a/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt +++ b/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt @@ -40,16 +40,19 @@ internal class JobCodeControllerTest @Autowired constructor( @Test fun `By id should find a job code`() { - dao.new { + val daoJobCode = dao.new { this.code = "code" this.framework = "framework" this.name = "targetNodeName" this.creationDate = LocalDateTime.now(ZoneOffset.UTC) this.name = "my name" this.major = "my major" - }.also { jobCodeEsRepo.save(it.toModel()) } - val result = jobCodeController.byId(1) - Assertions.assertThat(result.body).isNotNull + } + val esJobCode = jobCodeEsRepo.save(jobCodeEsRepo.save(daoJobCode.toModel())) + val result = esJobCode.id?.let { jobCodeController.byId(it) } + if (result != null) { + Assertions.assertThat(result.body).isNotNull + } Assertions.assertThat((result as ResponseEntity).statusCode).isEqualTo(HttpStatus.OK) } diff --git a/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt index 474f1d027..29b7509f1 100644 --- a/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt +++ b/api/src/test/kotlin/edu/wgu/osmt/keyword/NamedReferencesControllerTest.kt @@ -39,16 +39,19 @@ internal class NamedReferencesControllerTest @Autowired constructor( @Test fun `By id should find a named reference`() { - dao.new { + val daoKeyword = dao.new { this.uri = "uri" this.value = "value" this.framework = "my framework" this.type = KeywordTypeEnum.Keyword this.creationDate = LocalDateTime.now(ZoneOffset.UTC) this.updateDate = LocalDateTime.now(ZoneOffset.UTC) - }.also { keywordEsRepo.save(it.toModel()) } - val result = namedReferencesController.byId(1) - Assertions.assertThat(result.body).isNotNull + } + val esKeyword = keywordEsRepo.save(daoKeyword.toModel()) + val result = esKeyword.id?.let { namedReferencesController.byId(it) } + if (result != null) { + Assertions.assertThat(result.body).isNotNull + } Assertions.assertThat((result as ResponseEntity).statusCode).isEqualTo(HttpStatus.OK) } From 996d028254e44ce262e6437ee9637a40a5bff284 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Fri, 12 May 2023 09:39:46 -0600 Subject: [PATCH 12/16] Remove unused imports --- .../kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt | 1 - .../test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt index 0926f6cd9..536f7fa64 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt @@ -2,7 +2,6 @@ package edu.wgu.osmt.keyword import edu.wgu.osmt.PaginationDefaults import edu.wgu.osmt.RoutePaths -import edu.wgu.osmt.api.model.ApiJobCode import edu.wgu.osmt.task.TaskResult import edu.wgu.osmt.task.TaskStatus import org.springframework.beans.factory.annotation.Autowired diff --git a/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt index ae5e39916..d722194fc 100644 --- a/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt +++ b/api/src/test/kotlin/edu/wgu/osmt/jobcode/JobCodeControllerTest.kt @@ -2,7 +2,6 @@ package edu.wgu.osmt.jobcode import edu.wgu.osmt.BaseDockerizedTest import edu.wgu.osmt.HasDatabaseReset -import edu.wgu.osmt.HasElasticsearchReset import edu.wgu.osmt.SpringTest import edu.wgu.osmt.api.model.JobCodeUpdate import org.assertj.core.api.Assertions From 7dfb4bc89a0e8edc1dc53c1164abb89999c7b3cf Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Tue, 16 May 2023 14:23:33 -0600 Subject: [PATCH 13/16] Add update and remove --- api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt index 84a33b926..577fe97b1 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt @@ -59,19 +59,19 @@ object RoutePaths { const val ES_ADMIN_REINDEX = "$ES_ADMIN/reindex" const val METADATA_PATH = "$API/metadata" - const val JOB_CODE_PATH = "$METADATA_PATH/job-codes" + const val JOB_CODE_PATH = "$METADATA_PATH/jobcodes" const val JOB_CODE_CREATE = JOB_CODE_PATH const val JOB_CODE_LIST = JOB_CODE_PATH const val JOB_CODE_DETAIL = "$JOB_CODE_PATH/{id}" - const val JOB_CODE_UPDATE = JOB_CODE_DETAIL - const val JOB_CODE_REMOVE = JOB_CODE_DETAIL + const val JOB_CODE_UPDATE = "$JOB_CODE_DETAIL/update" + const val JOB_CODE_REMOVE = "$JOB_CODE_DETAIL/remove" const val NAMED_REFERENCES_PATH = "$METADATA_PATH/named-references" const val NAMED_REFERENCES_CREATE = NAMED_REFERENCES_PATH const val NAMED_REFERENCES_LIST = NAMED_REFERENCES_PATH const val NAMED_REFERENCES_DETAIL = "$NAMED_REFERENCES_PATH/{id}" - const val NAMED_REFERENCES_UPDATE = NAMED_REFERENCES_DETAIL - const val NAMED_REFERENCES_REMOVE = NAMED_REFERENCES_DETAIL + const val NAMED_REFERENCES_UPDATE = "$NAMED_REFERENCES_DETAIL/update" + const val NAMED_REFERENCES_REMOVE = "$NAMED_REFERENCES_DETAIL/remove" object QueryParams { const val FROM = "from" From b93a46524191fb1f4124f89062f5a0861336102a Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Wed, 17 May 2023 12:43:03 -0600 Subject: [PATCH 14/16] Rename ApiKeyword to NamedReference --- .../kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt | 6 +++--- .../osmt/keyword/NamedReferencesController.kt | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt index 2849a51b8..c530c8884 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/ApiKeyword.kt @@ -14,7 +14,7 @@ data class ApiKeywordUpdate( ) { } -data class ApiKeyword( +data class NamedReference( val id: Long?, val name: String?, val value: String?, @@ -23,8 +23,8 @@ data class ApiKeyword( ) { companion object factory { - fun fromKeyword(keyword: Keyword): ApiKeyword { - return ApiKeyword(keyword.id, keyword.value, keyword.value, keyword.type, keyword.framework) + fun fromKeyword(keyword: Keyword): NamedReference { + return NamedReference(keyword.id, keyword.value, keyword.value, keyword.type, keyword.framework) } } diff --git a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt index 536f7fa64..a2dc13b2b 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/keyword/NamedReferencesController.kt @@ -34,20 +34,20 @@ class NamedReferencesController @Autowired constructor( @RequestParam(required = false, defaultValue = PaginationDefaults.size.toString()) size: Int, @RequestParam(required = false, defaultValue = "0") from: Int, @RequestParam(required = false) sort: String? - ): HttpEntity> { + ): HttpEntity> { val keywordType = KeywordTypeEnum.forApiValue(type) ?: throw ResponseStatusException(HttpStatus.BAD_REQUEST) val searchResults = keywordEsRepo.typeAheadSearch("", keywordType) - return ResponseEntity.status(200).body(searchResults.map { ApiKeyword.fromKeyword(it.content) }.toList()) + return ResponseEntity.status(200).body(searchResults.map { NamedReference.fromKeyword(it.content) }.toList()) } @GetMapping(RoutePaths.NAMED_REFERENCES_DETAIL, produces = [MediaType.APPLICATION_JSON_VALUE]) @PreAuthorize("isAuthenticated()") fun byId( @PathVariable id: Long, - ): HttpEntity { + ): HttpEntity { val keyword = keywordRepository.findById(id) if (keyword != null) { - return ResponseEntity.status(200).body(ApiKeyword.fromKeyword(keyword.toModel())) + return ResponseEntity.status(200).body(NamedReference.fromKeyword(keyword.toModel())) } else { throw ResponseStatusException(HttpStatus.NOT_FOUND) } @@ -57,10 +57,10 @@ class NamedReferencesController @Autowired constructor( @PreAuthorize("hasAuthority(@appConfig.roleAdmin)") fun createNamedReference( @RequestBody keywords: List - ): HttpEntity> { + ): HttpEntity> { return ResponseEntity.status(200).body( keywords.map { - ApiKeyword(id = 1, name = it.name, value = it.value, type = it.type, framework = it.framework) + NamedReference(id = 1, name = it.name, value = it.value, type = it.type, framework = it.framework) } ) } @@ -70,8 +70,8 @@ class NamedReferencesController @Autowired constructor( fun updateNamedReference( @PathVariable id: Int, @RequestBody apiKeyword: ApiKeywordUpdate - ): HttpEntity { - return ResponseEntity.status(200).body(ApiKeyword(134, "my name", "my value", KeywordTypeEnum.Keyword, "my framework")) + ): HttpEntity { + return ResponseEntity.status(200).body(NamedReference(134, "my name", "my value", KeywordTypeEnum.Keyword, "my framework")) } @DeleteMapping(RoutePaths.NAMED_REFERENCES_REMOVE) From 62f0ca1c296877c56ca698e3ef969bc01338a0f0 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Thu, 18 May 2023 09:30:12 -0600 Subject: [PATCH 15/16] Remove unused property --- api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt b/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt index 0af29d829..509448550 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/api/model/JobCodeUpdate.kt @@ -16,7 +16,5 @@ data class JobCodeUpdate( val level: JobCodeLevel? = null, @JsonProperty("parents") val parents: List? = null - // @JsonProperty("description") - // val description: String = "" ) { } \ No newline at end of file From 95e7ba662a65740ea6361fa7f27f2eca0967b567 Mon Sep 17 00:00:00 2001 From: manuel-delvillar <68391066+manuel-delvillar@users.noreply.github.com> Date: Wed, 24 May 2023 09:26:19 -0600 Subject: [PATCH 16/16] Remove unused code --- api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt index f35224613..32138c1de 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/jobcode/JobCodeRepository.kt @@ -61,7 +61,6 @@ class JobCodeRepositoryImpl: JobCodeRepository { this.framework = jobCodeUpdate.framework this.name = jobCodeUpdate.targetNodeName this.creationDate = LocalDateTime.now(ZoneOffset.UTC) - // this.description = jobCodeUpdate.description this.name = "my name" this.major = "my major" }.also { jobCodeEsRepo.save(it.toModel()) }