Skip to content

Commit

Permalink
feat: Add project dashboard page #915 - add stats providing services
Browse files Browse the repository at this point in the history
  • Loading branch information
JanCizmar committed Mar 29, 2022
1 parent f03ad63 commit a3d521d
Show file tree
Hide file tree
Showing 21 changed files with 525 additions and 10 deletions.
Expand Up @@ -7,8 +7,8 @@ package io.tolgee.api.v2.controllers
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.tags.Tag
import io.swagger.v3.oas.annotations.tags.Tags
import io.tolgee.api.v2.hateoas.organization.LanguageModel
import io.tolgee.api.v2.hateoas.organization.LanguageModelAssembler
import io.tolgee.api.v2.hateoas.language.LanguageModel
import io.tolgee.api.v2.hateoas.language.LanguageModelAssembler
import io.tolgee.component.LanguageValidator
import io.tolgee.constants.Message
import io.tolgee.controllers.IController
Expand Down
@@ -1,4 +1,4 @@
package io.tolgee.api.v2.hateoas.organization
package io.tolgee.api.v2.hateoas.language

import io.swagger.v3.oas.annotations.media.Schema
import org.springframework.hateoas.RepresentationModel
Expand Down
@@ -1,4 +1,4 @@
package io.tolgee.api.v2.hateoas.organization
package io.tolgee.api.v2.hateoas.language

import io.tolgee.api.v2.controllers.V2LanguagesController
import io.tolgee.model.Language
Expand Down
@@ -1,7 +1,7 @@
package io.tolgee.api.v2.hateoas.project

import io.swagger.v3.oas.annotations.media.Schema
import io.tolgee.api.v2.hateoas.organization.LanguageModel
import io.tolgee.api.v2.hateoas.language.LanguageModel
import io.tolgee.api.v2.hateoas.user_account.UserAccountModel
import io.tolgee.dtos.Avatar
import io.tolgee.model.Permission
Expand Down
Expand Up @@ -2,7 +2,7 @@ package io.tolgee.api.v2.hateoas.project

import io.tolgee.api.v2.controllers.OrganizationController
import io.tolgee.api.v2.controllers.V2ProjectsController
import io.tolgee.api.v2.hateoas.organization.LanguageModelAssembler
import io.tolgee.api.v2.hateoas.language.LanguageModelAssembler
import io.tolgee.api.v2.hateoas.user_account.UserAccountModelAssembler
import io.tolgee.model.views.ProjectView
import io.tolgee.service.AvatarService
Expand Down
@@ -1,7 +1,7 @@
package io.tolgee.api.v2.hateoas.project

import io.swagger.v3.oas.annotations.media.Schema
import io.tolgee.api.v2.hateoas.organization.LanguageModel
import io.tolgee.api.v2.hateoas.language.LanguageModel
import io.tolgee.api.v2.hateoas.user_account.UserAccountModel
import io.tolgee.dtos.Avatar
import io.tolgee.dtos.query_results.ProjectStatistics
Expand Down
Expand Up @@ -2,7 +2,7 @@ package io.tolgee.api.v2.hateoas.project

import io.tolgee.api.v2.controllers.OrganizationController
import io.tolgee.api.v2.controllers.V2ProjectsController
import io.tolgee.api.v2.hateoas.organization.LanguageModelAssembler
import io.tolgee.api.v2.hateoas.language.LanguageModelAssembler
import io.tolgee.api.v2.hateoas.user_account.UserAccountModelAssembler
import io.tolgee.model.views.ProjectWithStatsView
import io.tolgee.service.AvatarService
Expand Down
@@ -1,7 +1,7 @@
package io.tolgee.api.v2.hateoas.translations

import io.swagger.v3.oas.annotations.media.Schema
import io.tolgee.api.v2.hateoas.organization.LanguageModel
import io.tolgee.api.v2.hateoas.language.LanguageModel
import org.springframework.hateoas.Link
import org.springframework.hateoas.PagedModel

Expand Down
@@ -1,6 +1,6 @@
package io.tolgee.api.v2.hateoas.translations

import io.tolgee.api.v2.hateoas.organization.LanguageModelAssembler
import io.tolgee.api.v2.hateoas.language.LanguageModelAssembler
import io.tolgee.model.Language
import io.tolgee.model.views.KeyWithTranslationsView
import org.springframework.data.domain.Page
Expand Down
@@ -0,0 +1,32 @@
package io.tolgee.service

import io.tolgee.AbstractSpringTest
import io.tolgee.development.testDataBuilder.data.ProjectStatsTestData
import io.tolgee.testing.assertions.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired

internal class ProjectStatsServiceTest : AbstractSpringTest() {

@Autowired
lateinit var projectStatsService: ProjectStatsService

@Test
fun getLanguageStats() {
val testData = ProjectStatsTestData()
testDataService.saveTestData(testData.root)
val data = projectStatsService.getLanguageStats(testData.projectBuilder.self.id)
assertThat(data).hasSize(3)
}

@Test
fun getProjectStats() {
val testData = ProjectStatsTestData()
testDataService.saveTestData(testData.root)
val data = projectStatsService.getProjectStats(testData.projectBuilder.self.id)
assertThat(data.id).isPositive
assertThat(data.userCount).isEqualTo(3)
assertThat(data.keyCount).isEqualTo(5)
assertThat(data.tagCount).isEqualTo(3)
}
}
@@ -1,6 +1,7 @@
package io.tolgee.service

import io.tolgee.AbstractSpringTest
import io.tolgee.development.testDataBuilder.data.TranslationsTestData
import io.tolgee.dtos.request.translation.SetTranslationsWithKeyDto
import io.tolgee.security.AuthenticationFacade
import io.tolgee.testing.assertions.Assertions.assertThat
Expand Down Expand Up @@ -36,4 +37,23 @@ class TranslationServiceTest : AbstractSpringTest() {
@Suppress("UNCHECKED_CAST")
assertThat(viewData["en"] as Map<String, *>).containsKey("folder.folder.translation")
}

@Transactional
@Test
fun `adds stats on translation save and update`() {
val testData = TranslationsTestData()
testDataService.saveTestData(testData.root)
val translation = testData.aKeyGermanTranslation
assertThat(translation.wordCount).isEqualTo(2)
assertThat(translation.characterCount).isEqualTo(translation.text!!.length)

translation.text = "My dog is cool!"
translationService.save(translation)

commitTransaction()

val updated = translationService.get(translation.id)
assertThat(updated.wordCount).isEqualTo(4)
assertThat(updated.characterCount).isEqualTo(translation.text!!.length)
}
}
Expand Up @@ -71,4 +71,27 @@ class ProjectBuilder(
fun addAutoTranslationConfig(ft: FT<AutoTranslationConfig>) {
data.autoTranslationConfigBuilder = AutoTranslationConfigBuilder(this@ProjectBuilder).also { ft(it.self) }
}

fun addEnglish(): LanguageBuilder {
return addLanguage {
name = "English"
tag = "en"
}
}

fun addGerman(): LanguageBuilder {
return addLanguage {
name = "German"
originalName = "Deutsch"
tag = "de"
}
}

fun addCzech(): LanguageBuilder {
return addLanguage {
name = "Czech"
originalName = "Čeština"
tag = "cs"
}
}
}
Expand Up @@ -36,6 +36,7 @@ open class BaseTestData(
tag = "en"
originalName = "English"
englishLanguage = this
this@buildProject.self.baseLanguage = this
}

this.self {
Expand Down
@@ -0,0 +1,174 @@
package io.tolgee.development.testDataBuilder.data

import io.tolgee.development.testDataBuilder.builders.ProjectBuilder
import io.tolgee.model.Language
import io.tolgee.model.Permission
import io.tolgee.model.enums.OrganizationRoleType
import io.tolgee.model.enums.TranslationState
import io.tolgee.model.key.Tag

class ProjectStatsTestData : BaseTestData() {
lateinit var germanLanguage: Language
lateinit var czechLanguage: Language

init {
projectBuilder.apply {

addLanguages()
addKeys()

val organizationOwner = root.addUserAccount {
name = "franta"
username = "franta"
}.self

val organizationMember = root.addUserAccount {
name = "jindra"
username = "jindra"
}.self

root.addOrganization {
name = "org"
projectBuilder.self.organizationOwner = this
}.build buildOrganization@{
addRole {
user = organizationOwner
type = OrganizationRoleType.OWNER
organization = this@buildOrganization.self
}
addRole {
user = organizationMember
type = OrganizationRoleType.MEMBER
organization = this@buildOrganization.self
}
}

addPermission {
type = Permission.ProjectPermissionType.MANAGE
user = organizationMember
}

self.userOwner = null
}
}

private fun ProjectBuilder.addLanguages() {
germanLanguage = addGerman().self
czechLanguage = addCzech().self
}

private fun ProjectBuilder.addKeys() {
val tag1 = Tag().apply {
name = "Tag1"
project = this@addKeys.self
}

val tag2 = Tag().apply {
name = "Tag2"
project = this@addKeys.self
}

val tag3 = Tag().apply {
name = "Tag3"
project = this@addKeys.self
}

addKey {
name = "Super key"
}.build {
addTranslation {
language = englishLanguage
text = "This text has 5 words"
}
addTranslation {
language = germanLanguage
text = "Another text"
state = TranslationState.TRANSLATED
}

addTranslation {
language = czechLanguage
text = "Another text"
state = TranslationState.TRANSLATED
}
addMeta {
tags.add(tag1)
tags.add(tag3)
}
}

addKey {
name = "Key with null translations"
}.build {
addTranslation {
language = englishLanguage
text = "This text has 5 words"
}
addMeta {
tags.add(tag1)
tags.add(tag2)
}
}

addKey {
name = "Key with Untranslated values"
}.build {
addTranslation {
language = englishLanguage
text = "This text has 5 words"
}

addTranslation {
language = germanLanguage
text = null
state = TranslationState.UNTRANSLATED
}

addTranslation {
language = czechLanguage
text = null
state = TranslationState.UNTRANSLATED
}
}

addKey {
name = "Key with reviewed values"
}.build {
addTranslation {
language = englishLanguage
text = "This text has 5 words"
}
addTranslation {
language = germanLanguage
text = null
state = TranslationState.REVIEWED
}

addTranslation {
language = czechLanguage
text = null
state = TranslationState.REVIEWED
}
}

addKey {
name = "Key with mixed values"
}.build {
addTranslation {
language = englishLanguage
text = "This text has 5 words"
}
addTranslation {
language = germanLanguage
text = null
state = TranslationState.TRANSLATED
}

addTranslation {
language = czechLanguage
text = null
state = TranslationState.REVIEWED
}
}
}
}
Expand Up @@ -40,6 +40,7 @@ class TranslationsTestData {
name = "English"
tag = "en"
originalName = "English"
this@project.self.baseLanguage = this
}.self
germanLanguage = addLanguage {
name = "German"
Expand Down
@@ -0,0 +1,13 @@
package io.tolgee.model.views.projectStats

data class ProjectLanguageStatsResultView(
val languageId: Long?,
val languageTag: String?,
val languageName: String?,
val languageOriginalName: String?,
val languageFlagEmoji: String?,
val translatedKeys: Long?,
val translatedWords: Long?,
val reviewedKeys: Long?,
val reviewedWords: Long?,
)
@@ -0,0 +1,8 @@
package io.tolgee.model.views.projectStats

data class ProjectStatsView(
val id: Long,
val keyCount: Long,
val userCount: Long,
val tagCount: Long
)

0 comments on commit a3d521d

Please sign in to comment.