Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 2 additions & 8 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ repositories {
}

ext {
snippetsDir = file("$buildDir/generated-snippets")
javadocJsonDir = file("$buildDir/generated-javadoc-json")
queryDslVersion = "5.0.0"
}

Expand Down Expand Up @@ -87,7 +85,7 @@ test {
useJUnitPlatform()
}

task testCoverage(type: Test) {
tasks.register('testCoverage', Test) {
group 'verification'
description 'Runs the unit tests with coverage'

Expand All @@ -105,11 +103,7 @@ jar {
}

sourceSets {
main {
java {
srcDirs = ["$projectDir/src/main/java", "$projectDir/build/generated"]
}
}
main.java.srcDirs += ["$projectDir/build/generated"]
}

tasks.withType(JavaCompile) {
Expand Down
40 changes: 30 additions & 10 deletions src/main/java/com/simleetag/homework/api/config/AppEnvironment.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,34 @@
package com.simleetag.homework.api.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Getter
@Setter
@ConfigurationProperties(prefix = "app")
public class AppEnvironment {
// OAuth
private Client client;

private Jwt jwt;

private Oauth oauth;

// Messenger
public Messenger messenger = new Messenger();

public static class ConnInfo {
public String host = "localhost";
public boolean useDummy = false;
}

public record Oauth(KakaoAttributes kakaoAttributes, AppleAttributes appleAttributes) {
public record KakaoAttributes(
String clientId,
String redirectUri,
String tokenUri,
String userInformationUri
) {}
) {
}

public record AppleAttributes(
String clientId,
Expand All @@ -31,18 +38,31 @@ public record AppleAttributes(
String keyPath,
String uri,
String clientSecretExpiration
) {}
) {
}
}

public record Jwt(OauthAttributes oauthAttributes, HomeAttributes homeAttributes) {
public record OauthAttributes(long accessTokenExpiration, String secret) {}
public record OauthAttributes(long accessTokenExpiration, String secret) {
}

public record HomeAttributes(long accessTokenExpiration, String secret) {}
public record HomeAttributes(long accessTokenExpiration, String secret) {
}
}

public record Client(KakaoOAuth kakaoOAuth, AppleOAuth appleOAuth) {
public record KakaoOAuth(boolean useDummy) {}
public record KakaoOAuth(boolean useDummy) {
}

public record AppleOAuth(boolean useDummy) {
}
}

public static class Messenger {
public Slack slack = new Slack();

public record AppleOAuth(boolean useDummy) {}
public static class Slack extends ConnInfo {
public String path = "test/slack/path";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,12 @@
import com.simleetag.homework.api.domain.user.UserService;
import com.simleetag.homework.api.domain.user.api.dto.UserProfileRequest;
import com.simleetag.homework.api.domain.user.api.dto.UserProfileResponse;
import com.simleetag.homework.api.domain.user.api.dto.findUserWithHomeAndMembersResponse;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import com.simleetag.homework.api.domain.user.api.dto.UserWithHomeAndMembersResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@Tag(name = "사용자 계정")
@RequiredArgsConstructor
Expand All @@ -27,9 +24,9 @@ public class UserController {
description = "Homework 토큰으로 사용자 정보를 조회합니다."
)
@GetMapping("/me")
public ResponseEntity<findUserWithHomeAndMembersResponse> findUserByAccessToken(@Login Long userId) {
public ResponseEntity<UserWithHomeAndMembersResponse> findUserByAccessToken(@Login Long userId) {
final User user = userService.findUserWithHomeAndMembers(userId);
return ResponseEntity.ok(findUserWithHomeAndMembersResponse.from(user));
return ResponseEntity.ok(UserWithHomeAndMembersResponse.from(user));
}

@Operation(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package com.simleetag.homework.api.domain.user.api.dto;

import java.util.List;
import javax.validation.constraints.NotBlank;

import com.simleetag.homework.api.domain.home.Home;
import com.simleetag.homework.api.domain.home.api.dto.HomeWithMembersResponse;
import com.simleetag.homework.api.domain.home.member.Member;
import com.simleetag.homework.api.domain.user.User;

import io.swagger.v3.oas.annotations.media.Schema;

public record findUserWithHomeAndMembersResponse(
import javax.validation.constraints.NotBlank;
import java.util.List;

public record UserWithHomeAndMembersResponse(
@Schema(description = "유저 ID")
@NotBlank
Long userId,
Expand All @@ -27,13 +26,13 @@ public record findUserWithHomeAndMembersResponse(
@NotBlank
List<HomeWithMembersResponse> homes
) {
public static findUserWithHomeAndMembersResponse from(User user) {
public static UserWithHomeAndMembersResponse from(User user) {
final List<Home> userHomes = user.getMembers()
.stream()
.map(Member::getHome)
.toList();
.stream()
.map(Member::getHome)
.toList();

return new findUserWithHomeAndMembersResponse(
return new UserWithHomeAndMembersResponse(
user.getId(),
user.getUserName(),
user.getProfileImage(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
package com.simleetag.homework.api.domain.user.oauth.api.dto;

import javax.validation.constraints.NotBlank;

import com.simleetag.homework.api.domain.user.User;
import com.simleetag.homework.api.domain.user.api.dto.findUserWithHomeAndMembersResponse;

import com.simleetag.homework.api.domain.user.api.dto.UserWithHomeAndMembersResponse;
import io.swagger.v3.oas.annotations.media.Schema;

import javax.validation.constraints.NotBlank;

public record TokenResponse(
@Schema(description = "Homework 서비스를 사용하기 위한 JWT")
@NotBlank
String homeworkToken,

@Schema(description = "Homework에 가입된 유저의 정보")
@NotBlank findUserWithHomeAndMembersResponse user
@NotBlank UserWithHomeAndMembersResponse user
) {
public static TokenResponse from(String homeworkToken, findUserWithHomeAndMembersResponse user) {
public static TokenResponse from(String homeworkToken, UserWithHomeAndMembersResponse user) {
return new TokenResponse(homeworkToken, user);
}

public static TokenResponse from(String homeworkToken, User user) {
return from(homeworkToken, findUserWithHomeAndMembersResponse.from(user));
return from(homeworkToken, UserWithHomeAndMembersResponse.from(user));
}
}
167 changes: 167 additions & 0 deletions src/main/java/com/simleetag/homework/api/domain/webhook/BlockKit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
package com.simleetag.homework.api.domain.webhook;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import lombok.AllArgsConstructor;

import java.util.List;

/**
* https://api.slack.com/reference/block-kit
Copy link
Contributor Author

@hsik0225 hsik0225 May 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

block kit 데모 사이트입니다.

https://app.slack.com/block-kit-builder/T02TM7502NM#%7B%22type%22:%22home%22,%22blocks%22:%5B%5D%7D

block kit은 사이트에서 보이다시피 JSON으로 슬랙의 메시지를 표현해줘요!

*/
public class BlockKit {

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "type",
visible = true
)
@JsonSubTypes({
@JsonSubTypes.Type(value = Context.class, name = "context"),
@JsonSubTypes.Type(value = Header.class, name = "header"),
@JsonSubTypes.Type(value = Section.class, name = "section"),
@JsonSubTypes.Type(value = Divider.class, name = "divider"),
@JsonSubTypes.Type(value = Image.class, name = "checkboxes"),
@JsonSubTypes.Type(value = Text.class, name = "plain_text"),
@JsonSubTypes.Type(value = Text.class, name = "mrkdwn"),
@JsonSubTypes.Type(value = Button.class, name = "button"),
@JsonSubTypes.Type(value = Checkbox.class, name = "checkboxes"),
@JsonSubTypes.Type(value = Image.class, name = "image"),
})
public interface Block {

}

public interface BlockKitElement extends Block {

}

/**
* https://api.slack.com/reference/block-kit#objects
*/
public interface BlockKitObject extends Block {

}

/**
* https://api.slack.com/reference/block-kit#blocks
*/
public interface BlockKitBlock extends Block {

}

@AllArgsConstructor
public static class Context implements BlockKitBlock {
/**
* Only images BlockElement and text CompositionObject are allowed.
*/
public String type;
public List<BlockKitObject> elements;
public String blockId;

public Context(List<BlockKitObject> elements) {
this("context", elements, null);
}
}

public record Header(
Text text
) implements BlockKitBlock {
public static String type = "header";
}

@AllArgsConstructor
public static class Section implements BlockKitBlock {
public String type;
public Text text;
public String blockId;
public List<Text> fields;
public BlockKitElement accessor;

public Section(Text text) {
this("section", text, null, null, null);
}
}

public class Divider implements BlockKitBlock {
public static String type = "divider";
}

public record Button(
Text text,
String actionId,
String url,
String value,
Style style,
ConfirmationDialog confirm,
Text accessibilityLabel
) implements BlockKitElement {
public static String type = "button";

public enum Style {
primary,
danger
}
}

public record Checkbox(
String actionId,
List<Option> options,
List<Option> initialOptions,
ConfirmationDialog confirm,
Boolean focusOnLoad
) implements BlockKitElement {
public static String type = "checkboxes";
}

public record Image(
String imageUrl,
String altText
) implements BlockKitElement, BlockKitObject {
public static String type = "image";
}

public record Text(
Type type,
String text,
Boolean emoji,
Boolean verbatim
) implements BlockKitObject {
public enum Type {
plain_text,
mrkdwn
}

public Text(Type type, String text) {
this(type, text, null, null);
}
}

public record ConfirmationDialog(
Text title,
Text text,
Text confirm,
Text deny,
Style style
) implements BlockKitObject {
public enum Style {
danger,
primary
}
}

public record Option(
Text text,
String value
) implements BlockKitObject {

}

public record OptionGroup(
Text label,
List<Option> options
) implements BlockKitObject {

}
}
Loading