Skip to content

Commit

Permalink
feat: prepare for activity
Browse files Browse the repository at this point in the history
  • Loading branch information
stepan662 committed Aug 30, 2024
1 parent a26d876 commit c11cba6
Show file tree
Hide file tree
Showing 49 changed files with 321 additions and 338 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package io.tolgee.api.v2.controllers

import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.tags.Tag
import io.tolgee.activity.data.ActivityType
import io.tolgee.dtos.request.task.*
import io.tolgee.dtos.request.userAccount.UserAccountPermissionsFilters
import io.tolgee.hateoas.task.TaskModel
Expand Down Expand Up @@ -86,58 +87,58 @@ class TaskController(
return taskModelAssembler.toModel(task)
}

@GetMapping("/{taskId}")
@GetMapping("/{taskNumber}")
@Operation(summary = "Get task")
@UseDefaultPermissions
@AllowApiAccess
fun getTask(
@PathVariable
taskId: Long,
taskNumber: Long,
): TaskModel {
// user can view tasks assigned to him
securityService.hasTaskEditScopeOrIsAssigned(projectHolder.projectEntity.id, taskId)
val task = taskService.getTask(projectHolder.projectEntity, taskId)
securityService.hasTaskEditScopeOrIsAssigned(projectHolder.projectEntity.id, taskNumber)
val task = taskService.getTask(projectHolder.projectEntity, taskNumber)
return taskModelAssembler.toModel(task)
}

@PutMapping("/{taskId}")
@PutMapping("/{taskNumber}")
@Operation(summary = "Update task")
@RequiresProjectPermissions([Scope.TASKS_EDIT])
@AllowApiAccess
fun updateTask(
@PathVariable
taskId: Long,
taskNumber: Long,
@RequestBody @Valid
dto: UpdateTaskRequest,
): TaskModel {
val task = taskService.updateTask(projectHolder.projectEntity, taskId, dto)
val task = taskService.updateTask(projectHolder.projectEntity, taskNumber, dto)
return taskModelAssembler.toModel(task)
}

@GetMapping("/{taskId}/per-user-report")
@GetMapping("/{taskNumber}/per-user-report")
@Operation(summary = "Report who did what")
@UseDefaultPermissions
@AllowApiAccess
fun getPerUserReport(
@PathVariable
taskId: Long,
taskNumber: Long,
): List<TaskPerUserReportModel> {
securityService.hasTaskViewScopeOrIsAssigned(projectHolder.projectEntity.id, taskId)
securityService.hasTaskViewScopeOrIsAssigned(projectHolder.projectEntity.id, taskNumber)

val result = taskService.getReport(projectHolder.projectEntity, taskId)
val result = taskService.getReport(projectHolder.projectEntity, taskNumber)
return result.map { taskPerUserReportModelAssembler.toModel(it) }
}

@GetMapping("/{taskId}/csv-report")
@GetMapping("/{taskNumber}/csv-report")
@Operation(summary = "Report who did what")
@UseDefaultPermissions
@AllowApiAccess
fun getCsvReport(
@PathVariable
taskId: Long,
taskNumber: Long,
): ResponseEntity<ByteArrayResource> {
securityService.hasTaskViewScopeOrIsAssigned(projectHolder.projectEntity.id, taskId)
val byteArray = taskService.getExcelFile(projectHolder.projectEntity, taskId)
securityService.hasTaskViewScopeOrIsAssigned(projectHolder.projectEntity.id, taskNumber)
val byteArray = taskService.getExcelFile(projectHolder.projectEntity, taskNumber)
val resource = ByteArrayResource(byteArray)

val headers = HttpHeaders()
Expand All @@ -148,82 +149,82 @@ class TaskController(
return ResponseEntity(resource, headers, HttpStatus.OK)
}

@GetMapping("/{taskId}/keys")
@GetMapping("/{taskNumber}/keys")
@Operation(summary = "Get task keys")
@UseDefaultPermissions
@AllowApiAccess
fun getTaskKeys(
@PathVariable
taskId: Long,
taskNumber: Long,
): TaskKeysResponse {
securityService.hasTaskViewScopeOrIsAssigned(projectHolder.projectEntity.id, taskId)
securityService.hasTaskViewScopeOrIsAssigned(projectHolder.projectEntity.id, taskNumber)
return TaskKeysResponse(
keys = taskService.getTaskKeys(projectHolder.projectEntity, taskId),
keys = taskService.getTaskKeys(projectHolder.projectEntity, taskNumber),
)
}

@PutMapping("/{taskId}/keys")
@PutMapping("/{taskNumber}/keys")
@Operation(summary = "Add or remove task keys")
@RequiresProjectPermissions([Scope.TASKS_EDIT])
@AllowApiAccess
fun updateTaskKeys(
@PathVariable
taskId: Long,
taskNumber: Long,
@RequestBody @Valid
dto: UpdateTaskKeysRequest,
) {
taskService.updateTaskKeys(projectHolder.projectEntity, taskId, dto)
taskService.updateTaskKeys(projectHolder.projectEntity, taskNumber, dto)
}

@GetMapping("/{taskId}/blocking-tasks")
@GetMapping("/{taskNumber}/blocking-tasks")
@Operation(summary = "Get task ids which block this task")
@UseDefaultPermissions
@AllowApiAccess
fun getBlockingTasks(
@PathVariable
taskId: Long,
taskNumber: Long,
): List<Long> {
return taskService.getBlockingTasks(projectHolder.projectEntity, taskId)
return taskService.getBlockingTasks(projectHolder.projectEntity, taskNumber)
}

@PostMapping("/{taskId}/finish")
@PostMapping("/{taskNumber}/finish")
@Operation(summary = "Finish task")
// permissions checked inside
@UseDefaultPermissions
@AllowApiAccess
fun finishTask(
@PathVariable
taskId: Long,
taskNumber: Long,
): TaskModel {
// user can only finish tasks assigned to him
securityService.hasTaskEditScopeOrIsAssigned(projectHolder.projectEntity.id, taskId)
securityService.hasTaskEditScopeOrIsAssigned(projectHolder.projectEntity.id, taskNumber)
val task =
taskService.updateTask(
projectHolder.projectEntity,
taskId,
taskNumber,
UpdateTaskRequest(
state = TaskState.DONE,
),
)
return taskModelAssembler.toModel(task)
}

@PutMapping("/{taskId}/keys/{keyId}")
@PutMapping("/{taskNumber}/keys/{keyId}")
@Operation(summary = "Update task key")
// permissions checked inside
@UseDefaultPermissions
@AllowApiAccess
fun updateTaskKey(
@PathVariable
taskId: Long,
taskNumber: Long,
@PathVariable
keyId: Long,
@RequestBody @Valid
dto: UpdateTaskKeyRequest,
): UpdateTaskKeyResponse {
// user can only update tasks assigned to him
securityService.hasTaskEditScopeOrIsAssigned(projectHolder.projectEntity.id, taskId)
return taskService.updateTaskKey(projectHolder.projectEntity, taskId, keyId, dto)
securityService.hasTaskEditScopeOrIsAssigned(projectHolder.projectEntity.id, taskNumber)
return taskService.updateTaskKey(projectHolder.projectEntity, taskNumber, keyId, dto)
}

@PostMapping("/create-multiple")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ When null, resulting file will be a flat key-value object.
key.tasks =
translationsWithTasks[key.keyId]?.map {
KeyTaskView(
it.taskId,
it.taskNumber,
it.languageId,
it.languageTag,
it.taskDone,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import org.springframework.hateoas.server.core.Relation

@Relation(collectionRelation = "tasks", itemRelation = "task")
class TaskModel(
var id: Long = 0L,
var number: Long = 0L,
var name: String = "",
var description: String = "",
var type: TaskType = TaskType.TRANSLATE,
Expand All @@ -21,7 +21,7 @@ class TaskModel(
var baseWordCount: Long = 0,
var baseCharacterCount: Long = 0,
var author: SimpleUserAccountModel? = null,
var createdAt: Long = 0,
var createdAt: Long? = 0,
var closedAt: Long? = null,
var state: TaskState = TaskState.IN_PROGRESS,
) : RepresentationModel<TaskModel>()
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class TaskModelAssembler(
) {
override fun toModel(entity: TaskWithScopeView): TaskModel {
return TaskModel(
id = entity.id,
number = entity.number,
name = entity.name,
description = entity.description,
type = entity.type,
Expand All @@ -34,7 +34,7 @@ class TaskModelAssembler(
dueDate = entity.dueDate?.time,
assignees = entity.assignees.map { simpleUserAccountModelAssembler.toModel(it) }.toMutableSet(),
author = entity.author?.let { simpleUserAccountModelAssembler.toModel(it) },
createdAt = entity.createdAt.time,
createdAt = entity.createdAt?.time,
closedAt = entity.closedAt?.time,
totalItems = entity.totalItems,
doneItems = entity.doneItems,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import org.springframework.hateoas.server.core.Relation

@Relation(collectionRelation = "tasks", itemRelation = "task")
data class TaskWithProjectModel(
var id: Long = 0L,
var number: Long = 0L,
var name: String = "",
var description: String = "",
var type: TaskType = TaskType.TRANSLATE,
Expand All @@ -22,7 +22,7 @@ data class TaskWithProjectModel(
var baseWordCount: Long = 0,
var baseCharacterCount: Long = 0,
var author: SimpleUserAccountModel? = null,
var createdAt: Long = 0,
var createdAt: Long? = 0,
var closedAt: Long? = null,
var state: TaskState = TaskState.IN_PROGRESS,
var project: SimpleProjectModel,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class TaskWithProjectModelAssembler(
) {
override fun toModel(entity: TaskWithScopeView): TaskWithProjectModel {
return TaskWithProjectModel(
id = entity.id,
number = entity.number,
name = entity.name,
description = entity.description,
type = entity.type,
Expand All @@ -36,7 +36,7 @@ class TaskWithProjectModelAssembler(
dueDate = entity.dueDate?.time,
assignees = entity.assignees.map { simpleUserAccountModelAssembler.toModel(it) }.toMutableSet(),
author = entity.author?.let { simpleUserAccountModelAssembler.toModel(it) },
createdAt = entity.createdAt.time,
createdAt = entity.createdAt?.time,
closedAt = entity.closedAt?.time,
totalItems = entity.totalItems,
doneItems = entity.doneItems,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import io.tolgee.model.enums.TaskType
import org.springframework.hateoas.RepresentationModel

open class KeyTaskViewModel(
val id: Long,
val number: Long,
val languageId: Long,
val languageTag: String,
val done: Boolean,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class KeyTaskViewModelAssembler :
) {
override fun toModel(view: KeyTaskView): KeyTaskViewModel {
return KeyTaskViewModel(
id = view.id,
number = view.number,
languageId = view.languageId,
languageTag = view.languageTag,
done = view.done,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,8 @@ enum class ActivityType(
WEBHOOK_CONFIG_UPDATE,
WEBHOOK_CONFIG_DELETE,
COMPLEX_TAG_OPERATION(onlyCountsInList = true),
TASK_CREATE,
TASK_UPDATE,
TASK_KEYS_UPDATE,
TASK_FINISH,
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ class TaskReportHelper(

sheet.createRow(6).let {
it.createCell(0).setCellValue("Created at")
it.createCell(1).setCellValue(formatDate(task.createdAt))
task.createdAt?.let { createdAt ->
it.createCell(1).setCellValue(formatDate(createdAt))
}
}

sheet.createRow(7).let {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,5 +103,5 @@ To filter default namespace, set to empty string.
@field:Parameter(
description = "Select only keys which are in specified task",
)
var filterTaskId: List<Long>? = null
var filterTaskNumber: List<Long>? = null
}
19 changes: 9 additions & 10 deletions backend/data/src/main/kotlin/io/tolgee/model/task/Task.kt
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
package io.tolgee.model.task

import io.tolgee.model.Language
import io.tolgee.model.Project
import io.tolgee.model.UserAccount
import io.tolgee.model.*
import io.tolgee.model.enums.TaskState
import io.tolgee.model.enums.TaskType
import jakarta.persistence.*
import jakarta.validation.constraints.Size
import java.util.*

@Entity
@IdClass(TaskId::class)
class Task {
@Id
@Table(uniqueConstraints = [
UniqueConstraint(
columnNames = ["project_id", "number"],
name = "project_number_unique"
)
])
class Task : StandardAuditModel() {
@ManyToOne(fetch = FetchType.LAZY)
var project: Project = Project() // Initialize to avoid null issues

@Id
var id: Long = 1L
var number: Long = 1L

@field:Size(max = 255)
@Column(length = 255)
Expand All @@ -44,8 +45,6 @@ class Task {
@ManyToOne(fetch = FetchType.LAZY, optional = true)
var author: UserAccount? = null

var createdAt: Date = Date()

@Enumerated(EnumType.STRING)
var state: TaskState = TaskState.IN_PROGRESS

Expand Down
12 changes: 0 additions & 12 deletions backend/data/src/main/kotlin/io/tolgee/model/task/TaskId.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package io.tolgee.model.views
import io.tolgee.model.enums.TaskType

class KeyTaskView(
val id: Long,
val number: Long,
val languageId: Long,
val languageTag: String,
val done: Boolean,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package io.tolgee.model.views

interface TaskScopeView {
val taskId: Long?
val projectId: Long?
val totalItems: Long
val doneItems: Long
val baseCharacterCount: Long
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import java.util.*

data class TaskWithScopeView(
val project: Project,
val id: Long,
val number: Long,
val name: String,
val description: String,
val type: TaskType,
Expand All @@ -19,7 +19,7 @@ data class TaskWithScopeView(
val assignees: MutableSet<UserAccount>,
val keys: MutableSet<TaskKey>,
val author: UserAccount,
val createdAt: Date,
val createdAt: Date?,
val state: TaskState,
val closedAt: Date?,
val totalItems: Long,
Expand Down
Loading

0 comments on commit c11cba6

Please sign in to comment.