Implement application services and domain model mutations

- Add state transition and update methods to User, WorkoutDay, WorkoutPlan, and WorkoutExercise domain models
- Create service implementations for managing Users, WorkoutPlans, WorkoutDays, WorkoutExercises, and Sessions
- Add Spring Configuration classes (UserConfig, WorkoutConfig, SessionConfig) to register service beans
- Fix calculation of total time in WorkoutDay and add estimatedTime logic to WorkoutExercise
This commit is contained in:
João P.A Silveira 2026-06-02 20:36:15 -03:00
parent 6f7a44e87b
commit e52a07dd9a
24 changed files with 652 additions and 4 deletions

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.session.application.service
import br.dev.jsilveira.coresync.session.application.port.in.UpdateUserWorkoutSessionCompletedAtUseCase
import br.dev.jsilveira.coresync.session.application.port.out.LoadUserWorkoutSessionPort
import br.dev.jsilveira.coresync.session.application.port.out.SaveUserWorkoutSessionPort
import br.dev.jsilveira.coresync.session.domain.model.UserWorkoutSession
import java.util.UUID
class UpdateUserWorkoutSessionCompletedAtService implements UpdateUserWorkoutSessionCompletedAtUseCase {
private final LoadUserWorkoutSessionPort loadUserWorkoutSessionPort
private final SaveUserWorkoutSessionPort saveUserWorkoutSessionPort
UpdateUserWorkoutSessionCompletedAtService(LoadUserWorkoutSessionPort loadUserWorkoutSessionPort, SaveUserWorkoutSessionPort saveUserWorkoutSessionPort) {
this.loadUserWorkoutSessionPort = loadUserWorkoutSessionPort
this.saveUserWorkoutSessionPort = saveUserWorkoutSessionPort
}
@Override
UserWorkoutSession execute(UUID id) {
def session = loadUserWorkoutSessionPort.load(id)
def finishedSession = session.finish()
saveUserWorkoutSessionPort.save(finishedSession)
return finishedSession
}
}

View file

@ -0,0 +1,19 @@
package br.dev.jsilveira.coresync.session.config
import br.dev.jsilveira.coresync.session.application.port.out.LoadUserWorkoutSessionPort
import br.dev.jsilveira.coresync.session.application.port.out.SaveUserWorkoutSessionPort
import br.dev.jsilveira.coresync.session.application.service.UpdateUserWorkoutSessionCompletedAtService
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
class SessionConfig {
@Bean
UpdateUserWorkoutSessionCompletedAtService updateUserWorkoutSessionCompletedAtService(
LoadUserWorkoutSessionPort loadUserWorkoutSessionPort,
SaveUserWorkoutSessionPort saveUserWorkoutSessionPort
) {
return new UpdateUserWorkoutSessionCompletedAtService(loadUserWorkoutSessionPort, saveUserWorkoutSessionPort)
}
}

View file

@ -0,0 +1,20 @@
package br.dev.jsilveira.coresync.user.application.service
import br.dev.jsilveira.coresync.user.application.port.in.CreateUserUseCase
import br.dev.jsilveira.coresync.user.application.port.out.SaveUserPort
import br.dev.jsilveira.coresync.user.domain.model.User
class CreateUserService implements CreateUserUseCase{
private final SaveUserPort saveUserPort
CreateUserService(SaveUserPort saveUserPort){
this.saveUserPort =saveUserPort
}
@Override
User execute(String name, String email) {
def user = new User(UUID.randomUUID(), name, email)
saveUserPort.save(user)
return user
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.user.application.service
import br.dev.jsilveira.coresync.user.application.port.in.DisableUserEmailVerifiedUseCase
import br.dev.jsilveira.coresync.user.application.port.out.LoadUserPort
import br.dev.jsilveira.coresync.user.application.port.out.SaveUserPort
import br.dev.jsilveira.coresync.user.domain.model.User
import java.util.UUID
class DisableUserEmailVerifiedService implements DisableUserEmailVerifiedUseCase {
private final LoadUserPort loadUserPort
private final SaveUserPort saveUserPort
DisableUserEmailVerifiedService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
this.loadUserPort = loadUserPort
this.saveUserPort = saveUserPort
}
@Override
User execute(UUID id) {
def user = loadUserPort.load(id)
def unverifiedUser = user.unverifyEmail()
saveUserPort.save(unverifiedUser)
return unverifiedUser
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.user.application.service
import br.dev.jsilveira.coresync.user.application.port.in.DisableUserUseCase
import br.dev.jsilveira.coresync.user.application.port.out.LoadUserPort
import br.dev.jsilveira.coresync.user.application.port.out.SaveUserPort
import br.dev.jsilveira.coresync.user.domain.model.User
import java.util.UUID
class DisableUserService implements DisableUserUseCase {
private final LoadUserPort loadUserPort
private final SaveUserPort saveUserPort
DisableUserService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
this.loadUserPort = loadUserPort
this.saveUserPort = saveUserPort
}
@Override
User execute(UUID id) {
def user = loadUserPort.load(id)
def deactivatedUser = user.deactivate()
saveUserPort.save(deactivatedUser)
return deactivatedUser
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.user.application.service
import br.dev.jsilveira.coresync.user.application.port.in.EnableUserEmailVerifiedUseCase
import br.dev.jsilveira.coresync.user.application.port.out.LoadUserPort
import br.dev.jsilveira.coresync.user.application.port.out.SaveUserPort
import br.dev.jsilveira.coresync.user.domain.model.User
import java.util.UUID
class EnableUserEmailVerifiedService implements EnableUserEmailVerifiedUseCase {
private final LoadUserPort loadUserPort
private final SaveUserPort saveUserPort
EnableUserEmailVerifiedService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
this.loadUserPort = loadUserPort
this.saveUserPort = saveUserPort
}
@Override
User execute(UUID id) {
def user = loadUserPort.load(id)
def verifiedUser = user.verifyEmail()
saveUserPort.save(verifiedUser)
return verifiedUser
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.user.application.service
import br.dev.jsilveira.coresync.user.application.port.in.EnableUserUseCase
import br.dev.jsilveira.coresync.user.application.port.out.LoadUserPort
import br.dev.jsilveira.coresync.user.application.port.out.SaveUserPort
import br.dev.jsilveira.coresync.user.domain.model.User
import java.util.UUID
class EnableUserService implements EnableUserUseCase {
private final LoadUserPort loadUserPort
private final SaveUserPort saveUserPort
EnableUserService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
this.loadUserPort = loadUserPort
this.saveUserPort = saveUserPort
}
@Override
User execute(UUID id) {
def user = loadUserPort.load(id)
def activatedUser = user.activate()
saveUserPort.save(activatedUser)
return activatedUser
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.user.application.service
import br.dev.jsilveira.coresync.user.application.port.in.UpdateUserEmailUseCase
import br.dev.jsilveira.coresync.user.application.port.out.LoadUserPort
import br.dev.jsilveira.coresync.user.application.port.out.SaveUserPort
import br.dev.jsilveira.coresync.user.domain.model.User
import java.util.UUID
class UpdateUserEmailService implements UpdateUserEmailUseCase {
private final LoadUserPort loadUserPort
private final SaveUserPort saveUserPort
UpdateUserEmailService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
this.loadUserPort = loadUserPort
this.saveUserPort = saveUserPort
}
@Override
User execute(UUID id, String email) {
def user = loadUserPort.load(id)
def updatedUser = user.withEmail(email)
saveUserPort.save(updatedUser)
return updatedUser
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.user.application.service
import br.dev.jsilveira.coresync.user.application.port.in.UpdateUserImageUseCase
import br.dev.jsilveira.coresync.user.application.port.out.LoadUserPort
import br.dev.jsilveira.coresync.user.application.port.out.SaveUserPort
import br.dev.jsilveira.coresync.user.domain.model.User
import java.util.UUID
class UpdateUserImageService implements UpdateUserImageUseCase {
private final LoadUserPort loadUserPort
private final SaveUserPort saveUserPort
UpdateUserImageService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
this.loadUserPort = loadUserPort
this.saveUserPort = saveUserPort
}
@Override
User execute(UUID id, String image) {
def user = loadUserPort.load(id)
def updatedUser = user.withImage(image)
saveUserPort.save(updatedUser)
return updatedUser
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.user.application.service
import br.dev.jsilveira.coresync.user.application.port.in.UpdateUserNameUseCase
import br.dev.jsilveira.coresync.user.application.port.out.LoadUserPort
import br.dev.jsilveira.coresync.user.application.port.out.SaveUserPort
import br.dev.jsilveira.coresync.user.domain.model.User
import java.util.UUID
class UpdateUserNameService implements UpdateUserNameUseCase {
private final LoadUserPort loadUserPort
private final SaveUserPort saveUserPort
UpdateUserNameService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
this.loadUserPort = loadUserPort
this.saveUserPort = saveUserPort
}
@Override
User execute(UUID id, String name) {
def user = loadUserPort.load(id)
def updatedUser = user.withName(name)
saveUserPort.save(updatedUser)
return updatedUser
}
}

View file

@ -0,0 +1,58 @@
package br.dev.jsilveira.coresync.user.config
import br.dev.jsilveira.coresync.user.application.port.out.LoadUserPort
import br.dev.jsilveira.coresync.user.application.port.out.SaveUserPort
import br.dev.jsilveira.coresync.user.application.service.CreateUserService
import br.dev.jsilveira.coresync.user.application.service.DisableUserEmailVerifiedService
import br.dev.jsilveira.coresync.user.application.service.DisableUserService
import br.dev.jsilveira.coresync.user.application.service.EnableUserEmailVerifiedService
import br.dev.jsilveira.coresync.user.application.service.EnableUserService
import br.dev.jsilveira.coresync.user.application.service.UpdateUserEmailService
import br.dev.jsilveira.coresync.user.application.service.UpdateUserImageService
import br.dev.jsilveira.coresync.user.application.service.UpdateUserNameService
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
class UserConfig {
@Bean
CreateUserService createUserService(SaveUserPort saveUserPort) {
return new CreateUserService(saveUserPort)
}
@Bean
EnableUserService enableUserService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
return new EnableUserService(loadUserPort, saveUserPort)
}
@Bean
DisableUserService disableUserService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
return new DisableUserService(loadUserPort, saveUserPort)
}
@Bean
EnableUserEmailVerifiedService enableUserEmailVerifiedService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
return new EnableUserEmailVerifiedService(loadUserPort, saveUserPort)
}
@Bean
DisableUserEmailVerifiedService disableUserEmailVerifiedService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
return new DisableUserEmailVerifiedService(loadUserPort, saveUserPort)
}
@Bean
UpdateUserNameService updateUserNameService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
return new UpdateUserNameService(loadUserPort, saveUserPort)
}
@Bean
UpdateUserEmailService updateUserEmailService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
return new UpdateUserEmailService(loadUserPort, saveUserPort)
}
@Bean
UpdateUserImageService updateUserImageService(LoadUserPort loadUserPort, SaveUserPort saveUserPort) {
return new UpdateUserImageService(loadUserPort, saveUserPort)
}
}

View file

@ -21,11 +21,45 @@ record User(
}
if (!name?.trim()) {
throw new UserException("O campo de nome não estar vazio")
throw new UserException("O campo de nome não pode estar vazio")
}
if(!email?.trim()) {
if (!email?.trim()) {
throw new UserException("O campo email não pode estar vazio")
}
}
}
User activate() {
if (isActive) throw new UserException("O usuário já está ativo")
return new User(id, name, email, emailVerified, image, createdAt, LocalDateTime.now(), Boolean.TRUE)
}
User deactivate() {
if (!isActive) throw new UserException("O usuário já está inativo")
return new User(id, name, email, emailVerified, image, createdAt, LocalDateTime.now(), Boolean.FALSE)
}
User verifyEmail() {
if (emailVerified) throw new UserException("O email já foi verificado")
return new User(id, name, email, Boolean.TRUE, image, createdAt, LocalDateTime.now(), isActive)
}
User unverifyEmail() {
if (!emailVerified) throw new UserException("O email já não está verificado")
return new User(id, name, email, Boolean.FALSE, image, createdAt, LocalDateTime.now(), isActive)
}
User withName(String newName) {
if (!newName?.trim()) throw new UserException("O campo de nome não pode estar vazio")
return new User(id, newName, email, emailVerified, image, createdAt, LocalDateTime.now(), isActive)
}
User withEmail(String newEmail) {
if (!newEmail?.trim()) throw new UserException("O campo email não pode estar vazio")
return new User(id, name, newEmail, emailVerified, image, createdAt, LocalDateTime.now(), isActive)
}
User withImage(String newImage) {
return new User(id, name, email, emailVerified, newImage, createdAt, LocalDateTime.now(), isActive)
}
}

View file

@ -0,0 +1,22 @@
package br.dev.jsilveira.coresync.workout.application.service
import br.dev.jsilveira.coresync.workout.application.port.in.CreateWorkoutPlanUseCase
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutPlanPort
import br.dev.jsilveira.coresync.workout.domain.model.WorkoutPlan
import java.util.UUID
class CreateWorkoutPlanService implements CreateWorkoutPlanUseCase {
private final SaveWorkoutPlanPort saveWorkoutPlanPort
CreateWorkoutPlanService(SaveWorkoutPlanPort saveWorkoutPlanPort) {
this.saveWorkoutPlanPort = saveWorkoutPlanPort
}
@Override
WorkoutPlan execute(String name, UUID userId) {
def workoutPlan = new WorkoutPlan(UUID.randomUUID(), name, userId)
saveWorkoutPlanPort.save(workoutPlan)
return workoutPlan
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.workout.application.service
import br.dev.jsilveira.coresync.workout.application.port.in.DisableWorkoutDayRestUseCase
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutDayPort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutDayPort
import br.dev.jsilveira.coresync.workout.domain.model.WorkoutDay
import java.util.UUID
class DisableWorkoutDayRestService implements DisableWorkoutDayRestUseCase {
private final LoadWorkoutDayPort loadWorkoutDayPort
private final SaveWorkoutDayPort saveWorkoutDayPort
DisableWorkoutDayRestService(LoadWorkoutDayPort loadWorkoutDayPort, SaveWorkoutDayPort saveWorkoutDayPort) {
this.loadWorkoutDayPort = loadWorkoutDayPort
this.saveWorkoutDayPort = saveWorkoutDayPort
}
@Override
WorkoutDay execute(UUID id) {
def workoutDay = loadWorkoutDayPort.load(id)
def nonRestDay = workoutDay.disableRest()
saveWorkoutDayPort.save(nonRestDay)
return nonRestDay
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.workout.application.service
import br.dev.jsilveira.coresync.workout.application.port.in.DisableWorkoutPlanUseCase
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutPlanPort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutPlanPort
import br.dev.jsilveira.coresync.workout.domain.model.WorkoutPlan
import java.util.UUID
class DisableWorkoutPlanService implements DisableWorkoutPlanUseCase {
private final LoadWorkoutPlanPort loadWorkoutPlanPort
private final SaveWorkoutPlanPort saveWorkoutPlanPort
DisableWorkoutPlanService(LoadWorkoutPlanPort loadWorkoutPlanPort, SaveWorkoutPlanPort saveWorkoutPlanPort) {
this.loadWorkoutPlanPort = loadWorkoutPlanPort
this.saveWorkoutPlanPort = saveWorkoutPlanPort
}
@Override
WorkoutPlan execute(UUID id) {
def workoutPlan = loadWorkoutPlanPort.load(id)
def deactivatedPlan = workoutPlan.deactivate()
saveWorkoutPlanPort.save(deactivatedPlan)
return deactivatedPlan
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.workout.application.service
import br.dev.jsilveira.coresync.workout.application.port.in.EnableWorkoutDayRestUseCase
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutDayPort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutDayPort
import br.dev.jsilveira.coresync.workout.domain.model.WorkoutDay
import java.util.UUID
class EnableWorkoutDayRestService implements EnableWorkoutDayRestUseCase {
private final LoadWorkoutDayPort loadWorkoutDayPort
private final SaveWorkoutDayPort saveWorkoutDayPort
EnableWorkoutDayRestService(LoadWorkoutDayPort loadWorkoutDayPort, SaveWorkoutDayPort saveWorkoutDayPort) {
this.loadWorkoutDayPort = loadWorkoutDayPort
this.saveWorkoutDayPort = saveWorkoutDayPort
}
@Override
WorkoutDay execute(UUID id) {
def workoutDay = loadWorkoutDayPort.load(id)
def restDay = workoutDay.enableRest()
saveWorkoutDayPort.save(restDay)
return restDay
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.workout.application.service
import br.dev.jsilveira.coresync.workout.application.port.in.EnableWorkoutPlanUseCase
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutPlanPort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutPlanPort
import br.dev.jsilveira.coresync.workout.domain.model.WorkoutPlan
import java.util.UUID
class EnableWorkoutPlanService implements EnableWorkoutPlanUseCase {
private final LoadWorkoutPlanPort loadWorkoutPlanPort
private final SaveWorkoutPlanPort saveWorkoutPlanPort
EnableWorkoutPlanService(LoadWorkoutPlanPort loadWorkoutPlanPort, SaveWorkoutPlanPort saveWorkoutPlanPort) {
this.loadWorkoutPlanPort = loadWorkoutPlanPort
this.saveWorkoutPlanPort = saveWorkoutPlanPort
}
@Override
WorkoutPlan execute(UUID id) {
def workoutPlan = loadWorkoutPlanPort.load(id)
def activatedPlan = workoutPlan.activate()
saveWorkoutPlanPort.save(activatedPlan)
return activatedPlan
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.workout.application.service
import br.dev.jsilveira.coresync.workout.application.port.in.UpdateWorkoutDayNameUseCase
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutDayPort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutDayPort
import br.dev.jsilveira.coresync.workout.domain.model.WorkoutDay
import java.util.UUID
class UpdateWorkoutDayNameService implements UpdateWorkoutDayNameUseCase {
private final LoadWorkoutDayPort loadWorkoutDayPort
private final SaveWorkoutDayPort saveWorkoutDayPort
UpdateWorkoutDayNameService(LoadWorkoutDayPort loadWorkoutDayPort, SaveWorkoutDayPort saveWorkoutDayPort) {
this.loadWorkoutDayPort = loadWorkoutDayPort
this.saveWorkoutDayPort = saveWorkoutDayPort
}
@Override
WorkoutDay execute(UUID id, String name) {
def workoutDay = loadWorkoutDayPort.load(id)
def updatedDay = workoutDay.withName(name)
saveWorkoutDayPort.save(updatedDay)
return updatedDay
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.workout.application.service
import br.dev.jsilveira.coresync.workout.application.port.in.UpdateWorkoutExerciseNameUseCase
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutExercisePort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutExercisePort
import br.dev.jsilveira.coresync.workout.domain.model.WorkoutExercise
import java.util.UUID
class UpdateWorkoutExerciseNameService implements UpdateWorkoutExerciseNameUseCase {
private final LoadWorkoutExercisePort loadWorkoutExercisePort
private final SaveWorkoutExercisePort saveWorkoutExercisePort
UpdateWorkoutExerciseNameService(LoadWorkoutExercisePort loadWorkoutExercisePort, SaveWorkoutExercisePort saveWorkoutExercisePort) {
this.loadWorkoutExercisePort = loadWorkoutExercisePort
this.saveWorkoutExercisePort = saveWorkoutExercisePort
}
@Override
WorkoutExercise execute(UUID id, String name) {
def workoutExercise = loadWorkoutExercisePort.load(id)
def updatedExercise = workoutExercise.withName(name)
saveWorkoutExercisePort.save(updatedExercise)
return updatedExercise
}
}

View file

@ -0,0 +1,26 @@
package br.dev.jsilveira.coresync.workout.application.service
import br.dev.jsilveira.coresync.workout.application.port.in.UpdateWorkoutPlanNameUseCase
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutPlanPort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutPlanPort
import br.dev.jsilveira.coresync.workout.domain.model.WorkoutPlan
import java.util.UUID
class UpdateWorkoutPlanNameService implements UpdateWorkoutPlanNameUseCase {
private final LoadWorkoutPlanPort loadWorkoutPlanPort
private final SaveWorkoutPlanPort saveWorkoutPlanPort
UpdateWorkoutPlanNameService(LoadWorkoutPlanPort loadWorkoutPlanPort, SaveWorkoutPlanPort saveWorkoutPlanPort) {
this.loadWorkoutPlanPort = loadWorkoutPlanPort
this.saveWorkoutPlanPort = saveWorkoutPlanPort
}
@Override
WorkoutPlan execute(UUID id, String name) {
def workoutPlan = loadWorkoutPlanPort.load(id)
def updatedPlan = workoutPlan.withName(name)
saveWorkoutPlanPort.save(updatedPlan)
return updatedPlan
}
}

View file

@ -0,0 +1,62 @@
package br.dev.jsilveira.coresync.workout.config
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutDayPort
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutExercisePort
import br.dev.jsilveira.coresync.workout.application.port.out.LoadWorkoutPlanPort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutDayPort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutExercisePort
import br.dev.jsilveira.coresync.workout.application.port.out.SaveWorkoutPlanPort
import br.dev.jsilveira.coresync.workout.application.service.CreateWorkoutPlanService
import br.dev.jsilveira.coresync.workout.application.service.DisableWorkoutDayRestService
import br.dev.jsilveira.coresync.workout.application.service.DisableWorkoutPlanService
import br.dev.jsilveira.coresync.workout.application.service.EnableWorkoutDayRestService
import br.dev.jsilveira.coresync.workout.application.service.EnableWorkoutPlanService
import br.dev.jsilveira.coresync.workout.application.service.UpdateWorkoutDayNameService
import br.dev.jsilveira.coresync.workout.application.service.UpdateWorkoutExerciseNameService
import br.dev.jsilveira.coresync.workout.application.service.UpdateWorkoutPlanNameService
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
class WorkoutConfig {
@Bean
CreateWorkoutPlanService createWorkoutPlanService(SaveWorkoutPlanPort saveWorkoutPlanPort) {
return new CreateWorkoutPlanService(saveWorkoutPlanPort)
}
@Bean
EnableWorkoutPlanService enableWorkoutPlanService(LoadWorkoutPlanPort loadWorkoutPlanPort, SaveWorkoutPlanPort saveWorkoutPlanPort) {
return new EnableWorkoutPlanService(loadWorkoutPlanPort, saveWorkoutPlanPort)
}
@Bean
DisableWorkoutPlanService disableWorkoutPlanService(LoadWorkoutPlanPort loadWorkoutPlanPort, SaveWorkoutPlanPort saveWorkoutPlanPort) {
return new DisableWorkoutPlanService(loadWorkoutPlanPort, saveWorkoutPlanPort)
}
@Bean
UpdateWorkoutPlanNameService updateWorkoutPlanNameService(LoadWorkoutPlanPort loadWorkoutPlanPort, SaveWorkoutPlanPort saveWorkoutPlanPort) {
return new UpdateWorkoutPlanNameService(loadWorkoutPlanPort, saveWorkoutPlanPort)
}
@Bean
UpdateWorkoutDayNameService updateWorkoutDayNameService(LoadWorkoutDayPort loadWorkoutDayPort, SaveWorkoutDayPort saveWorkoutDayPort) {
return new UpdateWorkoutDayNameService(loadWorkoutDayPort, saveWorkoutDayPort)
}
@Bean
EnableWorkoutDayRestService enableWorkoutDayRestService(LoadWorkoutDayPort loadWorkoutDayPort, SaveWorkoutDayPort saveWorkoutDayPort) {
return new EnableWorkoutDayRestService(loadWorkoutDayPort, saveWorkoutDayPort)
}
@Bean
DisableWorkoutDayRestService disableWorkoutDayRestService(LoadWorkoutDayPort loadWorkoutDayPort, SaveWorkoutDayPort saveWorkoutDayPort) {
return new DisableWorkoutDayRestService(loadWorkoutDayPort, saveWorkoutDayPort)
}
@Bean
UpdateWorkoutExerciseNameService updateWorkoutExerciseNameService(LoadWorkoutExercisePort loadWorkoutExercisePort, SaveWorkoutExercisePort saveWorkoutExercisePort) {
return new UpdateWorkoutExerciseNameService(loadWorkoutExercisePort, saveWorkoutExercisePort)
}
}

View file

@ -49,6 +49,25 @@ record WorkoutDay(
}
int calculateTotalTime() {
return workoutExercises.sum { it.estimatedTime() } ?: 0 as int
if (workoutExercises.isEmpty()) return 0
return (int) workoutExercises.sum { it.estimatedTime() }
}
WorkoutDay enableRest() {
if (isRest) throw new WorkoutDayException("O dia já está marcado como descanso")
if (workoutExercises && !workoutExercises.isEmpty()) {
throw new WorkoutDayException("Não é possível marcar como descanso um dia com exercícios")
}
return new WorkoutDay(id, name, workoutPlanId, Boolean.TRUE, weekDay, estimatedDurationInSeconds, createdAt, LocalDateTime.now(), workoutExercises)
}
WorkoutDay disableRest() {
if (!isRest) throw new WorkoutDayException("O dia já não está marcado como descanso")
return new WorkoutDay(id, name, workoutPlanId, Boolean.FALSE, weekDay, estimatedDurationInSeconds, createdAt, LocalDateTime.now(), workoutExercises)
}
WorkoutDay withName(String newName) {
if (!newName?.trim()) throw new WorkoutDayException("O campo de nome não pode estar vazio")
return new WorkoutDay(id, newName, workoutPlanId, isRest, weekDay, estimatedDurationInSeconds, createdAt, LocalDateTime.now(), workoutExercises)
}
}

View file

@ -41,4 +41,13 @@ record WorkoutExercise(
throw new WorkoutExerciseException("O campo de identificação do dia de treino não pode ser nulo")
}
}
int estimatedTime() {
return (sets * reps * 3) + ((sets - 1) * restTimeInSeconds)
}
WorkoutExercise withName(String newName) {
if (!newName?.trim()) throw new WorkoutExerciseException("O campo de nome não pode estar vazio")
return new WorkoutExercise(id, order, newName, sets, reps, restTimeInSeconds, workoutDayId, createdAt, LocalDateTime.now())
}
}

View file

@ -32,4 +32,19 @@ record WorkoutPlan(
}
workoutDays = workoutDays.asImmutable()
}
WorkoutPlan activate() {
if (isActive) throw new WorkoutPlanException("O plano de treino já está ativo")
return new WorkoutPlan(id, name, userId, Boolean.TRUE, createdAt, LocalDateTime.now(), workoutDays)
}
WorkoutPlan deactivate() {
if (!isActive) throw new WorkoutPlanException("O plano de treino já está inativo")
return new WorkoutPlan(id, name, userId, Boolean.FALSE, createdAt, LocalDateTime.now(), workoutDays)
}
WorkoutPlan withName(String newName) {
if (!newName?.trim()) throw new WorkoutPlanException("O campo de nome não pode estar vazio")
return new WorkoutPlan(id, newName, userId, isActive, createdAt, LocalDateTime.now(), workoutDays)
}
}