Skip to content

Commit b58d617

Browse files
committed
fix: code cleanup and refactoring - part 3
1 parent 6a1b5d6 commit b58d617

28 files changed

+241
-88
lines changed

ee/backend/app/src/main/kotlin/io/tolgee/ee/api/v2/controllers/glossary/GlossaryTermController.kt

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import io.swagger.v3.oas.annotations.Operation
44
import io.swagger.v3.oas.annotations.tags.Tag
55
import io.tolgee.component.enabledFeaturesProvider.EnabledFeaturesProvider
66
import io.tolgee.constants.Feature
7-
import io.tolgee.ee.api.v2.hateoas.assemblers.glossary.GlossaryTermModelAssembler
87
import io.tolgee.ee.api.v2.hateoas.assemblers.glossary.GlossaryTermTranslationModelAssembler
9-
import io.tolgee.ee.api.v2.hateoas.assemblers.glossary.GlossaryTermWithTranslationsModelAssembler
10-
import io.tolgee.ee.api.v2.hateoas.model.glossary.GlossaryTermModel
11-
import io.tolgee.ee.api.v2.hateoas.model.glossary.GlossaryTermWithTranslationsModel
8+
import io.tolgee.ee.api.v2.hateoas.assemblers.glossary.SimpleGlossaryTermModelAssembler
9+
import io.tolgee.ee.api.v2.hateoas.assemblers.glossary.SimpleGlossaryTermWithTranslationsModelAssembler
10+
import io.tolgee.ee.api.v2.hateoas.model.glossary.SimpleGlossaryTermModel
11+
import io.tolgee.ee.api.v2.hateoas.model.glossary.SimpleGlossaryTermWithTranslationsModel
1212
import io.tolgee.ee.data.glossary.CreateGlossaryTermWithTranslationRequest
1313
import io.tolgee.ee.data.glossary.CreateUpdateGlossaryTermResponse
1414
import io.tolgee.ee.data.glossary.DeleteMultipleGlossaryTermsRequest
@@ -36,8 +36,8 @@ import org.springframework.web.bind.annotation.*
3636
@Tag(name = "Glossary term")
3737
class GlossaryTermController(
3838
private val glossaryTermService: GlossaryTermService,
39-
private val glossaryTermModelAssembler: GlossaryTermModelAssembler,
40-
private val glossaryTermWithTranslationsModelAssembler: GlossaryTermWithTranslationsModelAssembler,
39+
private val simpleGlossaryTermModelAssembler: SimpleGlossaryTermModelAssembler,
40+
private val simpleGlossaryTermWithTranslationsModelAssembler: SimpleGlossaryTermWithTranslationsModelAssembler,
4141
private val glossaryTermTranslationModelAssembler: GlossaryTermTranslationModelAssembler,
4242
private val pagedAssembler: PagedResourcesAssembler<GlossaryTerm>,
4343
private val organizationHolder: OrganizationHolder,
@@ -63,7 +63,7 @@ class GlossaryTermController(
6363

6464
val (term, translation) = glossaryTermService.createWithTranslation(organizationId, glossaryId, dto)
6565
return CreateUpdateGlossaryTermResponse(
66-
term = glossaryTermModelAssembler.toModel(term),
66+
term = simpleGlossaryTermModelAssembler.toModel(term),
6767
translation = translation?.let { glossaryTermTranslationModelAssembler.toModel(translation) },
6868
)
6969
}
@@ -104,7 +104,7 @@ class GlossaryTermController(
104104

105105
val (term, translation) = glossaryTermService.updateWithTranslation(organizationId, glossaryId, termId, dto)
106106
return CreateUpdateGlossaryTermResponse(
107-
term = glossaryTermModelAssembler.toModel(term),
107+
term = simpleGlossaryTermModelAssembler.toModel(term),
108108
translation = translation?.let { glossaryTermTranslationModelAssembler.toModel(translation) },
109109
)
110110
}
@@ -135,14 +135,14 @@ class GlossaryTermController(
135135
@PathVariable organizationId: Long,
136136
@PathVariable glossaryId: Long,
137137
@PathVariable termId: Long,
138-
): GlossaryTermModel {
138+
): SimpleGlossaryTermModel {
139139
enabledFeaturesProvider.checkFeatureEnabled(
140140
organizationHolder.organization.id,
141141
Feature.GLOSSARY,
142142
)
143143

144144
val glossaryTerm = glossaryTermService.get(organizationId, glossaryId, termId)
145-
return glossaryTermModelAssembler.toModel(glossaryTerm)
145+
return simpleGlossaryTermModelAssembler.toModel(glossaryTerm)
146146
}
147147

148148
@GetMapping("/terms")
@@ -155,14 +155,14 @@ class GlossaryTermController(
155155
@ParameterObject pageable: Pageable,
156156
@RequestParam("search", required = false) search: String?,
157157
@RequestParam("languageTags", required = false) languageTags: List<String>?,
158-
): PagedModel<GlossaryTermModel> {
158+
): PagedModel<SimpleGlossaryTermModel> {
159159
enabledFeaturesProvider.checkFeatureEnabled(
160160
organizationHolder.organization.id,
161161
Feature.GLOSSARY,
162162
)
163163

164164
val terms = glossaryTermService.findAllPaged(organizationId, glossaryId, pageable, search, languageTags?.toSet())
165-
return pagedAssembler.toModel(terms, glossaryTermModelAssembler)
165+
return pagedAssembler.toModel(terms, simpleGlossaryTermModelAssembler)
166166
}
167167

168168
@GetMapping("/termsWithTranslations")
@@ -175,21 +175,21 @@ class GlossaryTermController(
175175
@ParameterObject pageable: Pageable,
176176
@RequestParam("search", required = false) search: String?,
177177
@RequestParam("languageTags", required = false) languageTags: List<String>?,
178-
): PagedModel<GlossaryTermWithTranslationsModel> {
178+
): PagedModel<SimpleGlossaryTermWithTranslationsModel> {
179179
enabledFeaturesProvider.checkFeatureEnabled(
180180
organizationHolder.organization.id,
181181
Feature.GLOSSARY,
182182
)
183183

184184
val terms =
185-
glossaryTermService.findAllPaged(
185+
glossaryTermService.findAllWithTranslationsPaged(
186186
organizationId,
187187
glossaryId,
188188
pageable,
189189
search,
190190
languageTags?.toSet(),
191191
)
192-
return pagedAssembler.toModel(terms, glossaryTermWithTranslationsModelAssembler)
192+
return pagedAssembler.toModel(terms, simpleGlossaryTermWithTranslationsModelAssembler)
193193
}
194194

195195
@GetMapping("/termsIds")

ee/backend/app/src/main/kotlin/io/tolgee/ee/api/v2/controllers/glossary/GlossaryTermHighlightsController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.Operation
44
import io.swagger.v3.oas.annotations.tags.Tag
55
import io.tolgee.component.enabledFeaturesProvider.EnabledFeaturesProvider
66
import io.tolgee.constants.Feature
7-
import io.tolgee.ee.api.v2.hateoas.assemblers.glossary.GlossaryTermWithTranslationsModelAssembler
7+
import io.tolgee.ee.api.v2.hateoas.assemblers.glossary.GlossaryTermModelAssembler
88
import io.tolgee.ee.data.glossary.GlossaryTermHighlightDto
99
import io.tolgee.ee.service.glossary.GlossaryTermService
1010
import io.tolgee.model.enums.Scope
@@ -27,7 +27,7 @@ import org.springframework.web.bind.annotation.RestController
2727
class GlossaryTermHighlightsController(
2828
private val projectHolder: ProjectHolder,
2929
private val glossaryTermService: GlossaryTermService,
30-
private val modelAssembler: GlossaryTermWithTranslationsModelAssembler,
30+
private val modelAssembler: GlossaryTermModelAssembler,
3131
private val organizationHolder: OrganizationHolder,
3232
private val enabledFeaturesProvider: EnabledFeaturesProvider,
3333
) {

ee/backend/app/src/main/kotlin/io/tolgee/ee/api/v2/hateoas/assemblers/glossary/GlossaryTermModelAssembler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import org.springframework.stereotype.Component
99
@Component
1010
class GlossaryTermModelAssembler(
1111
private val glossaryModelAssembler: GlossaryModelAssembler,
12+
private val glossaryTermTranslationModelAssembler: GlossaryTermTranslationModelAssembler,
1213
) : RepresentationModelAssemblerSupport<GlossaryTerm, GlossaryTermModel>(
1314
GlossaryTermController::class.java,
1415
GlossaryTermModel::class.java,
@@ -22,6 +23,7 @@ class GlossaryTermModelAssembler(
2223
flagCaseSensitive = entity.flagCaseSensitive,
2324
flagAbbreviation = entity.flagAbbreviation,
2425
flagForbiddenTerm = entity.flagForbiddenTerm,
26+
translations = entity.translations.map { glossaryTermTranslationModelAssembler.toModel(it) },
2527
)
2628
}
2729
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.tolgee.ee.api.v2.hateoas.assemblers.glossary
2+
3+
import io.tolgee.ee.api.v2.controllers.glossary.GlossaryTermController
4+
import io.tolgee.ee.api.v2.hateoas.model.glossary.SimpleGlossaryTermModel
5+
import io.tolgee.model.glossary.GlossaryTerm
6+
import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport
7+
import org.springframework.stereotype.Component
8+
9+
@Component
10+
class SimpleGlossaryTermModelAssembler :
11+
RepresentationModelAssemblerSupport<GlossaryTerm, SimpleGlossaryTermModel>(
12+
GlossaryTermController::class.java,
13+
SimpleGlossaryTermModel::class.java,
14+
) {
15+
override fun toModel(entity: GlossaryTerm): SimpleGlossaryTermModel {
16+
return SimpleGlossaryTermModel(
17+
id = entity.id,
18+
description = entity.description,
19+
flagNonTranslatable = entity.flagNonTranslatable,
20+
flagCaseSensitive = entity.flagCaseSensitive,
21+
flagAbbreviation = entity.flagAbbreviation,
22+
flagForbiddenTerm = entity.flagForbiddenTerm,
23+
)
24+
}
25+
}
Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
11
package io.tolgee.ee.api.v2.hateoas.assemblers.glossary
22

33
import io.tolgee.ee.api.v2.controllers.glossary.GlossaryTermController
4-
import io.tolgee.ee.api.v2.hateoas.model.glossary.GlossaryTermWithTranslationsModel
4+
import io.tolgee.ee.api.v2.hateoas.model.glossary.SimpleGlossaryTermWithTranslationsModel
55
import io.tolgee.model.glossary.GlossaryTerm
66
import org.springframework.hateoas.server.mvc.RepresentationModelAssemblerSupport
77
import org.springframework.stereotype.Component
88

99
@Component
10-
class GlossaryTermWithTranslationsModelAssembler(
11-
private val glossaryModelAssembler: GlossaryModelAssembler,
10+
class SimpleGlossaryTermWithTranslationsModelAssembler(
1211
private val glossaryTermTranslationModelAssembler: GlossaryTermTranslationModelAssembler,
13-
) : RepresentationModelAssemblerSupport<GlossaryTerm, GlossaryTermWithTranslationsModel>(
12+
) : RepresentationModelAssemblerSupport<GlossaryTerm, SimpleGlossaryTermWithTranslationsModel>(
1413
GlossaryTermController::class.java,
15-
GlossaryTermWithTranslationsModel::class.java,
14+
SimpleGlossaryTermWithTranslationsModel::class.java,
1615
) {
17-
override fun toModel(entity: GlossaryTerm): GlossaryTermWithTranslationsModel {
18-
return GlossaryTermWithTranslationsModel(
16+
override fun toModel(entity: GlossaryTerm): SimpleGlossaryTermWithTranslationsModel {
17+
return SimpleGlossaryTermWithTranslationsModel(
1918
id = entity.id,
20-
glossary = glossaryModelAssembler.toModel(entity.glossary),
2119
description = entity.description,
2220
flagNonTranslatable = entity.flagNonTranslatable,
2321
flagCaseSensitive = entity.flagCaseSensitive,

ee/backend/app/src/main/kotlin/io/tolgee/ee/api/v2/hateoas/model/glossary/GlossaryTermModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ class GlossaryTermModel(
1212
val flagCaseSensitive: Boolean,
1313
val flagAbbreviation: Boolean,
1414
val flagForbiddenTerm: Boolean,
15+
val translations: List<GlossaryTermTranslationModel>,
1516
) : RepresentationModel<GlossaryTermModel>()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.tolgee.ee.api.v2.hateoas.model.glossary
2+
3+
import org.springframework.hateoas.RepresentationModel
4+
import org.springframework.hateoas.server.core.Relation
5+
6+
@Relation(collectionRelation = "glossaryTerms", itemRelation = "glossaryTerm")
7+
class SimpleGlossaryTermModel(
8+
val id: Long,
9+
val description: String?,
10+
val flagNonTranslatable: Boolean,
11+
val flagCaseSensitive: Boolean,
12+
val flagAbbreviation: Boolean,
13+
val flagForbiddenTerm: Boolean,
14+
) : RepresentationModel<SimpleGlossaryTermModel>()
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ import org.springframework.hateoas.RepresentationModel
44
import org.springframework.hateoas.server.core.Relation
55

66
@Relation(collectionRelation = "glossaryTerms", itemRelation = "glossaryTerm")
7-
class GlossaryTermWithTranslationsModel(
7+
class SimpleGlossaryTermWithTranslationsModel(
88
val id: Long,
9-
val glossary: GlossaryModel,
109
val description: String?,
1110
val flagNonTranslatable: Boolean,
1211
val flagCaseSensitive: Boolean,
1312
val flagAbbreviation: Boolean,
1413
val flagForbiddenTerm: Boolean,
1514
val translations: List<GlossaryTermTranslationModel>,
16-
) : RepresentationModel<GlossaryTermWithTranslationsModel>()
15+
) : RepresentationModel<SimpleGlossaryTermWithTranslationsModel>()

ee/backend/app/src/main/kotlin/io/tolgee/ee/data/glossary/CreateGlossaryTermRequest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package io.tolgee.ee.data.glossary
22

3+
import io.swagger.v3.oas.annotations.media.Schema
34
import jakarta.validation.constraints.Size
45

56
open class CreateGlossaryTermRequest {
6-
@field:Size(min = 0, max = 500)
7+
@Schema(example = "", description = "Glossary term description")
8+
@field:Size(max = 500)
79
var description: String? = null
810

911
var flagNonTranslatable: Boolean = false
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package io.tolgee.ee.data.glossary
22

3-
import io.tolgee.ee.api.v2.hateoas.model.glossary.GlossaryTermModel
43
import io.tolgee.ee.api.v2.hateoas.model.glossary.GlossaryTermTranslationModel
4+
import io.tolgee.ee.api.v2.hateoas.model.glossary.SimpleGlossaryTermModel
55

66
data class CreateUpdateGlossaryTermResponse(
7-
val term: GlossaryTermModel,
7+
val term: SimpleGlossaryTermModel,
88
val translation: GlossaryTermTranslationModel?,
99
)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.tolgee.ee.data.glossary
22

3-
import io.tolgee.ee.api.v2.hateoas.model.glossary.GlossaryTermWithTranslationsModel
3+
import io.tolgee.ee.api.v2.hateoas.model.glossary.GlossaryTermModel
44

55
data class GlossaryTermHighlightDto(
66
val position: Position,
7-
val value: GlossaryTermWithTranslationsModel,
7+
val value: GlossaryTermModel,
88
)

ee/backend/app/src/main/kotlin/io/tolgee/ee/data/glossary/UpdateGlossaryTermRequest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package io.tolgee.ee.data.glossary
33
import jakarta.validation.constraints.Size
44

55
open class UpdateGlossaryTermRequest {
6-
@field:Size(min = 0, max = 500)
6+
@field:Size(max = 500)
77
var description: String? = null
88

99
var flagNonTranslatable: Boolean? = null

ee/backend/app/src/main/kotlin/io/tolgee/ee/repository/glossary/GlossaryRepository.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import java.util.Date
1313
@Repository
1414
@Lazy
1515
interface GlossaryRepository : JpaRepository<Glossary, Long> {
16-
// TODO: rework - use only glossary id for query, check organization id in service?
17-
1816
@Query(
1917
"""
2018
from Glossary
@@ -45,7 +43,7 @@ interface GlossaryRepository : JpaRepository<Glossary, Long> {
4543
where organizationOwner.id = :organizationId
4644
and organizationOwner.deletedAt is null
4745
and deletedAt is null
48-
and (:search is null or lower(name) like lower(concat('%', cast(:search as text), '%')))
46+
and (:search is null or lower(name) like lower(concat('%', coalesce(:search, ''), '%')))
4947
""",
5048
)
5149
fun findByOrganizationIdPaged(

ee/backend/app/src/main/kotlin/io/tolgee/ee/repository/glossary/GlossaryTermRepository.kt

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ interface GlossaryTermRepository : JpaRepository<GlossaryTerm, Long> {
4141
and te.glossary.id = :glossaryId
4242
and te.glossary.deletedAt is null
4343
and (:search is null or
44-
lower(te.description) like lower(concat('%', cast(:search as text), '%')) or
45-
lower(tr.text) like lower(concat('%', cast(:search as text), '%'))
44+
lower(te.description) like lower(concat('%', coalesce(:search, ''), '%')) or
45+
lower(tr.text) like lower(concat('%', coalesce(:search, '') , '%'))
4646
)
4747
""",
4848
)
@@ -63,8 +63,8 @@ interface GlossaryTermRepository : JpaRepository<GlossaryTerm, Long> {
6363
where te.glossary = :glossary
6464
and (
6565
:search is null or
66-
lower(te.description) like lower(concat('%', cast(:search as text), '%')) or
67-
lower(tr.text) like lower(concat('%', cast(:search as text), '%'))
66+
lower(te.description) like lower(concat('%', coalesce(:search, ''), '%')) or
67+
lower(tr.text) like lower(concat('%', ccoalesce(:search, ''), '%'))
6868
)
6969
""",
7070
)
@@ -75,6 +75,28 @@ interface GlossaryTermRepository : JpaRepository<GlossaryTerm, Long> {
7575
languageTags: Set<String>?,
7676
): Page<GlossaryTerm>
7777

78+
@Query(
79+
"""
80+
from GlossaryTerm te
81+
join fetch te.translations
82+
left join GlossaryTermTranslation tr on tr.term.id = te.id
83+
and tr.languageTag = te.glossary.baseLanguageTag
84+
and (:languageTags is null or tr.languageTag in :languageTags)
85+
where te.glossary = :glossary
86+
and (
87+
:search is null or
88+
lower(te.description) like lower(concat('%', coalesce(:search, ''), '%')) or
89+
lower(tr.text) like lower(concat('%', ccoalesce(:search, ''), '%'))
90+
)
91+
""",
92+
)
93+
fun findByGlossaryWithTranslationsPaged(
94+
glossary: Glossary,
95+
pageable: Pageable,
96+
search: String?,
97+
languageTags: Set<String>?,
98+
): Page<GlossaryTerm>
99+
78100
@Query(
79101
"""
80102
select te.id from GlossaryTerm te
@@ -84,8 +106,8 @@ interface GlossaryTermRepository : JpaRepository<GlossaryTerm, Long> {
84106
where te.glossary = :glossary
85107
and (
86108
:search is null or
87-
lower(te.description) like lower(concat('%', cast(:search as text), '%')) or
88-
lower(tr.text) like lower(concat('%', cast(:search as text), '%'))
109+
lower(te.description) like lower(concat('%', coalesce(:search, ''), '%')) or
110+
lower(tr.text) like lower(concat('%', coalesce(:search, ''), '%'))
89111
)
90112
""",
91113
)

ee/backend/app/src/main/kotlin/io/tolgee/ee/repository/glossary/GlossaryTermTranslationRepository.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package io.tolgee.ee.repository.glossary
22

3+
import io.tolgee.model.glossary.Glossary
34
import io.tolgee.model.glossary.GlossaryTerm
45
import io.tolgee.model.glossary.GlossaryTermTranslation
56
import org.springframework.context.annotation.Lazy
67
import org.springframework.data.jpa.repository.JpaRepository
8+
import org.springframework.data.jpa.repository.Modifying
79
import org.springframework.data.jpa.repository.Query
810
import org.springframework.stereotype.Repository
911

@@ -66,4 +68,20 @@ interface GlossaryTermTranslationRepository : JpaRepository<GlossaryTermTranslat
6668
assignedProjectId: Long,
6769
organizationId: Long,
6870
): Set<GlossaryTermTranslation>
71+
72+
@Modifying
73+
@Query(
74+
"""
75+
update GlossaryTermTranslation gtt
76+
set gtt.languageTag = :newBaseLanguageTag
77+
where gtt.term.glossary = :glossary
78+
and gtt.languageTag = :oldBaseLanguageTag
79+
and gtt.term.flagNonTranslatable = true
80+
""",
81+
)
82+
fun updateBaseLanguage(
83+
glossary: Glossary,
84+
oldBaseLanguageTag: String?,
85+
newBaseLanguageTag: String?,
86+
)
6987
}

0 commit comments

Comments
 (0)