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 authored and stepan662 committed Apr 28, 2022
1 parent f683a63 commit 235c795
Show file tree
Hide file tree
Showing 20 changed files with 502 additions and 10 deletions.
Expand Up @@ -9,8 +9,8 @@ import io.swagger.v3.oas.annotations.tags.Tag
import io.swagger.v3.oas.annotations.tags.Tags
import io.tolgee.activity.RequestActivity
import io.tolgee.activity.data.ActivityType
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,8 +1,8 @@
package io.tolgee.api.v2.hateoas.project

import io.swagger.v3.oas.annotations.media.Schema
import io.tolgee.api.v2.hateoas.language.LanguageModel
import io.tolgee.api.v2.hateoas.UserPermissionModel
import io.tolgee.api.v2.hateoas.organization.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,8 +2,8 @@ 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.language.LanguageModelAssembler
import io.tolgee.api.v2.hateoas.UserPermissionModel
import io.tolgee.api.v2.hateoas.organization.LanguageModelAssembler
import io.tolgee.api.v2.hateoas.user_account.UserAccountModelAssembler
import io.tolgee.model.views.ProjectWithLanguagesView
import io.tolgee.service.AvatarService
Expand Down
Expand Up @@ -2,7 +2,7 @@ package io.tolgee.api.v2.hateoas.project

import io.swagger.v3.oas.annotations.media.Schema
import io.tolgee.api.v2.hateoas.UserPermissionModel
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 @@ -3,7 +3,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.UserPermissionModel
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 @@ -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,0 +1,23 @@
package io.tolgee.service

import io.tolgee.model.views.projectStats.ProjectLanguageStatsResultView
import io.tolgee.model.views.projectStats.ProjectStatsView
import io.tolgee.service.query_builders.LanguageStatsProvider
import io.tolgee.service.query_builders.ProjectStatsProvider
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import javax.persistence.EntityManager

@Transactional
@Service
class ProjectStatsService(
private val entityManager: EntityManager,
) {
fun getLanguageStats(projectId: Long): List<ProjectLanguageStatsResultView> {
return LanguageStatsProvider(entityManager, projectId).getResult()
}

fun getProjectStats(projectId: Long): ProjectStatsView {
return ProjectStatsProvider(entityManager, projectId).getResult()
}
}

0 comments on commit 235c795

Please sign in to comment.