Skip to content

Commit 6371745

Browse files
committed
feat: create the default branch on Project creation
1 parent 21d57b1 commit 6371745

File tree

4 files changed

+56
-3
lines changed

4 files changed

+56
-3
lines changed

backend/app/src/test/kotlin/io/tolgee/api/v2/controllers/v2ProjectsController/ProjectsControllerCreateTest.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.tolgee.api.v2.controllers.v2ProjectsController
22

33
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
4+
import io.tolgee.constants.Branches
45
import io.tolgee.constants.Message
56
import io.tolgee.dtos.request.LanguageRequest
67
import io.tolgee.dtos.request.project.CreateProjectRequest
@@ -9,6 +10,7 @@ import io.tolgee.model.Project
910
import io.tolgee.model.enums.OrganizationRoleType
1011
import io.tolgee.model.enums.ProjectPermissionType
1112
import io.tolgee.testing.AuthorizedControllerTest
13+
import io.tolgee.testing.assert
1214
import io.tolgee.testing.assertions.Assertions.assertThat
1315
import org.junit.jupiter.api.BeforeEach
1416
import org.junit.jupiter.api.Test
@@ -76,6 +78,28 @@ class ProjectsControllerCreateTest : AuthorizedControllerTest() {
7678
}
7779
}
7880

81+
@Test
82+
fun `create project creates a default branch`() {
83+
val userAccount = dbPopulator.createUserIfNotExists("testuser")
84+
val organization = dbPopulator.createOrganization("Test Organization", userAccount)
85+
loginAsUser("testuser")
86+
val request =
87+
CreateProjectRequest("branched", listOf(languageDTO), organizationId = organization.id, icuPlaceholders = true)
88+
performAuthPost("/v2/projects", request).andIsOk.andAssertThatJson {
89+
node("icuPlaceholders").isBoolean.isTrue
90+
node("id").asNumber().satisfies {
91+
projectService.get(it.toLong()).let { it ->
92+
it.branches.size.assert.isEqualTo(1)
93+
it.branches.first().let { branch ->
94+
branch.isDefault.assert.isTrue
95+
branch.isProtected.assert.isTrue
96+
branch.name.assert.isEqualTo(Branches.DEFAULT.name)
97+
}
98+
}
99+
}
100+
}
101+
}
102+
79103
@Test
80104
fun `throws when slug occupied`() {
81105
dbPopulator.createBase()
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.tolgee.constants
2+
3+
enum class Branches(string: String) {
4+
DEFAULT("main")
5+
}

backend/data/src/main/kotlin/io/tolgee/model/Project.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,21 @@ class Project(
202202
lateinit var projectService: ObjectFactory<ProjectService>
203203

204204
@PrePersist
205+
fun prePersist(project: Project) {
206+
if (project.branches.isEmpty()) {
207+
project.branches.add(Branch.createMainBranch())
208+
}
209+
validateOwnership(project)
210+
}
211+
205212
@PreUpdate
206-
fun preSave(project: Project) {
207-
if (!(!project::organizationOwner.isInitialized).xor(project.userOwner == null)) {
213+
fun preUpdate(project: Project) {
214+
validateOwnership(project)
215+
}
216+
217+
private fun validateOwnership(project: Project) {
218+
val exactlyOneOwner = (!project::organizationOwner.isInitialized).xor(project.userOwner == null)
219+
if (!exactlyOneOwner) {
208220
throw Exception("Exactly one of organizationOwner or userOwner must be set!")
209221
}
210222
}

backend/data/src/main/kotlin/io/tolgee/model/branching/Branch.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.tolgee.model.branching
22

33
import io.tolgee.activity.annotation.ActivityLoggedEntity
44
import io.tolgee.activity.annotation.ActivityLoggedProp
5+
import io.tolgee.constants.Branches
56
import io.tolgee.model.Project
67
import io.tolgee.model.StandardAuditModel
78
import jakarta.persistence.Column
@@ -56,7 +57,18 @@ class Branch(
5657
@Column(name = "pending")
5758
var pending: Boolean = false,
5859

59-
) : StandardAuditModel() {
60+
) : StandardAuditModel() {
61+
companion object {
62+
63+
fun createMainBranch(): Branch {
64+
return Branch(
65+
name = Branches.DEFAULT.name,
66+
isDefault = true,
67+
isProtected = true,
68+
)
69+
}
70+
}
71+
6072
@ManyToOne(optional = false, fetch = FetchType.LAZY)
6173
@JoinColumn(name = "project_id")
6274
lateinit var project: Project

0 commit comments

Comments
 (0)