Skip to content

Commit

Permalink
๐Ÿ”— :: (#708) ๊ฒจ์šธ์ธํ„ด ํ™œ์„ฑํ™”
Browse files Browse the repository at this point in the history
  • Loading branch information
4mjeo authored Sep 2, 2024
2 parents f547760 + a81b622 commit 6df6d97
Show file tree
Hide file tree
Showing 13 changed files with 223 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package team.retum.jobis.domain.intern.model;

import lombok.Builder;
import lombok.Getter;
import team.retum.jobis.common.annotation.Aggregate;

@Getter
@Builder(toBuilder = true)
@Aggregate
public class WinterIntern {

private final boolean isWinterInterned;

public WinterIntern toggle() {
return this.toBuilder()
.isWinterInterned(!this.isWinterInterned)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package team.retum.jobis.domain.intern.spi;

import team.retum.jobis.domain.intern.model.WinterIntern;

public interface CommandWinterInternPort {

void save(WinterIntern winterIntern);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package team.retum.jobis.domain.intern.spi;

public interface QueryWinterInternPort {

boolean getIsWintern();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package team.retum.jobis.domain.intern.spi;

public interface WinterInternPort extends CommandWinterInternPort, QueryWinterInternPort {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package team.retum.jobis.domain.intern.usecase;

import lombok.RequiredArgsConstructor;
import team.retum.jobis.common.annotation.ReadOnlyUseCase;
import team.retum.jobis.domain.intern.spi.QueryWinterInternPort;

@RequiredArgsConstructor
@ReadOnlyUseCase
public class QueryIsWinterInternUseCase {

private final QueryWinterInternPort queryWinterInternPort;

public boolean execute() {
return queryWinterInternPort.getIsWintern();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package team.retum.jobis.domain.intern.usecase;

import lombok.RequiredArgsConstructor;
import team.retum.jobis.common.annotation.UseCase;
import team.retum.jobis.domain.intern.model.WinterIntern;
import team.retum.jobis.domain.intern.spi.CommandWinterInternPort;
import team.retum.jobis.domain.intern.spi.QueryWinterInternPort;

@RequiredArgsConstructor
@UseCase
public class ToggleWinterInternUseCase {

private final CommandWinterInternPort commandWinterInternPort;
private final QueryWinterInternPort queryWinterInternPort;

public void execute() {
boolean toggled = !queryWinterInternPort.getIsWintern();

WinterIntern toggledWinterIntern = WinterIntern.builder()
.isWinterInterned(toggled)
.build();

commandWinterInternPort.save(toggledWinterIntern);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package team.retum.jobis.domain.intern.persistence;

import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import team.retum.jobis.domain.intern.model.WinterIntern;
import team.retum.jobis.domain.intern.persistence.mapper.WinterInternMapper;
import team.retum.jobis.domain.intern.persistence.repository.WinterInternJpaRepository;
import team.retum.jobis.domain.intern.spi.WinterInternPort;

import static team.retum.jobis.domain.intern.persistence.entity.QWinterInternEntity.winterInternEntity;

@RequiredArgsConstructor
@Repository
public class WinterInternPersistenceAdapter implements WinterInternPort {

private final JPAQueryFactory queryFactory;
private final WinterInternJpaRepository winterInternJpaRepository;
private final WinterInternMapper winterInternMapper;

@Override
public boolean getIsWintern() {
Boolean result = queryFactory
.select(winterInternEntity.isWinterIntern)
.from(winterInternEntity)
.fetchFirst();

return result != null ? result : false;
}

@Override
public void save(WinterIntern winterIntern) {
winterInternMapper.toDomain(
winterInternJpaRepository.save(
winterInternMapper.toEntity(winterIntern)
)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package team.retum.jobis.domain.intern.persistence.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Column;
import jakarta.persistence.GenerationType;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "tbl_wintern")
@Entity
public class WinterInternEntity {

@Id
@Column(name = "wintern_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "is_winter_intern", columnDefinition = "TINYINT(1)")
private boolean isWinterIntern;

public WinterInternEntity(boolean isWinterIntern) {
this.isWinterIntern = isWinterIntern;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package team.retum.jobis.domain.intern.persistence.mapper;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import team.retum.jobis.domain.intern.model.WinterIntern;
import team.retum.jobis.domain.intern.persistence.entity.WinterInternEntity;

@RequiredArgsConstructor
@Component
public class WinterInternMapper {

public WinterInternEntity toEntity(WinterIntern winterIntern) {
return new WinterInternEntity(winterIntern.isWinterInterned());
}

public WinterIntern toDomain(WinterInternEntity entity) {
return WinterIntern.builder()
.isWinterInterned(entity.isWinterIntern())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package team.retum.jobis.domain.intern.persistence.repository;

import org.springframework.data.repository.CrudRepository;
import team.retum.jobis.domain.intern.persistence.entity.WinterInternEntity;

import java.util.Optional;

public interface WinterInternJpaRepository extends CrudRepository<WinterInternEntity, Long> {
Optional<WinterInternEntity> findTopByOrderById();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package team.retum.jobis.domain.intern.presentation;

import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import team.retum.jobis.domain.intern.usecase.QueryIsWinterInternUseCase;
import team.retum.jobis.domain.intern.usecase.ToggleWinterInternUseCase;

@RequiredArgsConstructor
@RequestMapping("/winterns")
@RestController
public class WinterInternWebAdapter {

private final QueryIsWinterInternUseCase queryIsWinterInternUseCase;
private final ToggleWinterInternUseCase toggleWinterInternUseCase;

@ResponseStatus(HttpStatus.NO_CONTENT)
@PatchMapping
public void toggleWintern() {
toggleWinterInternUseCase.execute();
}

@GetMapping
public boolean getIsWintern() {
return queryIsWinterInternUseCase.execute();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,10 @@ protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// interest
.requestMatchers(HttpMethod.PATCH, "/interests/{code}").hasAnyAuthority(STUDENT.name())
.requestMatchers(HttpMethod.GET, "/interests").hasAnyAuthority(STUDENT.name())

// winter-intern
.requestMatchers(HttpMethod.PATCH, "/winter-intern").hasAuthority(TEACHER.name())
.requestMatchers(HttpMethod.GET, "/winter-intern").hasAuthority(TEACHER.name())
.anyRequest().authenticated()

)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
CREATE TABLE tbl_winter_intern (
id BIGINT AUTO_INCREMENT,
is_winter_intern TINYINT(1) NOT NULL,
PRIMARY KEY (id)
);

0 comments on commit 6df6d97

Please sign in to comment.