From 96c93dc0f1af55139a38c4eff52f0bde92fa8cc7 Mon Sep 17 00:00:00 2001 From: qlido Date: Thu, 4 Apr 2024 20:04:38 +0900 Subject: [PATCH 1/8] =?UTF-8?q?Feat:=20CheckStyle=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 21 +- checkstyle/naver-checkstyle-rules.xml | 439 +++++++++++++++++++ checkstyle/naver-checkstyle-suppressions.xml | 7 + checkstyle/naver-intellij-formatter.xml | 62 +++ checkstyle/naver.importorder | 11 + 5 files changed, 539 insertions(+), 1 deletion(-) create mode 100644 checkstyle/naver-checkstyle-rules.xml create mode 100644 checkstyle/naver-checkstyle-suppressions.xml create mode 100644 checkstyle/naver-intellij-formatter.xml create mode 100644 checkstyle/naver.importorder diff --git a/build.gradle b/build.gradle index 78166327..929f4ec8 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,8 @@ plugins { id 'org.sonarqube' version "5.0.0.4638" //SonarCloud test coverage id "jacoco" + //CheckStyle + id "checkstyle" } group = 'com.project' @@ -73,12 +75,12 @@ tasks.named('test') { useJUnitPlatform() } - //querydsl 추가 def querydslDir = "$buildDir/generated/querydsl" tasks.withType(JavaCompile).configureEach { options.getGeneratedSourceOutputDirectory().set(file(querydslDir)) } + sourceSets { main.java.srcDirs += [querydslDir] } @@ -90,6 +92,7 @@ configurations { querydsl.extendsFrom compileClasspath } + clean { delete file(querydslDir) } @@ -118,4 +121,20 @@ jar { enabled = false } +//checkstyle +compileJava.options.encoding = 'UTF-8' +compileTestJava.options.encoding = 'UTF-8' + +tasks.withType(Checkstyle).configureEach { + reports { + xml.required = false + html.required = true + } +} + +checkstyle { + maxWarnings = 0 + configFile = file("checkstyle/naver-checkstyle-rules.xml") + configProperties = ["suppressionFile": "checkstyle/naver-checkstyle-suppressions.xml"] +} diff --git a/checkstyle/naver-checkstyle-rules.xml b/checkstyle/naver-checkstyle-rules.xml new file mode 100644 index 00000000..2b160504 --- /dev/null +++ b/checkstyle/naver-checkstyle-rules.xml @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/checkstyle/naver-checkstyle-suppressions.xml b/checkstyle/naver-checkstyle-suppressions.xml new file mode 100644 index 00000000..a7b6fd1d --- /dev/null +++ b/checkstyle/naver-checkstyle-suppressions.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/checkstyle/naver-intellij-formatter.xml b/checkstyle/naver-intellij-formatter.xml new file mode 100644 index 00000000..891b28b4 --- /dev/null +++ b/checkstyle/naver-intellij-formatter.xml @@ -0,0 +1,62 @@ + + + diff --git a/checkstyle/naver.importorder b/checkstyle/naver.importorder new file mode 100644 index 00000000..aee4df49 --- /dev/null +++ b/checkstyle/naver.importorder @@ -0,0 +1,11 @@ +# naver coding convention +# [blankline-between-import-group] +8=com.naver +7=com.navercorp +6=com.nhncorp +5= +4=com +3=net +2=org +1=javax +0=java From 386b722102d7e54f58549c30c1f6cbd5ab1b16d1 Mon Sep 17 00:00:00 2001 From: qlido Date: Fri, 5 Apr 2024 14:45:50 +0900 Subject: [PATCH 2/8] =?UTF-8?q?Feat:=20.editorconfig=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 1211 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1211 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..d6537421 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,1211 @@ +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = false +max_line_length = 120 +tab_width = 4 +ij_continuation_indent_size = 8 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = true +ij_smart_tabs = false +ij_visual_guides = +ij_wrap_on_typing = false + +[*.css] +ij_css_align_closing_brace_with_properties = false +ij_css_blank_lines_around_nested_selector = 1 +ij_css_blank_lines_between_blocks = 1 +ij_css_block_comment_add_space = false +ij_css_brace_placement = end_of_line +ij_css_enforce_quotes_on_format = false +ij_css_hex_color_long_format = false +ij_css_hex_color_lower_case = false +ij_css_hex_color_short_format = false +ij_css_hex_color_upper_case = false +ij_css_keep_blank_lines_in_code = 2 +ij_css_keep_indents_on_empty_lines = false +ij_css_keep_single_line_blocks = false +ij_css_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_css_space_after_colon = true +ij_css_space_before_opening_brace = true +ij_css_use_double_quotes = true +ij_css_value_alignment = do_not_align + +[*.feature] +indent_size = 2 +ij_gherkin_keep_indents_on_empty_lines = false + +[*.java] +indent_style = tab +ij_continuation_indent_size = 4 +ij_java_align_consecutive_assignments = false +ij_java_align_consecutive_variable_declarations = false +ij_java_align_group_field_declarations = false +ij_java_align_multiline_annotation_parameters = false +ij_java_align_multiline_array_initializer_expression = false +ij_java_align_multiline_assignment = false +ij_java_align_multiline_binary_operation = false +ij_java_align_multiline_chained_methods = false +ij_java_align_multiline_deconstruction_list_components = true +ij_java_align_multiline_extends_list = false +ij_java_align_multiline_for = true +ij_java_align_multiline_method_parentheses = false +ij_java_align_multiline_parameters = false +ij_java_align_multiline_parameters_in_calls = false +ij_java_align_multiline_parenthesized_expression = false +ij_java_align_multiline_records = true +ij_java_align_multiline_resources = true +ij_java_align_multiline_ternary_operation = false +ij_java_align_multiline_text_blocks = false +ij_java_align_multiline_throws_list = false +ij_java_align_subsequent_simple_methods = false +ij_java_align_throws_keyword = false +ij_java_align_types_in_multi_catch = true +ij_java_annotation_parameter_wrap = off +ij_java_array_initializer_new_line_after_left_brace = false +ij_java_array_initializer_right_brace_on_new_line = false +ij_java_array_initializer_wrap = normal +ij_java_assert_statement_colon_on_next_line = false +ij_java_assert_statement_wrap = off +ij_java_assignment_wrap = off +ij_java_binary_operation_sign_on_next_line = true +ij_java_binary_operation_wrap = normal +ij_java_blank_lines_after_anonymous_class_header = 0 +ij_java_blank_lines_after_class_header = 0 +ij_java_blank_lines_after_imports = 1 +ij_java_blank_lines_after_package = 1 +ij_java_blank_lines_around_class = 1 +ij_java_blank_lines_around_field = 0 +ij_java_blank_lines_around_field_in_interface = 0 +ij_java_blank_lines_around_initializer = 1 +ij_java_blank_lines_around_method = 1 +ij_java_blank_lines_around_method_in_interface = 1 +ij_java_blank_lines_before_class_end = 0 +ij_java_blank_lines_before_imports = 1 +ij_java_blank_lines_before_method_body = 0 +ij_java_blank_lines_before_package = 0 +ij_java_block_brace_style = end_of_line +ij_java_block_comment_add_space = false +ij_java_block_comment_at_first_column = true +ij_java_builder_methods = +ij_java_call_parameters_new_line_after_left_paren = false +ij_java_call_parameters_right_paren_on_new_line = false +ij_java_call_parameters_wrap = normal +ij_java_case_statement_on_separate_line = true +ij_java_catch_on_new_line = false +ij_java_class_annotation_wrap = split_into_lines +ij_java_class_brace_style = end_of_line +ij_java_class_count_to_use_import_on_demand = 99 +ij_java_class_names_in_javadoc = 1 +ij_java_deconstruction_list_wrap = normal +ij_java_do_not_indent_top_level_class_members = false +ij_java_do_not_wrap_after_single_annotation = false +ij_java_do_not_wrap_after_single_annotation_in_parameter = false +ij_java_do_while_brace_force = never +ij_java_doc_add_blank_line_after_description = true +ij_java_doc_add_blank_line_after_param_comments = false +ij_java_doc_add_blank_line_after_return = false +ij_java_doc_add_p_tag_on_empty_lines = true +ij_java_doc_align_exception_comments = true +ij_java_doc_align_param_comments = true +ij_java_doc_do_not_wrap_if_one_line = false +ij_java_doc_enable_formatting = false +ij_java_doc_enable_leading_asterisks = true +ij_java_doc_indent_on_continuation = false +ij_java_doc_keep_empty_lines = true +ij_java_doc_keep_empty_parameter_tag = true +ij_java_doc_keep_empty_return_tag = true +ij_java_doc_keep_empty_throws_tag = true +ij_java_doc_keep_invalid_tags = true +ij_java_doc_param_description_on_new_line = false +ij_java_doc_preserve_line_breaks = false +ij_java_doc_use_throws_not_exception_tag = true +ij_java_else_on_new_line = false +ij_java_entity_dd_prefix = +ij_java_entity_dd_suffix = EJB +ij_java_entity_eb_prefix = +ij_java_entity_eb_suffix = Bean +ij_java_entity_hi_prefix = +ij_java_entity_hi_suffix = Home +ij_java_entity_lhi_prefix = Local +ij_java_entity_lhi_suffix = Home +ij_java_entity_li_prefix = Local +ij_java_entity_li_suffix = +ij_java_entity_pk_class = java.lang.String +ij_java_entity_ri_prefix = +ij_java_entity_ri_suffix = +ij_java_entity_vo_prefix = +ij_java_entity_vo_suffix = VO +ij_java_enum_constants_wrap = off +ij_java_extends_keyword_wrap = normal +ij_java_extends_list_wrap = normal +ij_java_field_annotation_wrap = split_into_lines +ij_java_field_name_prefix = +ij_java_field_name_suffix = +ij_java_filter_class_prefix = +ij_java_filter_class_suffix = +ij_java_filter_dd_prefix = +ij_java_filter_dd_suffix = +ij_java_finally_on_new_line = false +ij_java_for_brace_force = never +ij_java_for_statement_new_line_after_left_paren = false +ij_java_for_statement_right_paren_on_new_line = false +ij_java_for_statement_wrap = off +ij_java_generate_final_locals = false +ij_java_generate_final_parameters = false +ij_java_if_brace_force = never +ij_java_imports_layout = |, $*, |, java.**, |, javax.**, |, org.**, |, net.**, |, com.**, |, *, |, com.nhncorp.**, |, com.navercorp.**, |, com.naver.**, | +ij_java_indent_case_from_switch = true +ij_java_insert_inner_class_imports = false +ij_java_insert_override_annotation = true +ij_java_keep_blank_lines_before_right_brace = 1 +ij_java_keep_blank_lines_between_package_declaration_and_header = 2 +ij_java_keep_blank_lines_in_code = 1 +ij_java_keep_blank_lines_in_declarations = 1 +ij_java_keep_builder_methods_indents = false +ij_java_keep_control_statement_in_one_line = false +ij_java_keep_first_column_comment = false +ij_java_keep_indents_on_empty_lines = false +ij_java_keep_line_breaks = true +ij_java_keep_multiple_expressions_in_one_line = false +ij_java_keep_simple_blocks_in_one_line = false +ij_java_keep_simple_classes_in_one_line = false +ij_java_keep_simple_lambdas_in_one_line = false +ij_java_keep_simple_methods_in_one_line = false +ij_java_label_indent_absolute = false +ij_java_label_indent_size = 0 +ij_java_lambda_brace_style = end_of_line +ij_java_layout_static_imports_separately = true +ij_java_line_comment_add_space = true +ij_java_line_comment_add_space_on_reformat = false +ij_java_line_comment_at_first_column = false +ij_java_listener_class_prefix = +ij_java_listener_class_suffix = +ij_java_local_variable_name_prefix = +ij_java_local_variable_name_suffix = +ij_java_message_dd_prefix = +ij_java_message_dd_suffix = EJB +ij_java_message_eb_prefix = +ij_java_message_eb_suffix = Bean +ij_java_method_annotation_wrap = split_into_lines +ij_java_method_brace_style = end_of_line +ij_java_method_call_chain_wrap = on_every_item +ij_java_method_parameters_new_line_after_left_paren = false +ij_java_method_parameters_right_paren_on_new_line = false +ij_java_method_parameters_wrap = normal +ij_java_modifier_list_wrap = false +ij_java_multi_catch_types_wrap = normal +ij_java_names_count_to_use_import_on_demand = 1 +ij_java_new_line_after_lparen_in_annotation = false +ij_java_new_line_after_lparen_in_deconstruction_pattern = true +ij_java_new_line_after_lparen_in_record_header = false +ij_java_packages_to_use_import_on_demand = java.awt.*, javax.swing.* +ij_java_parameter_annotation_wrap = off +ij_java_parameter_name_prefix = +ij_java_parameter_name_suffix = +ij_java_parentheses_expression_new_line_after_left_paren = false +ij_java_parentheses_expression_right_paren_on_new_line = false +ij_java_place_assignment_sign_on_next_line = false +ij_java_prefer_longer_names = true +ij_java_prefer_parameters_wrap = false +ij_java_record_components_wrap = normal +ij_java_repeat_annotations = +ij_java_repeat_synchronized = true +ij_java_replace_instanceof_and_cast = false +ij_java_replace_null_check = true +ij_java_replace_sum_lambda_with_method_ref = true +ij_java_resource_list_new_line_after_left_paren = false +ij_java_resource_list_right_paren_on_new_line = false +ij_java_resource_list_wrap = off +ij_java_rparen_on_new_line_in_annotation = false +ij_java_rparen_on_new_line_in_deconstruction_pattern = true +ij_java_rparen_on_new_line_in_record_header = false +ij_java_servlet_class_prefix = +ij_java_servlet_class_suffix = +ij_java_servlet_dd_prefix = +ij_java_servlet_dd_suffix = +ij_java_session_dd_prefix = +ij_java_session_dd_suffix = EJB +ij_java_session_eb_prefix = +ij_java_session_eb_suffix = Bean +ij_java_session_hi_prefix = +ij_java_session_hi_suffix = Home +ij_java_session_lhi_prefix = Local +ij_java_session_lhi_suffix = Home +ij_java_session_li_prefix = Local +ij_java_session_li_suffix = +ij_java_session_ri_prefix = +ij_java_session_ri_suffix = +ij_java_session_si_prefix = +ij_java_session_si_suffix = Service +ij_java_space_after_closing_angle_bracket_in_type_argument = false +ij_java_space_after_colon = true +ij_java_space_after_comma = true +ij_java_space_after_comma_in_type_arguments = true +ij_java_space_after_for_semicolon = true +ij_java_space_after_quest = true +ij_java_space_after_type_cast = false +ij_java_space_before_annotation_array_initializer_left_brace = false +ij_java_space_before_annotation_parameter_list = false +ij_java_space_before_array_initializer_left_brace = true +ij_java_space_before_catch_keyword = true +ij_java_space_before_catch_left_brace = true +ij_java_space_before_catch_parentheses = true +ij_java_space_before_class_left_brace = true +ij_java_space_before_colon = true +ij_java_space_before_colon_in_foreach = true +ij_java_space_before_comma = false +ij_java_space_before_deconstruction_list = false +ij_java_space_before_do_left_brace = true +ij_java_space_before_else_keyword = true +ij_java_space_before_else_left_brace = true +ij_java_space_before_finally_keyword = true +ij_java_space_before_finally_left_brace = true +ij_java_space_before_for_left_brace = true +ij_java_space_before_for_parentheses = true +ij_java_space_before_for_semicolon = false +ij_java_space_before_if_left_brace = true +ij_java_space_before_if_parentheses = true +ij_java_space_before_method_call_parentheses = false +ij_java_space_before_method_left_brace = true +ij_java_space_before_method_parentheses = false +ij_java_space_before_opening_angle_bracket_in_type_parameter = false +ij_java_space_before_quest = true +ij_java_space_before_switch_left_brace = true +ij_java_space_before_switch_parentheses = true +ij_java_space_before_synchronized_left_brace = true +ij_java_space_before_synchronized_parentheses = true +ij_java_space_before_try_left_brace = true +ij_java_space_before_try_parentheses = true +ij_java_space_before_type_parameter_list = false +ij_java_space_before_while_keyword = true +ij_java_space_before_while_left_brace = true +ij_java_space_before_while_parentheses = true +ij_java_space_inside_one_line_enum_braces = false +ij_java_space_within_empty_array_initializer_braces = false +ij_java_space_within_empty_method_call_parentheses = false +ij_java_space_within_empty_method_parentheses = false +ij_java_spaces_around_additive_operators = true +ij_java_spaces_around_annotation_eq = true +ij_java_spaces_around_assignment_operators = true +ij_java_spaces_around_bitwise_operators = true +ij_java_spaces_around_equality_operators = true +ij_java_spaces_around_lambda_arrow = true +ij_java_spaces_around_logical_operators = true +ij_java_spaces_around_method_ref_dbl_colon = false +ij_java_spaces_around_multiplicative_operators = true +ij_java_spaces_around_relational_operators = true +ij_java_spaces_around_shift_operators = true +ij_java_spaces_around_type_bounds_in_type_parameters = true +ij_java_spaces_around_unary_operator = false +ij_java_spaces_within_angle_brackets = false +ij_java_spaces_within_annotation_parentheses = false +ij_java_spaces_within_array_initializer_braces = false +ij_java_spaces_within_braces = false +ij_java_spaces_within_brackets = false +ij_java_spaces_within_cast_parentheses = false +ij_java_spaces_within_catch_parentheses = false +ij_java_spaces_within_deconstruction_list = false +ij_java_spaces_within_for_parentheses = false +ij_java_spaces_within_if_parentheses = false +ij_java_spaces_within_method_call_parentheses = false +ij_java_spaces_within_method_parentheses = false +ij_java_spaces_within_parentheses = false +ij_java_spaces_within_record_header = false +ij_java_spaces_within_switch_parentheses = false +ij_java_spaces_within_synchronized_parentheses = false +ij_java_spaces_within_try_parentheses = false +ij_java_spaces_within_while_parentheses = false +ij_java_special_else_if_treatment = true +ij_java_static_field_name_prefix = +ij_java_static_field_name_suffix = +ij_java_subclass_name_prefix = +ij_java_subclass_name_suffix = Impl +ij_java_ternary_operation_signs_on_next_line = false +ij_java_ternary_operation_wrap = normal +ij_java_test_name_prefix = +ij_java_test_name_suffix = Test +ij_java_throws_keyword_wrap = off +ij_java_throws_list_wrap = on_every_item +ij_java_use_external_annotations = false +ij_java_use_fq_class_names = false +ij_java_use_relative_indents = false +ij_java_use_single_class_imports = true +ij_java_variable_annotation_wrap = off +ij_java_visibility = public +ij_java_while_brace_force = never +ij_java_while_on_new_line = false +ij_java_wrap_comments = false +ij_java_wrap_first_method_in_call_chain = false +ij_java_wrap_long_lines = false + +[*.less] +indent_size = 2 +ij_less_align_closing_brace_with_properties = false +ij_less_blank_lines_around_nested_selector = 1 +ij_less_blank_lines_between_blocks = 1 +ij_less_block_comment_add_space = false +ij_less_brace_placement = 0 +ij_less_enforce_quotes_on_format = false +ij_less_hex_color_long_format = false +ij_less_hex_color_lower_case = false +ij_less_hex_color_short_format = false +ij_less_hex_color_upper_case = false +ij_less_keep_blank_lines_in_code = 2 +ij_less_keep_indents_on_empty_lines = false +ij_less_keep_single_line_blocks = false +ij_less_line_comment_add_space = false +ij_less_line_comment_at_first_column = false +ij_less_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_less_space_after_colon = true +ij_less_space_before_opening_brace = true +ij_less_use_double_quotes = true +ij_less_value_alignment = 0 + +[*.proto] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_protobuf_keep_blank_lines_in_code = 2 +ij_protobuf_keep_indents_on_empty_lines = false +ij_protobuf_keep_line_breaks = true +ij_protobuf_space_after_comma = true +ij_protobuf_space_before_comma = false +ij_protobuf_spaces_around_assignment_operators = true +ij_protobuf_spaces_within_braces = false +ij_protobuf_spaces_within_brackets = false + +[*.sass] +indent_size = 2 +ij_sass_align_closing_brace_with_properties = false +ij_sass_blank_lines_around_nested_selector = 1 +ij_sass_blank_lines_between_blocks = 1 +ij_sass_brace_placement = 0 +ij_sass_enforce_quotes_on_format = false +ij_sass_hex_color_long_format = false +ij_sass_hex_color_lower_case = false +ij_sass_hex_color_short_format = false +ij_sass_hex_color_upper_case = false +ij_sass_keep_blank_lines_in_code = 2 +ij_sass_keep_indents_on_empty_lines = false +ij_sass_keep_single_line_blocks = false +ij_sass_line_comment_add_space = false +ij_sass_line_comment_at_first_column = false +ij_sass_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_sass_space_after_colon = true +ij_sass_space_before_opening_brace = true +ij_sass_use_double_quotes = true +ij_sass_value_alignment = 0 + +[*.scss] +indent_size = 2 +ij_scss_align_closing_brace_with_properties = false +ij_scss_blank_lines_around_nested_selector = 1 +ij_scss_blank_lines_between_blocks = 1 +ij_scss_block_comment_add_space = false +ij_scss_brace_placement = 0 +ij_scss_enforce_quotes_on_format = false +ij_scss_hex_color_long_format = false +ij_scss_hex_color_lower_case = false +ij_scss_hex_color_short_format = false +ij_scss_hex_color_upper_case = false +ij_scss_keep_blank_lines_in_code = 2 +ij_scss_keep_indents_on_empty_lines = false +ij_scss_keep_single_line_blocks = false +ij_scss_line_comment_add_space = false +ij_scss_line_comment_at_first_column = false +ij_scss_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_scss_space_after_colon = true +ij_scss_space_before_opening_brace = true +ij_scss_use_double_quotes = true +ij_scss_value_alignment = 0 + +[*.vue] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_vue_indent_children_of_top_level = template +ij_vue_interpolation_new_line_after_start_delimiter = true +ij_vue_interpolation_new_line_before_end_delimiter = true +ij_vue_interpolation_wrap = off +ij_vue_keep_indents_on_empty_lines = false +ij_vue_spaces_within_interpolation_expressions = true + +[.editorconfig] +ij_editorconfig_align_group_field_declarations = false +ij_editorconfig_space_after_colon = false +ij_editorconfig_space_after_comma = true +ij_editorconfig_space_before_colon = false +ij_editorconfig_space_before_comma = false +ij_editorconfig_spaces_around_assignment_operators = true + +[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.rng,*.tld,*.wadl,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}] +ij_xml_align_attributes = true +ij_xml_align_text = false +ij_xml_attribute_wrap = normal +ij_xml_block_comment_add_space = false +ij_xml_block_comment_at_first_column = true +ij_xml_keep_blank_lines = 2 +ij_xml_keep_indents_on_empty_lines = false +ij_xml_keep_line_breaks = true +ij_xml_keep_line_breaks_in_text = true +ij_xml_keep_whitespaces = false +ij_xml_keep_whitespaces_around_cdata = preserve +ij_xml_keep_whitespaces_inside_cdata = false +ij_xml_line_comment_at_first_column = true +ij_xml_space_after_tag_name = false +ij_xml_space_around_equals_in_attribute = false +ij_xml_space_inside_empty_tag = false +ij_xml_text_wrap = normal + +[{*.ats,*.cts,*.mts,*.ts}] +ij_continuation_indent_size = 4 +ij_typescript_align_imports = false +ij_typescript_align_multiline_array_initializer_expression = false +ij_typescript_align_multiline_binary_operation = false +ij_typescript_align_multiline_chained_methods = false +ij_typescript_align_multiline_extends_list = false +ij_typescript_align_multiline_for = true +ij_typescript_align_multiline_parameters = true +ij_typescript_align_multiline_parameters_in_calls = false +ij_typescript_align_multiline_ternary_operation = false +ij_typescript_align_object_properties = 0 +ij_typescript_align_union_types = false +ij_typescript_align_var_statements = 0 +ij_typescript_array_initializer_new_line_after_left_brace = false +ij_typescript_array_initializer_right_brace_on_new_line = false +ij_typescript_array_initializer_wrap = off +ij_typescript_assignment_wrap = off +ij_typescript_binary_operation_sign_on_next_line = false +ij_typescript_binary_operation_wrap = off +ij_typescript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_typescript_blank_lines_after_imports = 1 +ij_typescript_blank_lines_around_class = 1 +ij_typescript_blank_lines_around_field = 0 +ij_typescript_blank_lines_around_field_in_interface = 0 +ij_typescript_blank_lines_around_function = 1 +ij_typescript_blank_lines_around_method = 1 +ij_typescript_blank_lines_around_method_in_interface = 1 +ij_typescript_block_brace_style = end_of_line +ij_typescript_block_comment_add_space = false +ij_typescript_block_comment_at_first_column = true +ij_typescript_call_parameters_new_line_after_left_paren = false +ij_typescript_call_parameters_right_paren_on_new_line = false +ij_typescript_call_parameters_wrap = off +ij_typescript_catch_on_new_line = false +ij_typescript_chained_call_dot_on_new_line = true +ij_typescript_class_brace_style = end_of_line +ij_typescript_comma_on_new_line = false +ij_typescript_do_while_brace_force = never +ij_typescript_else_on_new_line = false +ij_typescript_enforce_trailing_comma = keep +ij_typescript_enum_constants_wrap = on_every_item +ij_typescript_extends_keyword_wrap = off +ij_typescript_extends_list_wrap = off +ij_typescript_field_prefix = _ +ij_typescript_file_name_style = relaxed +ij_typescript_finally_on_new_line = false +ij_typescript_for_brace_force = never +ij_typescript_for_statement_new_line_after_left_paren = false +ij_typescript_for_statement_right_paren_on_new_line = false +ij_typescript_for_statement_wrap = off +ij_typescript_force_quote_style = false +ij_typescript_force_semicolon_style = false +ij_typescript_function_expression_brace_style = end_of_line +ij_typescript_if_brace_force = never +ij_typescript_import_merge_members = global +ij_typescript_import_prefer_absolute_path = global +ij_typescript_import_sort_members = true +ij_typescript_import_sort_module_name = false +ij_typescript_import_use_node_resolution = true +ij_typescript_imports_wrap = on_every_item +ij_typescript_indent_case_from_switch = true +ij_typescript_indent_chained_calls = true +ij_typescript_indent_package_children = 0 +ij_typescript_jsdoc_include_types = false +ij_typescript_jsx_attribute_value = braces +ij_typescript_keep_blank_lines_in_code = 2 +ij_typescript_keep_first_column_comment = true +ij_typescript_keep_indents_on_empty_lines = false +ij_typescript_keep_line_breaks = true +ij_typescript_keep_simple_blocks_in_one_line = false +ij_typescript_keep_simple_methods_in_one_line = false +ij_typescript_line_comment_add_space = true +ij_typescript_line_comment_at_first_column = false +ij_typescript_method_brace_style = end_of_line +ij_typescript_method_call_chain_wrap = off +ij_typescript_method_parameters_new_line_after_left_paren = false +ij_typescript_method_parameters_right_paren_on_new_line = false +ij_typescript_method_parameters_wrap = off +ij_typescript_object_literal_wrap = on_every_item +ij_typescript_object_types_wrap = on_every_item +ij_typescript_parentheses_expression_new_line_after_left_paren = false +ij_typescript_parentheses_expression_right_paren_on_new_line = false +ij_typescript_place_assignment_sign_on_next_line = false +ij_typescript_prefer_as_type_cast = false +ij_typescript_prefer_explicit_types_function_expression_returns = false +ij_typescript_prefer_explicit_types_function_returns = false +ij_typescript_prefer_explicit_types_vars_fields = false +ij_typescript_prefer_parameters_wrap = false +ij_typescript_property_prefix = +ij_typescript_reformat_c_style_comments = false +ij_typescript_space_after_colon = true +ij_typescript_space_after_comma = true +ij_typescript_space_after_dots_in_rest_parameter = false +ij_typescript_space_after_generator_mult = true +ij_typescript_space_after_property_colon = true +ij_typescript_space_after_quest = true +ij_typescript_space_after_type_colon = true +ij_typescript_space_after_unary_not = false +ij_typescript_space_before_async_arrow_lparen = true +ij_typescript_space_before_catch_keyword = true +ij_typescript_space_before_catch_left_brace = true +ij_typescript_space_before_catch_parentheses = true +ij_typescript_space_before_class_lbrace = true +ij_typescript_space_before_class_left_brace = true +ij_typescript_space_before_colon = true +ij_typescript_space_before_comma = false +ij_typescript_space_before_do_left_brace = true +ij_typescript_space_before_else_keyword = true +ij_typescript_space_before_else_left_brace = true +ij_typescript_space_before_finally_keyword = true +ij_typescript_space_before_finally_left_brace = true +ij_typescript_space_before_for_left_brace = true +ij_typescript_space_before_for_parentheses = true +ij_typescript_space_before_for_semicolon = false +ij_typescript_space_before_function_left_parenth = true +ij_typescript_space_before_generator_mult = false +ij_typescript_space_before_if_left_brace = true +ij_typescript_space_before_if_parentheses = true +ij_typescript_space_before_method_call_parentheses = false +ij_typescript_space_before_method_left_brace = true +ij_typescript_space_before_method_parentheses = false +ij_typescript_space_before_property_colon = false +ij_typescript_space_before_quest = true +ij_typescript_space_before_switch_left_brace = true +ij_typescript_space_before_switch_parentheses = true +ij_typescript_space_before_try_left_brace = true +ij_typescript_space_before_type_colon = false +ij_typescript_space_before_unary_not = false +ij_typescript_space_before_while_keyword = true +ij_typescript_space_before_while_left_brace = true +ij_typescript_space_before_while_parentheses = true +ij_typescript_spaces_around_additive_operators = true +ij_typescript_spaces_around_arrow_function_operator = true +ij_typescript_spaces_around_assignment_operators = true +ij_typescript_spaces_around_bitwise_operators = true +ij_typescript_spaces_around_equality_operators = true +ij_typescript_spaces_around_logical_operators = true +ij_typescript_spaces_around_multiplicative_operators = true +ij_typescript_spaces_around_relational_operators = true +ij_typescript_spaces_around_shift_operators = true +ij_typescript_spaces_around_unary_operator = false +ij_typescript_spaces_within_array_initializer_brackets = false +ij_typescript_spaces_within_brackets = false +ij_typescript_spaces_within_catch_parentheses = false +ij_typescript_spaces_within_for_parentheses = false +ij_typescript_spaces_within_if_parentheses = false +ij_typescript_spaces_within_imports = false +ij_typescript_spaces_within_interpolation_expressions = false +ij_typescript_spaces_within_method_call_parentheses = false +ij_typescript_spaces_within_method_parentheses = false +ij_typescript_spaces_within_object_literal_braces = false +ij_typescript_spaces_within_object_type_braces = true +ij_typescript_spaces_within_parentheses = false +ij_typescript_spaces_within_switch_parentheses = false +ij_typescript_spaces_within_type_assertion = false +ij_typescript_spaces_within_union_types = true +ij_typescript_spaces_within_while_parentheses = false +ij_typescript_special_else_if_treatment = true +ij_typescript_ternary_operation_signs_on_next_line = false +ij_typescript_ternary_operation_wrap = off +ij_typescript_union_types_wrap = on_every_item +ij_typescript_use_chained_calls_group_indents = false +ij_typescript_use_double_quotes = true +ij_typescript_use_explicit_js_extension = auto +ij_typescript_use_import_type = auto +ij_typescript_use_path_mapping = always +ij_typescript_use_public_modifier = false +ij_typescript_use_semicolon_after_statement = true +ij_typescript_var_declaration_wrap = normal +ij_typescript_while_brace_force = never +ij_typescript_while_on_new_line = false +ij_typescript_wrap_comments = false + +[{*.bash,*.sh,*.zsh}] +indent_size = 2 +tab_width = 2 +ij_shell_binary_ops_start_line = false +ij_shell_keep_column_alignment_padding = false +ij_shell_minify_program = false +ij_shell_redirect_followed_by_space = false +ij_shell_switch_cases_indented = false +ij_shell_use_unix_line_separator = true + +[{*.cjs,*.js}] +ij_continuation_indent_size = 4 +ij_javascript_align_imports = false +ij_javascript_align_multiline_array_initializer_expression = false +ij_javascript_align_multiline_binary_operation = false +ij_javascript_align_multiline_chained_methods = false +ij_javascript_align_multiline_extends_list = false +ij_javascript_align_multiline_for = true +ij_javascript_align_multiline_parameters = true +ij_javascript_align_multiline_parameters_in_calls = false +ij_javascript_align_multiline_ternary_operation = false +ij_javascript_align_object_properties = 0 +ij_javascript_align_union_types = false +ij_javascript_align_var_statements = 0 +ij_javascript_array_initializer_new_line_after_left_brace = false +ij_javascript_array_initializer_right_brace_on_new_line = false +ij_javascript_array_initializer_wrap = off +ij_javascript_assignment_wrap = off +ij_javascript_binary_operation_sign_on_next_line = false +ij_javascript_binary_operation_wrap = off +ij_javascript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_javascript_blank_lines_after_imports = 1 +ij_javascript_blank_lines_around_class = 1 +ij_javascript_blank_lines_around_field = 0 +ij_javascript_blank_lines_around_function = 1 +ij_javascript_blank_lines_around_method = 1 +ij_javascript_block_brace_style = end_of_line +ij_javascript_block_comment_add_space = false +ij_javascript_block_comment_at_first_column = true +ij_javascript_call_parameters_new_line_after_left_paren = false +ij_javascript_call_parameters_right_paren_on_new_line = false +ij_javascript_call_parameters_wrap = off +ij_javascript_catch_on_new_line = false +ij_javascript_chained_call_dot_on_new_line = true +ij_javascript_class_brace_style = end_of_line +ij_javascript_comma_on_new_line = false +ij_javascript_do_while_brace_force = never +ij_javascript_else_on_new_line = false +ij_javascript_enforce_trailing_comma = keep +ij_javascript_extends_keyword_wrap = off +ij_javascript_extends_list_wrap = off +ij_javascript_field_prefix = _ +ij_javascript_file_name_style = relaxed +ij_javascript_finally_on_new_line = false +ij_javascript_for_brace_force = never +ij_javascript_for_statement_new_line_after_left_paren = false +ij_javascript_for_statement_right_paren_on_new_line = false +ij_javascript_for_statement_wrap = off +ij_javascript_force_quote_style = false +ij_javascript_force_semicolon_style = false +ij_javascript_function_expression_brace_style = end_of_line +ij_javascript_if_brace_force = never +ij_javascript_import_merge_members = global +ij_javascript_import_prefer_absolute_path = global +ij_javascript_import_sort_members = true +ij_javascript_import_sort_module_name = false +ij_javascript_import_use_node_resolution = true +ij_javascript_imports_wrap = on_every_item +ij_javascript_indent_case_from_switch = true +ij_javascript_indent_chained_calls = true +ij_javascript_indent_package_children = 0 +ij_javascript_jsx_attribute_value = braces +ij_javascript_keep_blank_lines_in_code = 2 +ij_javascript_keep_first_column_comment = true +ij_javascript_keep_indents_on_empty_lines = false +ij_javascript_keep_line_breaks = true +ij_javascript_keep_simple_blocks_in_one_line = false +ij_javascript_keep_simple_methods_in_one_line = false +ij_javascript_line_comment_add_space = true +ij_javascript_line_comment_at_first_column = false +ij_javascript_method_brace_style = end_of_line +ij_javascript_method_call_chain_wrap = off +ij_javascript_method_parameters_new_line_after_left_paren = false +ij_javascript_method_parameters_right_paren_on_new_line = false +ij_javascript_method_parameters_wrap = off +ij_javascript_object_literal_wrap = on_every_item +ij_javascript_object_types_wrap = on_every_item +ij_javascript_parentheses_expression_new_line_after_left_paren = false +ij_javascript_parentheses_expression_right_paren_on_new_line = false +ij_javascript_place_assignment_sign_on_next_line = false +ij_javascript_prefer_as_type_cast = false +ij_javascript_prefer_explicit_types_function_expression_returns = false +ij_javascript_prefer_explicit_types_function_returns = false +ij_javascript_prefer_explicit_types_vars_fields = false +ij_javascript_prefer_parameters_wrap = false +ij_javascript_property_prefix = +ij_javascript_reformat_c_style_comments = false +ij_javascript_space_after_colon = true +ij_javascript_space_after_comma = true +ij_javascript_space_after_dots_in_rest_parameter = false +ij_javascript_space_after_generator_mult = true +ij_javascript_space_after_property_colon = true +ij_javascript_space_after_quest = true +ij_javascript_space_after_type_colon = true +ij_javascript_space_after_unary_not = false +ij_javascript_space_before_async_arrow_lparen = true +ij_javascript_space_before_catch_keyword = true +ij_javascript_space_before_catch_left_brace = true +ij_javascript_space_before_catch_parentheses = true +ij_javascript_space_before_class_lbrace = true +ij_javascript_space_before_class_left_brace = true +ij_javascript_space_before_colon = true +ij_javascript_space_before_comma = false +ij_javascript_space_before_do_left_brace = true +ij_javascript_space_before_else_keyword = true +ij_javascript_space_before_else_left_brace = true +ij_javascript_space_before_finally_keyword = true +ij_javascript_space_before_finally_left_brace = true +ij_javascript_space_before_for_left_brace = true +ij_javascript_space_before_for_parentheses = true +ij_javascript_space_before_for_semicolon = false +ij_javascript_space_before_function_left_parenth = true +ij_javascript_space_before_generator_mult = false +ij_javascript_space_before_if_left_brace = true +ij_javascript_space_before_if_parentheses = true +ij_javascript_space_before_method_call_parentheses = false +ij_javascript_space_before_method_left_brace = true +ij_javascript_space_before_method_parentheses = false +ij_javascript_space_before_property_colon = false +ij_javascript_space_before_quest = true +ij_javascript_space_before_switch_left_brace = true +ij_javascript_space_before_switch_parentheses = true +ij_javascript_space_before_try_left_brace = true +ij_javascript_space_before_type_colon = false +ij_javascript_space_before_unary_not = false +ij_javascript_space_before_while_keyword = true +ij_javascript_space_before_while_left_brace = true +ij_javascript_space_before_while_parentheses = true +ij_javascript_spaces_around_additive_operators = true +ij_javascript_spaces_around_arrow_function_operator = true +ij_javascript_spaces_around_assignment_operators = true +ij_javascript_spaces_around_bitwise_operators = true +ij_javascript_spaces_around_equality_operators = true +ij_javascript_spaces_around_logical_operators = true +ij_javascript_spaces_around_multiplicative_operators = true +ij_javascript_spaces_around_relational_operators = true +ij_javascript_spaces_around_shift_operators = true +ij_javascript_spaces_around_unary_operator = false +ij_javascript_spaces_within_array_initializer_brackets = false +ij_javascript_spaces_within_brackets = false +ij_javascript_spaces_within_catch_parentheses = false +ij_javascript_spaces_within_for_parentheses = false +ij_javascript_spaces_within_if_parentheses = false +ij_javascript_spaces_within_imports = false +ij_javascript_spaces_within_interpolation_expressions = false +ij_javascript_spaces_within_method_call_parentheses = false +ij_javascript_spaces_within_method_parentheses = false +ij_javascript_spaces_within_object_literal_braces = false +ij_javascript_spaces_within_object_type_braces = true +ij_javascript_spaces_within_parentheses = false +ij_javascript_spaces_within_switch_parentheses = false +ij_javascript_spaces_within_type_assertion = false +ij_javascript_spaces_within_union_types = true +ij_javascript_spaces_within_while_parentheses = false +ij_javascript_special_else_if_treatment = true +ij_javascript_ternary_operation_signs_on_next_line = false +ij_javascript_ternary_operation_wrap = off +ij_javascript_union_types_wrap = on_every_item +ij_javascript_use_chained_calls_group_indents = false +ij_javascript_use_double_quotes = true +ij_javascript_use_explicit_js_extension = auto +ij_javascript_use_import_type = auto +ij_javascript_use_path_mapping = always +ij_javascript_use_public_modifier = false +ij_javascript_use_semicolon_after_statement = true +ij_javascript_var_declaration_wrap = normal +ij_javascript_while_brace_force = never +ij_javascript_while_on_new_line = false +ij_javascript_wrap_comments = false + +[{*.ft,*.vm,*.vsl}] +ij_vtl_keep_indents_on_empty_lines = false + +[{*.gant,*.groovy,*.gy}] +ij_groovy_align_group_field_declarations = false +ij_groovy_align_multiline_array_initializer_expression = false +ij_groovy_align_multiline_assignment = false +ij_groovy_align_multiline_binary_operation = false +ij_groovy_align_multiline_chained_methods = false +ij_groovy_align_multiline_extends_list = false +ij_groovy_align_multiline_for = true +ij_groovy_align_multiline_list_or_map = true +ij_groovy_align_multiline_method_parentheses = false +ij_groovy_align_multiline_parameters = true +ij_groovy_align_multiline_parameters_in_calls = false +ij_groovy_align_multiline_resources = true +ij_groovy_align_multiline_ternary_operation = false +ij_groovy_align_multiline_throws_list = false +ij_groovy_align_named_args_in_map = true +ij_groovy_align_throws_keyword = false +ij_groovy_array_initializer_new_line_after_left_brace = false +ij_groovy_array_initializer_right_brace_on_new_line = false +ij_groovy_array_initializer_wrap = off +ij_groovy_assert_statement_wrap = off +ij_groovy_assignment_wrap = off +ij_groovy_binary_operation_wrap = off +ij_groovy_blank_lines_after_class_header = 0 +ij_groovy_blank_lines_after_imports = 1 +ij_groovy_blank_lines_after_package = 1 +ij_groovy_blank_lines_around_class = 1 +ij_groovy_blank_lines_around_field = 0 +ij_groovy_blank_lines_around_field_in_interface = 0 +ij_groovy_blank_lines_around_method = 1 +ij_groovy_blank_lines_around_method_in_interface = 1 +ij_groovy_blank_lines_before_imports = 1 +ij_groovy_blank_lines_before_method_body = 0 +ij_groovy_blank_lines_before_package = 0 +ij_groovy_block_brace_style = end_of_line +ij_groovy_block_comment_add_space = false +ij_groovy_block_comment_at_first_column = true +ij_groovy_call_parameters_new_line_after_left_paren = false +ij_groovy_call_parameters_right_paren_on_new_line = false +ij_groovy_call_parameters_wrap = off +ij_groovy_catch_on_new_line = false +ij_groovy_class_annotation_wrap = split_into_lines +ij_groovy_class_brace_style = end_of_line +ij_groovy_class_count_to_use_import_on_demand = 5 +ij_groovy_do_while_brace_force = never +ij_groovy_else_on_new_line = false +ij_groovy_enable_groovydoc_formatting = true +ij_groovy_enum_constants_wrap = off +ij_groovy_extends_keyword_wrap = off +ij_groovy_extends_list_wrap = off +ij_groovy_field_annotation_wrap = split_into_lines +ij_groovy_finally_on_new_line = false +ij_groovy_for_brace_force = never +ij_groovy_for_statement_new_line_after_left_paren = false +ij_groovy_for_statement_right_paren_on_new_line = false +ij_groovy_for_statement_wrap = off +ij_groovy_ginq_general_clause_wrap_policy = 2 +ij_groovy_ginq_having_wrap_policy = 1 +ij_groovy_ginq_indent_having_clause = true +ij_groovy_ginq_indent_on_clause = true +ij_groovy_ginq_on_wrap_policy = 1 +ij_groovy_ginq_space_after_keyword = true +ij_groovy_if_brace_force = never +ij_groovy_import_annotation_wrap = 2 +ij_groovy_imports_layout = *, |, javax.**, java.**, |, $* +ij_groovy_indent_case_from_switch = true +ij_groovy_indent_label_blocks = true +ij_groovy_insert_inner_class_imports = false +ij_groovy_keep_blank_lines_before_right_brace = 2 +ij_groovy_keep_blank_lines_in_code = 2 +ij_groovy_keep_blank_lines_in_declarations = 2 +ij_groovy_keep_control_statement_in_one_line = true +ij_groovy_keep_first_column_comment = true +ij_groovy_keep_indents_on_empty_lines = false +ij_groovy_keep_line_breaks = true +ij_groovy_keep_multiple_expressions_in_one_line = false +ij_groovy_keep_simple_blocks_in_one_line = false +ij_groovy_keep_simple_classes_in_one_line = true +ij_groovy_keep_simple_lambdas_in_one_line = true +ij_groovy_keep_simple_methods_in_one_line = true +ij_groovy_label_indent_absolute = false +ij_groovy_label_indent_size = 0 +ij_groovy_lambda_brace_style = end_of_line +ij_groovy_layout_static_imports_separately = true +ij_groovy_line_comment_add_space = false +ij_groovy_line_comment_add_space_on_reformat = false +ij_groovy_line_comment_at_first_column = true +ij_groovy_method_annotation_wrap = split_into_lines +ij_groovy_method_brace_style = end_of_line +ij_groovy_method_call_chain_wrap = off +ij_groovy_method_parameters_new_line_after_left_paren = false +ij_groovy_method_parameters_right_paren_on_new_line = false +ij_groovy_method_parameters_wrap = off +ij_groovy_modifier_list_wrap = false +ij_groovy_names_count_to_use_import_on_demand = 3 +ij_groovy_packages_to_use_import_on_demand = java.awt.*, javax.swing.* +ij_groovy_parameter_annotation_wrap = off +ij_groovy_parentheses_expression_new_line_after_left_paren = false +ij_groovy_parentheses_expression_right_paren_on_new_line = false +ij_groovy_prefer_parameters_wrap = false +ij_groovy_resource_list_new_line_after_left_paren = false +ij_groovy_resource_list_right_paren_on_new_line = false +ij_groovy_resource_list_wrap = off +ij_groovy_space_after_assert_separator = true +ij_groovy_space_after_colon = true +ij_groovy_space_after_comma = true +ij_groovy_space_after_comma_in_type_arguments = true +ij_groovy_space_after_for_semicolon = true +ij_groovy_space_after_quest = true +ij_groovy_space_after_type_cast = true +ij_groovy_space_before_annotation_parameter_list = false +ij_groovy_space_before_array_initializer_left_brace = false +ij_groovy_space_before_assert_separator = false +ij_groovy_space_before_catch_keyword = true +ij_groovy_space_before_catch_left_brace = true +ij_groovy_space_before_catch_parentheses = true +ij_groovy_space_before_class_left_brace = true +ij_groovy_space_before_closure_left_brace = true +ij_groovy_space_before_colon = true +ij_groovy_space_before_comma = false +ij_groovy_space_before_do_left_brace = true +ij_groovy_space_before_else_keyword = true +ij_groovy_space_before_else_left_brace = true +ij_groovy_space_before_finally_keyword = true +ij_groovy_space_before_finally_left_brace = true +ij_groovy_space_before_for_left_brace = true +ij_groovy_space_before_for_parentheses = true +ij_groovy_space_before_for_semicolon = false +ij_groovy_space_before_if_left_brace = true +ij_groovy_space_before_if_parentheses = true +ij_groovy_space_before_method_call_parentheses = false +ij_groovy_space_before_method_left_brace = true +ij_groovy_space_before_method_parentheses = false +ij_groovy_space_before_quest = true +ij_groovy_space_before_record_parentheses = false +ij_groovy_space_before_switch_left_brace = true +ij_groovy_space_before_switch_parentheses = true +ij_groovy_space_before_synchronized_left_brace = true +ij_groovy_space_before_synchronized_parentheses = true +ij_groovy_space_before_try_left_brace = true +ij_groovy_space_before_try_parentheses = true +ij_groovy_space_before_while_keyword = true +ij_groovy_space_before_while_left_brace = true +ij_groovy_space_before_while_parentheses = true +ij_groovy_space_in_named_argument = true +ij_groovy_space_in_named_argument_before_colon = false +ij_groovy_space_within_empty_array_initializer_braces = false +ij_groovy_space_within_empty_method_call_parentheses = false +ij_groovy_spaces_around_additive_operators = true +ij_groovy_spaces_around_assignment_operators = true +ij_groovy_spaces_around_bitwise_operators = true +ij_groovy_spaces_around_equality_operators = true +ij_groovy_spaces_around_lambda_arrow = true +ij_groovy_spaces_around_logical_operators = true +ij_groovy_spaces_around_multiplicative_operators = true +ij_groovy_spaces_around_regex_operators = true +ij_groovy_spaces_around_relational_operators = true +ij_groovy_spaces_around_shift_operators = true +ij_groovy_spaces_within_annotation_parentheses = false +ij_groovy_spaces_within_array_initializer_braces = false +ij_groovy_spaces_within_braces = true +ij_groovy_spaces_within_brackets = false +ij_groovy_spaces_within_cast_parentheses = false +ij_groovy_spaces_within_catch_parentheses = false +ij_groovy_spaces_within_for_parentheses = false +ij_groovy_spaces_within_gstring_injection_braces = false +ij_groovy_spaces_within_if_parentheses = false +ij_groovy_spaces_within_list_or_map = false +ij_groovy_spaces_within_method_call_parentheses = false +ij_groovy_spaces_within_method_parentheses = false +ij_groovy_spaces_within_parentheses = false +ij_groovy_spaces_within_switch_parentheses = false +ij_groovy_spaces_within_synchronized_parentheses = false +ij_groovy_spaces_within_try_parentheses = false +ij_groovy_spaces_within_tuple_expression = false +ij_groovy_spaces_within_while_parentheses = false +ij_groovy_special_else_if_treatment = true +ij_groovy_ternary_operation_wrap = off +ij_groovy_throws_keyword_wrap = off +ij_groovy_throws_list_wrap = off +ij_groovy_use_flying_geese_braces = false +ij_groovy_use_fq_class_names = false +ij_groovy_use_fq_class_names_in_javadoc = true +ij_groovy_use_relative_indents = false +ij_groovy_use_single_class_imports = true +ij_groovy_variable_annotation_wrap = off +ij_groovy_while_brace_force = never +ij_groovy_while_on_new_line = false +ij_groovy_wrap_chain_calls_after_dot = false +ij_groovy_wrap_long_lines = false + +[{*.graphqlconfig,*.graphqlrc,*.har,*.jsb2,*.jsb3,*.json,*.jsonc,*.postman_collection,*.postman_collection.json,*.postman_environment,*.postman_environment.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,jest.config}] +indent_size = 2 +ij_json_array_wrapping = split_into_lines +ij_json_keep_blank_lines_in_code = 0 +ij_json_keep_indents_on_empty_lines = false +ij_json_keep_line_breaks = true +ij_json_keep_trailing_comma = false +ij_json_object_wrapping = split_into_lines +ij_json_property_alignment = do_not_align +ij_json_space_after_colon = true +ij_json_space_after_comma = true +ij_json_space_before_colon = false +ij_json_space_before_comma = false +ij_json_spaces_within_braces = false +ij_json_spaces_within_brackets = false +ij_json_wrap_long_lines = false + +[{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}] +ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3 +ij_html_align_attributes = true +ij_html_align_text = false +ij_html_attribute_wrap = normal +ij_html_block_comment_add_space = false +ij_html_block_comment_at_first_column = true +ij_html_do_not_align_children_of_min_lines = 0 +ij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p +ij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot +ij_html_enforce_quotes = false +ij_html_inline_tags = a, abbr, acronym, b, basefont, bdo, big, br, cite, cite, code, dfn, em, font, i, img, input, kbd, label, q, s, samp, select, small, span, strike, strong, sub, sup, textarea, tt, u, var +ij_html_keep_blank_lines = 2 +ij_html_keep_indents_on_empty_lines = false +ij_html_keep_line_breaks = true +ij_html_keep_line_breaks_in_text = true +ij_html_keep_whitespaces = false +ij_html_keep_whitespaces_inside = span, pre, textarea +ij_html_line_comment_at_first_column = true +ij_html_new_line_after_last_attribute = never +ij_html_new_line_before_first_attribute = never +ij_html_quote_style = double +ij_html_remove_new_line_before_tags = br +ij_html_space_after_tag_name = false +ij_html_space_around_equality_in_attribute = false +ij_html_space_inside_empty_tag = false +ij_html_text_wrap = normal + +[{*.http,*.rest}] +indent_size = 0 +ij_continuation_indent_size = 4 +ij_http-request_call_parameters_wrap = normal +ij_http-request_method_parameters_wrap = split_into_lines +ij_http-request_space_before_comma = true +ij_http-request_spaces_around_assignment_operators = true + +[{*.jsf,*.jsp,*.jspf,*.tag,*.tagf,*.xjsp}] +ij_jsp_jsp_prefer_comma_separated_import_list = false +ij_jsp_keep_indents_on_empty_lines = false + +[{*.jspx,*.tagx}] +ij_jspx_keep_indents_on_empty_lines = false + +[{*.kt,*.kts}] +ij_kotlin_align_in_columns_case_branch = false +ij_kotlin_align_multiline_binary_operation = false +ij_kotlin_align_multiline_extends_list = false +ij_kotlin_align_multiline_method_parentheses = false +ij_kotlin_align_multiline_parameters = true +ij_kotlin_align_multiline_parameters_in_calls = false +ij_kotlin_allow_trailing_comma = false +ij_kotlin_allow_trailing_comma_on_call_site = false +ij_kotlin_assignment_wrap = off +ij_kotlin_blank_lines_after_class_header = 0 +ij_kotlin_blank_lines_around_block_when_branches = 0 +ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1 +ij_kotlin_block_comment_add_space = false +ij_kotlin_block_comment_at_first_column = true +ij_kotlin_call_parameters_new_line_after_left_paren = false +ij_kotlin_call_parameters_right_paren_on_new_line = false +ij_kotlin_call_parameters_wrap = off +ij_kotlin_catch_on_new_line = false +ij_kotlin_class_annotation_wrap = split_into_lines +ij_kotlin_continuation_indent_for_chained_calls = true +ij_kotlin_continuation_indent_for_expression_bodies = true +ij_kotlin_continuation_indent_in_argument_lists = true +ij_kotlin_continuation_indent_in_elvis = true +ij_kotlin_continuation_indent_in_if_conditions = true +ij_kotlin_continuation_indent_in_parameter_lists = true +ij_kotlin_continuation_indent_in_supertype_lists = true +ij_kotlin_else_on_new_line = false +ij_kotlin_enum_constants_wrap = off +ij_kotlin_extends_list_wrap = off +ij_kotlin_field_annotation_wrap = split_into_lines +ij_kotlin_finally_on_new_line = false +ij_kotlin_if_rparen_on_new_line = false +ij_kotlin_import_nested_classes = false +ij_kotlin_imports_layout = *, java.**, javax.**, kotlin.**, ^ +ij_kotlin_insert_whitespaces_in_simple_one_line_method = true +ij_kotlin_keep_blank_lines_before_right_brace = 2 +ij_kotlin_keep_blank_lines_in_code = 2 +ij_kotlin_keep_blank_lines_in_declarations = 2 +ij_kotlin_keep_first_column_comment = true +ij_kotlin_keep_indents_on_empty_lines = false +ij_kotlin_keep_line_breaks = true +ij_kotlin_lbrace_on_next_line = false +ij_kotlin_line_break_after_multiline_when_entry = true +ij_kotlin_line_comment_add_space = false +ij_kotlin_line_comment_add_space_on_reformat = false +ij_kotlin_line_comment_at_first_column = true +ij_kotlin_method_annotation_wrap = split_into_lines +ij_kotlin_method_call_chain_wrap = off +ij_kotlin_method_parameters_new_line_after_left_paren = false +ij_kotlin_method_parameters_right_paren_on_new_line = false +ij_kotlin_method_parameters_wrap = off +ij_kotlin_name_count_to_use_star_import = 5 +ij_kotlin_name_count_to_use_star_import_for_members = 3 +ij_kotlin_packages_to_use_import_on_demand = java.util.*, kotlinx.android.synthetic.**, io.ktor.** +ij_kotlin_parameter_annotation_wrap = off +ij_kotlin_space_after_comma = true +ij_kotlin_space_after_extend_colon = true +ij_kotlin_space_after_type_colon = true +ij_kotlin_space_before_catch_parentheses = true +ij_kotlin_space_before_comma = false +ij_kotlin_space_before_extend_colon = true +ij_kotlin_space_before_for_parentheses = true +ij_kotlin_space_before_if_parentheses = true +ij_kotlin_space_before_lambda_arrow = true +ij_kotlin_space_before_type_colon = false +ij_kotlin_space_before_when_parentheses = true +ij_kotlin_space_before_while_parentheses = true +ij_kotlin_spaces_around_additive_operators = true +ij_kotlin_spaces_around_assignment_operators = true +ij_kotlin_spaces_around_equality_operators = true +ij_kotlin_spaces_around_function_type_arrow = true +ij_kotlin_spaces_around_logical_operators = true +ij_kotlin_spaces_around_multiplicative_operators = true +ij_kotlin_spaces_around_range = false +ij_kotlin_spaces_around_relational_operators = true +ij_kotlin_spaces_around_unary_operator = false +ij_kotlin_spaces_around_when_arrow = true +ij_kotlin_variable_annotation_wrap = off +ij_kotlin_while_on_new_line = false +ij_kotlin_wrap_elvis_expressions = 1 +ij_kotlin_wrap_expression_body_functions = 0 +ij_kotlin_wrap_first_method_in_call_chain = false + +[{*.markdown,*.md}] +ij_markdown_force_one_space_after_blockquote_symbol = true +ij_markdown_force_one_space_after_header_symbol = true +ij_markdown_force_one_space_after_list_bullet = true +ij_markdown_force_one_space_between_words = true +ij_markdown_format_tables = true +ij_markdown_insert_quote_arrows_on_wrap = true +ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_keep_line_breaks_inside_text_blocks = true +ij_markdown_max_lines_around_block_elements = 1 +ij_markdown_max_lines_around_header = 1 +ij_markdown_max_lines_between_paragraphs = 1 +ij_markdown_min_lines_around_block_elements = 1 +ij_markdown_min_lines_around_header = 1 +ij_markdown_min_lines_between_paragraphs = 1 +ij_markdown_wrap_text_if_long = true +ij_markdown_wrap_text_inside_blockquotes = true + +[{*.pb,*.textproto,*.txtpb}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_prototext_keep_blank_lines_in_code = 2 +ij_prototext_keep_indents_on_empty_lines = false +ij_prototext_keep_line_breaks = true +ij_prototext_space_after_colon = true +ij_prototext_space_after_comma = true +ij_prototext_space_before_colon = false +ij_prototext_space_before_comma = false +ij_prototext_spaces_within_braces = true +ij_prototext_spaces_within_brackets = false + +[{*.properties,spring.handlers,spring.schemas}] +ij_properties_align_group_field_declarations = false +ij_properties_keep_blank_lines = false +ij_properties_key_value_delimiter = equals +ij_properties_spaces_around_key_value_delimiter = false + +[{*.qute.htm,*.qute.html,*.qute.json,*.qute.txt,*.qute.yaml,*.qute.yml}] +ij_qute_keep_indents_on_empty_lines = false + +[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}] +ij_toml_keep_indents_on_empty_lines = false + +[{*.yaml,*.yml}] +indent_size = 2 +ij_yaml_align_values_properties = do_not_align +ij_yaml_autoinsert_sequence_marker = true +ij_yaml_block_mapping_on_new_line = false +ij_yaml_indent_sequence_value = true +ij_yaml_keep_indents_on_empty_lines = false +ij_yaml_keep_line_breaks = true +ij_yaml_sequence_on_new_line = false +ij_yaml_space_before_colon = false +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = true From 141fb8f2a5ecc47d038a974da150910d885b1449 Mon Sep 17 00:00:00 2001 From: qlido Date: Fri, 5 Apr 2024 14:47:33 +0900 Subject: [PATCH 3/8] =?UTF-8?q?Feat:=20git=20hook=20&=20checkStyle=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=EC=9C=84=EC=B9=98=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 929f4ec8..564c6bf8 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,8 @@ plugins { id "jacoco" //CheckStyle id "checkstyle" + //git hooks + id "com.star-zero.gradle.githook" version "1.2.1" } group = 'com.project' @@ -137,4 +139,15 @@ checkstyle { configFile = file("checkstyle/naver-checkstyle-rules.xml") configProperties = ["suppressionFile": "checkstyle/naver-checkstyle-suppressions.xml"] } - +checkstyleMain.source = fileTree('src/main/java') + +githook { + failOnMissingHooksDir = false + createHooksDirIfNotExist = true + hooks { + "pre-commit" { + task = "check" + shell = "echo 1" + } + } +} From ea947f72e0e57096d5a20afbb973a7e353eeaec7 Mon Sep 17 00:00:00 2001 From: qlido Date: Fri, 5 Apr 2024 14:50:08 +0900 Subject: [PATCH 4/8] =?UTF-8?q?Refactor:=20CheckStyle=20=ED=98=95=EC=8B=9D?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/bumawiki/BumawikiApplication.java | 8 +- .../bumawiki/domain/auth/domain/AuthId.java | 18 +- .../domain/auth/domain/RefreshToken.java | 35 +-- .../domain/repository/AuthIdRepository.java | 9 +- .../repository/RefreshTokenRepository.java | 10 +- .../auth/presentation/AuthController.java | 53 ++-- .../service/AccessTokenRefreshService.java | 39 +-- .../service/UserSignUpOrUpdateService.java | 90 +++---- .../coin/controller/CoinController.java | 6 +- .../coin/controller/dto/RankingResponse.java | 3 +- .../coin/controller/dto/TradeRequest.java | 17 +- .../coin/controller/dto/TradeResponse.java | 16 +- .../domain/coin/domain/CoinAccount.java | 10 +- .../domain/repository/TradeRepository.java | 1 + .../exception/MoneyNotEnoughException.java | 2 +- .../domain/coin/service/PriceScheduler.java | 3 +- .../domain/contribute/domain/Contribute.java | 13 +- .../repository/ContributeRepository.java | 6 +- .../contribute/dto/ContributeResponseDto.java | 33 +-- .../contribute/service/ContributeService.java | 119 ++++----- .../bumawiki/domain/docs/domain/Docs.java | 39 ++- .../repository/CustomDocsRepository.java | 8 +- .../repository/CustomDocsRepositoryImpl.java | 2 +- .../domain/repository/DocsRepository.java | 33 +-- .../repository/DocsRepositoryMapper.java | 62 +++-- .../repository/VersionDocsRepository.java | 3 +- .../domain/docs/domain/type/DocsType.java | 38 +-- .../CannotChangeYourDocsException.java | 9 +- .../docs/exception/DocsNotFoundException.java | 8 +- .../DocsTitleAlreadyExistException.java | 9 +- .../exception/DocsTypeNotFoundException.java | 9 +- .../exception/NoUpdatableDocsException.java | 8 +- .../exception/VersionNotExistException.java | 8 +- .../DocsCheckYouLikeThisController.java | 16 +- .../DocsCreateUpdateController.java | 65 +++-- .../presentation/DocsDeleteController.java | 16 +- .../DocsInformationController.java | 2 +- .../DocsPopularInformationController.java | 20 +- .../presentation/dto/ClubResponseDto.java | 20 +- .../dto/MergeConflictDataResponse.java | 5 +- .../presentation/dto/TeacherResponseDto.java | 27 +- .../dto/VersionDocsSummaryDto.java | 27 +- .../dto/request/DocsCreateRequestDto.java | 24 +- .../request/DocsTitleUpdateRequestDto.java | 7 +- .../dto/request/DocsTypeUpdateDto.java | 10 +- .../dto/request/DocsUpdateRequestDto.java | 11 +- .../DocsNameAndEnrollResponseDto.java | 14 +- .../dto/response/DocsPopularResponseDto.java | 28 +- .../dto/response/DocsThumbsUpResponseDto.java | 10 +- .../response/VersionDocsDiffResponseDto.java | 30 ++- .../dto/response/VersionDocsResponseDto.java | 2 +- .../dto/response/VersionResponseDto.java | 6 +- .../service/DocsCheckYouLikeThisService.java | 22 +- .../docs/service/DocsCreateService.java | 31 +-- .../docs/service/DocsDeleteService.java | 16 +- .../docs/service/DocsInformationService.java | 249 +++++++++--------- .../DocsPopularInformationService.java | 20 +- .../docs/service/DocsUpdateService.java | 5 +- .../domain/image/ImageController.java | 57 ++-- .../image/exception/NoImageException.java | 10 +- .../presentation/FileStorageProperties.java | 9 +- .../domain/image/service/ImageService.java | 117 ++++---- .../domain/thumbsUp/domain/ThumbsUp.java | 47 ---- .../repository/CustomThumbsUpRepository.java | 10 - .../CustomThumbsUpRepositoryImpl.java | 31 --- .../exception/AlreadyThumbsUpexception.java | 13 - .../exception/NoDocsYouThumbsUpException.java | 13 - .../exception/YouDontThumbsUpThisDocs.java | 13 - .../ThumbsUpManipulateController.java | 29 -- .../presentation/dto/ThumbsUpRequestDto.java | 9 - .../presentation/dto/ThumbsUpResponseDto.java | 18 -- .../service/ThumbsUpManipulateService.java | 76 ------ .../domain/thumbsup/domain/ThumbsUp.java | 59 +++++ .../repository/CustomThumbsUpRepository.java | 10 + .../CustomThumbsUpRepositoryImpl.java | 33 +++ .../exception/AlreadyThumbsUpException.java | 13 + .../exception/NoDocsYouThumbsUpException.java | 14 + .../exception/YouDontThumbsUpThisDocs.java | 14 + .../ThumbsUpInformationController.java | 22 +- .../ThumbsUpManipulateController.java | 35 +++ .../presentation/dto/ThumbsUpRequestDto.java | 9 + .../presentation/dto/ThumbsUpResponseDto.java | 18 ++ .../service/ThumbsUpInformationService.java | 26 +- .../service/ThumbsUpManipulateService.java | 78 ++++++ .../bumawiki/domain/user/UserFacade.java | 28 +- .../bumawiki/domain/user/domain/User.java | 31 +-- .../user/domain/authority/Authority.java | 2 +- .../repository/UserRepositoryMapper.java | 22 +- .../user/exception/UserNotFoundException.java | 8 +- .../user/exception/UserNotLoginException.java | 8 +- .../presentation/UserAuthorityController.java | 22 +- .../user/presentation/UserInfoController.java | 40 +-- .../user/presentation/dto/SimpleUserDto.java | 8 +- .../presentation/dto/UserAuthorityDto.java | 12 +- .../presentation/dto/UserResponseDto.java | 57 ++-- .../user/service/UserAuthorityService.java | 19 +- .../domain/user/service/UserInfoService.java | 17 +- .../domain/user/service/UserLoginService.java | 50 ++-- .../user/service/UserLogoutService.java | 38 ++- .../domain/user/service/UserService.java | 17 +- .../ServiceWithTransactionalReadOnly.java | 8 +- .../config/p6spy/P6SpySqlFormatter.java | 55 ++-- .../config/querydsl/QueryDslConfig.java | 17 +- .../config/security/SecurityConfig.java | 81 +++--- .../config/security/auth/AuthDetails.java | 88 ++++--- .../security/auth/AuthDetailsService.java | 22 +- .../error/CustomAuthenticationEntryPoint.java | 31 ++- .../bumawiki/global/error/ErrorResponse.java | 28 +- .../global/error/ExceptionFilter.java | 61 +++-- .../global/error/GlobalExceptionHandler.java | 117 ++++---- .../error/exception/BumawikiException.java | 2 +- .../global/error/exception/ErrorCode.java | 91 +++---- .../bumawiki/global/jwt/auth/JwtAuth.java | 45 ++-- .../bumawiki/global/jwt/auth/JwtFilter.java | 41 +-- .../global/jwt/dto/TokenResponseDto.java | 25 +- .../jwt/exception/ExpiredJwtException.java | 8 +- .../jwt/exception/InvalidJwtException.java | 8 +- .../RefreshTokenExpiredException.java | 9 +- .../global/jwt/properties/JwtConstants.java | 16 +- .../global/jwt/properties/JwtProperties.java | 36 +-- .../bumawiki/global/jwt/util/JwtProvider.java | 97 +++---- .../bumawiki/global/jwt/util/JwtUtil.java | 87 +++--- .../global/oauth/BsmOauthProperties.java | 19 +- .../s3/controller/dto/ImageResponse.java | 2 - .../bumawiki/global/util/SecurityUtil.java | 42 +-- .../bumawiki/global/web/WebMvcMapping.java | 24 +- .../bumawiki/BumawikiApplicationTests.java | 2 - 127 files changed, 1871 insertions(+), 1763 deletions(-) delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/domain/ThumbsUp.java delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/domain/repository/CustomThumbsUpRepository.java delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/domain/repository/CustomThumbsUpRepositoryImpl.java delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/exception/AlreadyThumbsUpexception.java delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/exception/NoDocsYouThumbsUpException.java delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/exception/YouDontThumbsUpThisDocs.java delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/ThumbsUpManipulateController.java delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/dto/ThumbsUpRequestDto.java delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/dto/ThumbsUpResponseDto.java delete mode 100644 src/main/java/com/project/bumawiki/domain/thumbsUp/service/ThumbsUpManipulateService.java create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/domain/ThumbsUp.java create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/domain/repository/CustomThumbsUpRepository.java create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/domain/repository/CustomThumbsUpRepositoryImpl.java create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/exception/AlreadyThumbsUpException.java create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/exception/NoDocsYouThumbsUpException.java create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/exception/YouDontThumbsUpThisDocs.java rename src/main/java/com/project/bumawiki/domain/{thumbsUp => thumbsup}/presentation/ThumbsUpInformationController.java (50%) create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/presentation/ThumbsUpManipulateController.java create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/presentation/dto/ThumbsUpRequestDto.java create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/presentation/dto/ThumbsUpResponseDto.java rename src/main/java/com/project/bumawiki/domain/{thumbsUp => thumbsup}/service/ThumbsUpInformationService.java (50%) create mode 100644 src/main/java/com/project/bumawiki/domain/thumbsup/service/ThumbsUpManipulateService.java diff --git a/src/main/java/com/project/bumawiki/BumawikiApplication.java b/src/main/java/com/project/bumawiki/BumawikiApplication.java index 31ee894d..5af0f7a2 100644 --- a/src/main/java/com/project/bumawiki/BumawikiApplication.java +++ b/src/main/java/com/project/bumawiki/BumawikiApplication.java @@ -10,8 +10,8 @@ @EnableJpaRepositories public class BumawikiApplication { - public static void main(String[] args) { - SpringApplication.run(BumawikiApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(BumawikiApplication.class, args); + } -} \ No newline at end of file +} diff --git a/src/main/java/com/project/bumawiki/domain/auth/domain/AuthId.java b/src/main/java/com/project/bumawiki/domain/auth/domain/AuthId.java index 599faa73..d8384381 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/domain/AuthId.java +++ b/src/main/java/com/project/bumawiki/domain/auth/domain/AuthId.java @@ -1,11 +1,15 @@ package com.project.bumawiki.domain.auth.domain; -import lombok.*; import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.TimeToLive; import org.springframework.data.redis.core.index.Indexed; import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -14,12 +18,12 @@ @RedisHash public class AuthId { - @Id - String id; + @Id + String id; - @Indexed - String authId; + @Indexed + String authId; - @TimeToLive - private long ttl; + @TimeToLive + private long ttl; } diff --git a/src/main/java/com/project/bumawiki/domain/auth/domain/RefreshToken.java b/src/main/java/com/project/bumawiki/domain/auth/domain/RefreshToken.java index ca1edc88..8208fbdc 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/domain/RefreshToken.java +++ b/src/main/java/com/project/bumawiki/domain/auth/domain/RefreshToken.java @@ -1,12 +1,17 @@ package com.project.bumawiki.domain.auth.domain; -import lombok.*; +import java.time.ZonedDateTime; + import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.TimeToLive; import org.springframework.data.redis.core.index.Indexed; import jakarta.persistence.Id; -import java.time.ZonedDateTime; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -14,21 +19,21 @@ @Builder @RedisHash public class RefreshToken { - @Id - private String id; - @Indexed - private String refreshToken; + @Id + private String id; + @Indexed + private String refreshToken; - private String role; + private String role; - @TimeToLive - private long ttl; + @TimeToLive + private long ttl; - private ZonedDateTime expiredAt; + private ZonedDateTime expiredAt; - public RefreshToken update(final String refreshToken, final long ttl) { - this.refreshToken = refreshToken; - this.ttl = ttl; - return this; - } + public RefreshToken update(final String refreshToken, final long ttl) { + this.refreshToken = refreshToken; + this.ttl = ttl; + return this; + } } diff --git a/src/main/java/com/project/bumawiki/domain/auth/domain/repository/AuthIdRepository.java b/src/main/java/com/project/bumawiki/domain/auth/domain/repository/AuthIdRepository.java index 33167177..b00b1cfe 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/domain/repository/AuthIdRepository.java +++ b/src/main/java/com/project/bumawiki/domain/auth/domain/repository/AuthIdRepository.java @@ -1,11 +1,12 @@ package com.project.bumawiki.domain.auth.domain.repository; -import com.project.bumawiki.domain.auth.domain.AuthId; +import java.util.Optional; + import org.springframework.data.repository.CrudRepository; -import java.util.Optional; +import com.project.bumawiki.domain.auth.domain.AuthId; public interface AuthIdRepository extends CrudRepository { - Optional findByAuthId(String authId); + Optional findByAuthId(String authId); -} \ No newline at end of file +} diff --git a/src/main/java/com/project/bumawiki/domain/auth/domain/repository/RefreshTokenRepository.java b/src/main/java/com/project/bumawiki/domain/auth/domain/repository/RefreshTokenRepository.java index 3b3f0b18..249ac170 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/domain/repository/RefreshTokenRepository.java +++ b/src/main/java/com/project/bumawiki/domain/auth/domain/repository/RefreshTokenRepository.java @@ -1,11 +1,13 @@ package com.project.bumawiki.domain.auth.domain.repository; -import com.project.bumawiki.domain.auth.domain.RefreshToken; +import java.util.Optional; + import org.springframework.data.repository.CrudRepository; -import java.util.Optional; +import com.project.bumawiki.domain.auth.domain.RefreshToken; public interface RefreshTokenRepository extends CrudRepository { - Optional findById(String authId); - Optional findByRefreshToken(String refreshToken); + Optional findById(String authId); + + Optional findByRefreshToken(String refreshToken); } diff --git a/src/main/java/com/project/bumawiki/domain/auth/presentation/AuthController.java b/src/main/java/com/project/bumawiki/domain/auth/presentation/AuthController.java index 7cbc1bed..dd14d771 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/presentation/AuthController.java +++ b/src/main/java/com/project/bumawiki/domain/auth/presentation/AuthController.java @@ -1,37 +1,44 @@ package com.project.bumawiki.domain.auth.presentation; +import java.io.IOException; + +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import com.project.bumawiki.domain.auth.service.AccessTokenRefreshService; import com.project.bumawiki.domain.user.service.UserLoginService; import com.project.bumawiki.domain.user.service.UserLogoutService; import com.project.bumawiki.global.jwt.dto.TokenResponseDto; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import java.io.IOException; +import lombok.RequiredArgsConstructor; @Validated @RequiredArgsConstructor @RestController @RequestMapping("/api/auth") public class AuthController { - private final UserLoginService userLoginService; - private final UserLogoutService userLogoutService; - private final AccessTokenRefreshService accessTokenRefreshService; - - @PostMapping("/oauth/bsm") - public TokenResponseDto userSignup(@RequestHeader("authCode") String authCode) throws IOException { - return ResponseEntity.ok(userLoginService.execute(authCode)).getBody(); - } - - @DeleteMapping("/bsm/logout") - public ResponseEntity userLogout(@RequestHeader("refreshToken") String refreshToken) { - return ResponseEntity.ok(userLogoutService.execute(refreshToken)); - } - - @PutMapping("/refresh/access") - public TokenResponseDto refreshAccessToken(@RequestHeader("refreshToken") String refreshToken) { - return ResponseEntity.ok(accessTokenRefreshService.execute(refreshToken)).getBody(); - } + private final UserLoginService userLoginService; + private final UserLogoutService userLogoutService; + private final AccessTokenRefreshService accessTokenRefreshService; + + @PostMapping("/oauth/bsm") + public TokenResponseDto userSignup(@RequestHeader("authCode") String authCode) throws IOException { + return ResponseEntity.ok(userLoginService.execute(authCode)).getBody(); + } + + @DeleteMapping("/bsm/logout") + public ResponseEntity userLogout(@RequestHeader("refreshToken") String refreshToken) { + return ResponseEntity.ok(userLogoutService.execute(refreshToken)); + } + + @PutMapping("/refresh/access") + public TokenResponseDto refreshAccessToken(@RequestHeader("refreshToken") String refreshToken) { + return ResponseEntity.ok(accessTokenRefreshService.execute(refreshToken)).getBody(); + } } diff --git a/src/main/java/com/project/bumawiki/domain/auth/service/AccessTokenRefreshService.java b/src/main/java/com/project/bumawiki/domain/auth/service/AccessTokenRefreshService.java index 8cdf53f6..5cfeb8f0 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/service/AccessTokenRefreshService.java +++ b/src/main/java/com/project/bumawiki/domain/auth/service/AccessTokenRefreshService.java @@ -1,33 +1,38 @@ package com.project.bumawiki.domain.auth.service; +import org.springframework.stereotype.Service; + import com.project.bumawiki.domain.auth.domain.RefreshToken; import com.project.bumawiki.domain.auth.domain.repository.RefreshTokenRepository; import com.project.bumawiki.global.jwt.dto.TokenResponseDto; import com.project.bumawiki.global.jwt.exception.RefreshTokenExpiredException; import com.project.bumawiki.global.jwt.util.JwtProvider; + import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; +@SuppressWarnings("checkstyle:RegexpSinglelineJava") @RequiredArgsConstructor @Service public class AccessTokenRefreshService { - private final RefreshTokenRepository refreshTokenRepository; - private final JwtProvider jwtProvider; + private final RefreshTokenRepository refreshTokenRepository; + private final JwtProvider jwtProvider; - public TokenResponseDto execute(final String bearerRefreshToken) { - if(bearerRefreshToken == null) throw RefreshTokenExpiredException.EXCEPTION; - RefreshToken redisRefreshToken = refreshTokenRepository.findByRefreshToken(bearerRefreshToken) - .orElseThrow(() -> RefreshTokenExpiredException.EXCEPTION); - return getNewAccessTokens(redisRefreshToken); - } + public TokenResponseDto execute(final String bearerRefreshToken) { + if (bearerRefreshToken == null) { + throw RefreshTokenExpiredException.EXCEPTION; + } + RefreshToken redisRefreshToken = refreshTokenRepository.findByRefreshToken(bearerRefreshToken) + .orElseThrow(() -> RefreshTokenExpiredException.EXCEPTION); + return getNewAccessTokens(redisRefreshToken); + } - private TokenResponseDto getNewAccessTokens(final RefreshToken redisRefreshToken) { - String newAccessToken = jwtProvider.generateAccessToken(redisRefreshToken.getId(), redisRefreshToken.getRole()); + private TokenResponseDto getNewAccessTokens(final RefreshToken redisRefreshToken) { + String newAccessToken = jwtProvider.generateAccessToken(redisRefreshToken.getId(), redisRefreshToken.getRole()); - return TokenResponseDto.builder() - .accessToken(newAccessToken) - .refreshToken(redisRefreshToken.getRefreshToken()) - .expiredAt(redisRefreshToken.getExpiredAt()) - .build(); - } + return TokenResponseDto.builder() + .accessToken(newAccessToken) + .refreshToken(redisRefreshToken.getRefreshToken()) + .expiredAt(redisRefreshToken.getExpiredAt()) + .build(); + } } diff --git a/src/main/java/com/project/bumawiki/domain/auth/service/UserSignUpOrUpdateService.java b/src/main/java/com/project/bumawiki/domain/auth/service/UserSignUpOrUpdateService.java index 09587ac9..f5236dc3 100644 --- a/src/main/java/com/project/bumawiki/domain/auth/service/UserSignUpOrUpdateService.java +++ b/src/main/java/com/project/bumawiki/domain/auth/service/UserSignUpOrUpdateService.java @@ -1,62 +1,64 @@ package com.project.bumawiki.domain.auth.service; +import java.io.IOException; +import java.util.Optional; + +import org.springframework.transaction.annotation.Transactional; + import com.project.bumawiki.domain.user.domain.User; import com.project.bumawiki.domain.user.domain.authority.Authority; import com.project.bumawiki.domain.user.domain.repository.UserRepository; import com.project.bumawiki.domain.user.exception.UserNotLoginException; import com.project.bumawiki.global.annotation.ServiceWithTransactionalReadOnly; + import leehj050211.bsmOauth.BsmOauth; import leehj050211.bsmOauth.dto.response.BsmResourceResponse; import leehj050211.bsmOauth.exceptions.BsmAuthCodeNotFoundException; import leehj050211.bsmOauth.exceptions.BsmAuthInvalidClientException; import leehj050211.bsmOauth.exceptions.BsmAuthTokenNotFoundException; import lombok.RequiredArgsConstructor; -import org.springframework.transaction.annotation.Transactional; - -import java.io.IOException; -import java.util.Optional; @RequiredArgsConstructor @ServiceWithTransactionalReadOnly public class UserSignUpOrUpdateService { - private final BsmOauth bsmOauth; - private final UserRepository userRepository; - - @Transactional - public User execute(String authId) throws IOException { - String token; - BsmResourceResponse resource; - try { - token = bsmOauth.getToken(authId); - resource = bsmOauth.getResource(token); - }catch(BsmAuthCodeNotFoundException | BsmAuthTokenNotFoundException e){ - throw UserNotLoginException.EXCEPTION; - }catch(BsmAuthInvalidClientException e){ - throw UserNotLoginException.EXCEPTION; - } - return updateOrSignUp(resource); - } - - @Transactional - protected User updateOrSignUp(BsmResourceResponse resource) { - Optional user = userRepository.findByEmail(resource.getEmail()); - if(user.isEmpty()){ - return saveUser(resource); - } - User updateUser = user.get(); - return updateUser.update(resource); - } - - @Transactional - protected User saveUser(final BsmResourceResponse resource) { - return userRepository.save( - User.builder() - .email(resource.getEmail()) - .nickName(resource.getNickname()) - .authority(Authority.USER) - .enroll(resource.getStudent().getEnrolledAt()) - .name(resource.getStudent().getName()) - .build() - ); - } + private final BsmOauth bsmOauth; + private final UserRepository userRepository; + + @Transactional + public User execute(String authId) throws IOException { + String token; + BsmResourceResponse resource; + try { + token = bsmOauth.getToken(authId); + resource = bsmOauth.getResource(token); + } catch (BsmAuthCodeNotFoundException | BsmAuthTokenNotFoundException e) { + throw UserNotLoginException.EXCEPTION; + } catch (BsmAuthInvalidClientException e) { + throw UserNotLoginException.EXCEPTION; + } + return updateOrSignUp(resource); + } + + @Transactional + protected User updateOrSignUp(BsmResourceResponse resource) { + Optional user = userRepository.findByEmail(resource.getEmail()); + if (user.isEmpty()) { + return saveUser(resource); + } + User updateUser = user.get(); + return updateUser.update(resource); + } + + @Transactional + protected User saveUser(final BsmResourceResponse resource) { + return userRepository.save( + User.builder() + .email(resource.getEmail()) + .nickName(resource.getNickname()) + .authority(Authority.USER) + .enroll(resource.getStudent().getEnrolledAt()) + .name(resource.getStudent().getName()) + .build() + ); + } } diff --git a/src/main/java/com/project/bumawiki/domain/coin/controller/CoinController.java b/src/main/java/com/project/bumawiki/domain/coin/controller/CoinController.java index cb7379df..6768cd6b 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/controller/CoinController.java +++ b/src/main/java/com/project/bumawiki/domain/coin/controller/CoinController.java @@ -1,6 +1,5 @@ package com.project.bumawiki.domain.coin.controller; -import jakarta.validation.Valid; import java.util.List; import org.springframework.data.domain.Pageable; @@ -24,6 +23,7 @@ import com.project.bumawiki.domain.coin.service.CoinService; import com.project.bumawiki.global.util.SecurityUtil; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @RestController @@ -35,7 +35,7 @@ public class CoinController { @PostMapping public CoinAccountResponse createCoinAccount() { return CoinAccountResponse.from( - coinService.createCoinAccount(SecurityUtil.getCurrentUserWithLogin()) + coinService.createCoinAccount(SecurityUtil.getCurrentUserWithLogin()) ); } @@ -54,7 +54,7 @@ public TradeResponse buyCoin(@Valid @RequestBody TradeRequest tradeRequest) { } @PostMapping("/sell") - public TradeResponse sellCoin(@Valid @RequestBody TradeRequest tradeRequest) { + public TradeResponse sellCoin(@Valid @RequestBody TradeRequest tradeRequest) { return TradeResponse.from( coinService.sellCoin(tradeRequest.toEntity(), SecurityUtil.getCurrentUserWithLogin()) ); diff --git a/src/main/java/com/project/bumawiki/domain/coin/controller/dto/RankingResponse.java b/src/main/java/com/project/bumawiki/domain/coin/controller/dto/RankingResponse.java index 2263bbfd..3c1a107c 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/controller/dto/RankingResponse.java +++ b/src/main/java/com/project/bumawiki/domain/coin/controller/dto/RankingResponse.java @@ -12,6 +12,7 @@ public record RankingResponse( String username ) { public RankingResponse(CoinAccount coinAccount, Long nowPrice, User user) { - this(coinAccount.getId(), coinAccount.getCoin(), coinAccount.getMoney(), (coinAccount.getMoney() + coinAccount.getCoin() * nowPrice), user.getId(), user.getName()); + this(coinAccount.getId(), coinAccount.getCoin(), coinAccount.getMoney(), + (coinAccount.getMoney() + coinAccount.getCoin() * nowPrice), user.getId(), user.getName()); } } diff --git a/src/main/java/com/project/bumawiki/domain/coin/controller/dto/TradeRequest.java b/src/main/java/com/project/bumawiki/domain/coin/controller/dto/TradeRequest.java index cee5ed14..ba922ab5 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/controller/dto/TradeRequest.java +++ b/src/main/java/com/project/bumawiki/domain/coin/controller/dto/TradeRequest.java @@ -1,16 +1,17 @@ package com.project.bumawiki.domain.coin.controller.dto; import com.project.bumawiki.domain.coin.domain.TradeWithoutTradeStatusAndCoinAccountId; + import jakarta.validation.constraints.Positive; public record TradeRequest( - @Positive Long coinPrice, - @Positive Long coinCount + @Positive Long coinPrice, + @Positive Long coinCount ) { - public TradeWithoutTradeStatusAndCoinAccountId toEntity() { - return new TradeWithoutTradeStatusAndCoinAccountId( - coinPrice, - coinCount - ); - } + public TradeWithoutTradeStatusAndCoinAccountId toEntity() { + return new TradeWithoutTradeStatusAndCoinAccountId( + coinPrice, + coinCount + ); + } } diff --git a/src/main/java/com/project/bumawiki/domain/coin/controller/dto/TradeResponse.java b/src/main/java/com/project/bumawiki/domain/coin/controller/dto/TradeResponse.java index 3b829eba..ec61e31b 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/controller/dto/TradeResponse.java +++ b/src/main/java/com/project/bumawiki/domain/coin/controller/dto/TradeResponse.java @@ -2,19 +2,17 @@ import java.time.LocalDateTime; -import jakarta.persistence.*; - import com.project.bumawiki.domain.coin.domain.Trade; import com.project.bumawiki.domain.coin.domain.type.TradeStatus; public record TradeResponse( - Long id, - Long coinPrice, - Long coinCount, - Long usedMoney, - TradeStatus tradeStatus, - Long coinAccountId, - LocalDateTime tradedTime + Long id, + Long coinPrice, + Long coinCount, + Long usedMoney, + TradeStatus tradeStatus, + Long coinAccountId, + LocalDateTime tradedTime ) { public static TradeResponse from(Trade trade) { return new TradeResponse( diff --git a/src/main/java/com/project/bumawiki/domain/coin/domain/CoinAccount.java b/src/main/java/com/project/bumawiki/domain/coin/domain/CoinAccount.java index afb79708..5ac1f783 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/domain/CoinAccount.java +++ b/src/main/java/com/project/bumawiki/domain/coin/domain/CoinAccount.java @@ -58,13 +58,9 @@ public void addMoney(Long money) { public boolean wasRewardedToday() { LocalDateTime today = LocalDateTime.now(); - if (this.lastRewardedTime.getYear() == today.getYear() && - this.lastRewardedTime.getMonth() == today.getMonth() && - this.lastRewardedTime.getDayOfMonth() == today.getDayOfMonth()) { - return true; - } - - return false; + return this.lastRewardedTime.getYear() == today.getYear() + && this.lastRewardedTime.getMonth() == today.getMonth() + && this.lastRewardedTime.getDayOfMonth() == today.getDayOfMonth(); } public void updateLastRewardedTimeNow() { diff --git a/src/main/java/com/project/bumawiki/domain/coin/domain/repository/TradeRepository.java b/src/main/java/com/project/bumawiki/domain/coin/domain/repository/TradeRepository.java index 5709eecd..357488a3 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/domain/repository/TradeRepository.java +++ b/src/main/java/com/project/bumawiki/domain/coin/domain/repository/TradeRepository.java @@ -9,5 +9,6 @@ public interface TradeRepository extends JpaRepository { List findAllByCoinAccountIdOrderByTradedTimeDesc(Long coinAccountId); + List findAllByTradeStatus(TradeStatus tradeStatus); } diff --git a/src/main/java/com/project/bumawiki/domain/coin/exception/MoneyNotEnoughException.java b/src/main/java/com/project/bumawiki/domain/coin/exception/MoneyNotEnoughException.java index 728dc8a2..c336df70 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/exception/MoneyNotEnoughException.java +++ b/src/main/java/com/project/bumawiki/domain/coin/exception/MoneyNotEnoughException.java @@ -4,7 +4,7 @@ import com.project.bumawiki.global.error.exception.ErrorCode; public class MoneyNotEnoughException extends BumawikiException { - public MoneyNotEnoughException() { + public MoneyNotEnoughException() { super(ErrorCode.MONEY_NOT_ENOUGH); } } diff --git a/src/main/java/com/project/bumawiki/domain/coin/service/PriceScheduler.java b/src/main/java/com/project/bumawiki/domain/coin/service/PriceScheduler.java index c25d6965..1cbe36ad 100644 --- a/src/main/java/com/project/bumawiki/domain/coin/service/PriceScheduler.java +++ b/src/main/java/com/project/bumawiki/domain/coin/service/PriceScheduler.java @@ -24,11 +24,10 @@ public class PriceScheduler { private final PriceRepository priceRepository; private final TradeRepository tradeRepository; private final CoinAccountRepository coinAccountRepository; + private static final Long CHANGE_MONEY_RANGE = 200000L; @Scheduled(fixedRate = 180000) void changePrice() { - Long CHANGE_MONEY_RANGE = 200000L; - Price recentPrice = priceRepository.getRecentPrice(); Long max = recentPrice.getPrice() + CHANGE_MONEY_RANGE; Long min = Math.max(recentPrice.getPrice() - CHANGE_MONEY_RANGE, 0L); diff --git a/src/main/java/com/project/bumawiki/domain/contribute/domain/Contribute.java b/src/main/java/com/project/bumawiki/domain/contribute/domain/Contribute.java index 62f52f85..d40031f8 100644 --- a/src/main/java/com/project/bumawiki/domain/contribute/domain/Contribute.java +++ b/src/main/java/com/project/bumawiki/domain/contribute/domain/Contribute.java @@ -2,6 +2,12 @@ import java.time.LocalDateTime; +import org.springframework.data.annotation.CreatedDate; + +import com.project.bumawiki.domain.docs.domain.Docs; +import com.project.bumawiki.domain.docs.domain.VersionDocs; +import com.project.bumawiki.domain.user.domain.User; + import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -11,13 +17,6 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToOne; - -import org.springframework.data.annotation.CreatedDate; - -import com.project.bumawiki.domain.docs.domain.Docs; -import com.project.bumawiki.domain.docs.domain.VersionDocs; -import com.project.bumawiki.domain.user.domain.User; - import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/project/bumawiki/domain/contribute/domain/repository/ContributeRepository.java b/src/main/java/com/project/bumawiki/domain/contribute/domain/repository/ContributeRepository.java index fe454b9d..bdff9a17 100644 --- a/src/main/java/com/project/bumawiki/domain/contribute/domain/repository/ContributeRepository.java +++ b/src/main/java/com/project/bumawiki/domain/contribute/domain/repository/ContributeRepository.java @@ -2,13 +2,13 @@ import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + import com.project.bumawiki.domain.contribute.domain.Contribute; import com.project.bumawiki.domain.docs.domain.Docs; import com.project.bumawiki.domain.user.domain.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - public interface ContributeRepository extends JpaRepository { @Query("select distinct c.contributor from Contribute c where c.docs = :docs") List findUserAllByDocs(Docs docs); diff --git a/src/main/java/com/project/bumawiki/domain/contribute/dto/ContributeResponseDto.java b/src/main/java/com/project/bumawiki/domain/contribute/dto/ContributeResponseDto.java index 6c9fd99d..e2d08e22 100644 --- a/src/main/java/com/project/bumawiki/domain/contribute/dto/ContributeResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/contribute/dto/ContributeResponseDto.java @@ -1,26 +1,27 @@ package com.project.bumawiki.domain.contribute.dto; +import java.time.LocalDateTime; + import com.project.bumawiki.domain.contribute.domain.Contribute; -import lombok.Getter; -import java.time.LocalDateTime; +import lombok.Getter; @Getter public class ContributeResponseDto { - private final Long userId; - private final String userNickName; - private final Long docsId; - private final LocalDateTime createTime; - private final String title; - private final Long versionDocsId; + private final Long userId; + private final String userNickName; + private final Long docsId; + private final LocalDateTime createTime; + private final String title; + private final Long versionDocsId; - public ContributeResponseDto(Contribute contribute){ - this.userId = contribute.getContributor().getId(); - this.userNickName = contribute.getContributor().getNickName(); - this.docsId = contribute.getDocs().getId(); - this.createTime = contribute.getCreatedAt(); - this.title = contribute.getDocs().getTitle(); - this.versionDocsId = contribute.getVersionDocs().getId(); - } + public ContributeResponseDto(Contribute contribute) { + this.userId = contribute.getContributor().getId(); + this.userNickName = contribute.getContributor().getNickName(); + this.docsId = contribute.getDocs().getId(); + this.createTime = contribute.getCreatedAt(); + this.title = contribute.getDocs().getTitle(); + this.versionDocsId = contribute.getVersionDocs().getId(); + } } diff --git a/src/main/java/com/project/bumawiki/domain/contribute/service/ContributeService.java b/src/main/java/com/project/bumawiki/domain/contribute/service/ContributeService.java index f9522bde..a3379388 100644 --- a/src/main/java/com/project/bumawiki/domain/contribute/service/ContributeService.java +++ b/src/main/java/com/project/bumawiki/domain/contribute/service/ContributeService.java @@ -1,5 +1,11 @@ package com.project.bumawiki.domain.contribute.service; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import org.springframework.transaction.annotation.Transactional; + import com.project.bumawiki.domain.contribute.domain.Contribute; import com.project.bumawiki.domain.contribute.domain.repository.ContributeRepository; import com.project.bumawiki.domain.docs.domain.Docs; @@ -11,88 +17,83 @@ import com.project.bumawiki.domain.user.exception.UserNotFoundException; import com.project.bumawiki.global.annotation.ServiceWithTransactionalReadOnly; import com.project.bumawiki.global.util.SecurityUtil; + import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; @ServiceWithTransactionalReadOnly @RequiredArgsConstructor public class ContributeService { - private final DocsRepository docsRepository; - private final UserRepository userRepository; - private final ContributeRepository contributeRepository; - - @Transactional - public Contribute setContribute(VersionDocs versionDocs) { + private final DocsRepository docsRepository; + private final UserRepository userRepository; + private final ContributeRepository contributeRepository; - User user = findUser(); + @Transactional + public Contribute setContribute(VersionDocs versionDocs) { - Docs docs = docsRepository.findById(versionDocs.getDocsId()) - .orElseThrow(() -> DocsNotFoundException.EXCEPTION); + User user = findUser(); - return setContributeAtUserAndDocs(versionDocs, user, docs); - } + Docs docs = docsRepository.findById(versionDocs.getDocsId()) + .orElseThrow(() -> DocsNotFoundException.EXCEPTION); - @NotNull - private Contribute setContributeAtUserAndDocs(VersionDocs versionDocs, User user, Docs docs) { - Contribute contribute = createContribute(docs, user, versionDocs); + return setContributeAtUserAndDocs(versionDocs, user, docs); + } - ArrayList contributes = new ArrayList<>(); - contributes.add(contribute); + @NotNull + private Contribute setContributeAtUserAndDocs(VersionDocs versionDocs, User user, Docs docs) { + Contribute contribute = createContribute(docs, user, versionDocs); - setFirstContribute(contributes, user); - docs.updateContributor(contributes); - return contribute; - } + ArrayList contributes = new ArrayList<>(); + contributes.add(contribute); - @Transactional - public Contribute updateContribute(final VersionDocs versionDocs){ + setFirstContribute(contributes, user); + docs.updateContributor(contributes); + return contribute; + } - User user = findUser(); + @Transactional + public Contribute updateContribute(final VersionDocs versionDocs) { - Docs docs = docsRepository.findById(versionDocs.getDocsId()) - .orElseThrow(() -> DocsNotFoundException.EXCEPTION); + User user = findUser(); - Contribute contribute = createContribute(docs, user, versionDocs); + Docs docs = docsRepository.findById(versionDocs.getDocsId()) + .orElseThrow(() -> DocsNotFoundException.EXCEPTION); - if(user.getContributeDocs() == null){ - ArrayList contributes = new ArrayList<>(); - contributes.add(contribute); + Contribute contribute = createContribute(docs, user, versionDocs); - setFirstContribute(contributes, user); - } - docs.getContributor().add(contribute); + if (user.getContributeDocs() == null) { + ArrayList contributes = new ArrayList<>(); + contributes.add(contribute); - return contribute; - } + setFirstContribute(contributes, user); + } + docs.getContributor().add(contribute); - @Transactional - public void setFirstContribute(final List contributes, final User user){ - user.updateContributeDocs(contributes); - } + return contribute; + } - @Transactional - private Contribute createContribute(Docs docs, User user, VersionDocs versionDocs){ - return contributeRepository.save( - Contribute.builder() - .docs(docs) - .contributor(user) - .versionDocs(versionDocs) - .createdAt(LocalDateTime.now()) - .build() - ); - } + @Transactional + public void setFirstContribute(final List contributes, final User user) { + user.updateContributeDocs(contributes); + } + @Transactional + private Contribute createContribute(Docs docs, User user, VersionDocs versionDocs) { + return contributeRepository.save( + Contribute.builder() + .docs(docs) + .contributor(user) + .versionDocs(versionDocs) + .createdAt(LocalDateTime.now()) + .build() + ); + } - private User findUser(){ - User user = SecurityUtil.getCurrentUserWithLogin(); + private User findUser() { + User user = SecurityUtil.getCurrentUserWithLogin(); - return userRepository.findById(user.getId()) - .orElseThrow(() -> UserNotFoundException.EXCEPTION); - } + return userRepository.findById(user.getId()) + .orElseThrow(() -> UserNotFoundException.EXCEPTION); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/Docs.java b/src/main/java/com/project/bumawiki/domain/docs/domain/Docs.java index 18fc0616..1a4857f5 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/Docs.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/Docs.java @@ -10,10 +10,10 @@ import com.project.bumawiki.domain.contribute.domain.Contribute; import com.project.bumawiki.domain.docs.domain.type.DocsType; import com.project.bumawiki.domain.docs.domain.type.Status; -import com.project.bumawiki.domain.thumbsUp.domain.ThumbsUp; -import com.project.bumawiki.domain.thumbsUp.exception.AlreadyThumbsUpexception; -import com.project.bumawiki.domain.thumbsUp.exception.YouDontThumbsUpThisDocs; -import com.project.bumawiki.domain.thumbsUp.presentation.dto.ThumbsUpResponseDto; +import com.project.bumawiki.domain.thumbsup.domain.ThumbsUp; +import com.project.bumawiki.domain.thumbsup.exception.AlreadyThumbsUpException; +import com.project.bumawiki.domain.thumbsup.exception.YouDontThumbsUpThisDocs; +import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpResponseDto; import com.project.bumawiki.domain.user.domain.User; import jakarta.persistence.CascadeType; @@ -39,38 +39,34 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Docs { + @OneToMany( + mappedBy = "docs", + fetch = FetchType.LAZY, + cascade = CascadeType.ALL, + orphanRemoval = true) + @Builder.Default + private final List thumbsUps = new ArrayList<>(); @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "docs_id") private Long id; - @Column(length = 32, unique = true) private String title; - @Column(length = 8) private int enroll; - @Enumerated(EnumType.STRING) private DocsType docsType; - @LastModifiedDate private LocalDateTime lastModifiedAt; - @Builder.Default @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) private List docsVersion = new ArrayList<>(); - @Builder.Default @OneToMany(mappedBy = "docs", cascade = CascadeType.ALL) private List contributor = new ArrayList<>(); - - @OneToMany( - mappedBy = "docs", - fetch = FetchType.LAZY, - cascade = CascadeType.ALL, - orphanRemoval = true) - @Builder.Default - private final List thumbsUps = new ArrayList<>(); + private int lastVersion; + @Enumerated(EnumType.STRING) + private Status status; public void cancelThumbsUp(ThumbsUp thumbsUp) { boolean removed = thumbsUps @@ -93,7 +89,7 @@ public void addThumbsUp(ThumbsUp thumbsUp) { .anyMatch(iterThumbsUp -> iterThumbsUp.equals(thumbsUp)); if (anyMatch) { - throw AlreadyThumbsUpexception.EXCEPTION; + throw AlreadyThumbsUpException.EXCEPTION; } this.thumbsUps.add(thumbsUp); } @@ -105,11 +101,6 @@ public List getList() { .collect(Collectors.toList()); } - private int lastVersion; - - @Enumerated(EnumType.STRING) - private Status status; - public void updateDocsType(DocsType docsType) { this.docsType = docsType; } diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/CustomDocsRepository.java b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/CustomDocsRepository.java index 2b649248..ad2137aa 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/CustomDocsRepository.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/CustomDocsRepository.java @@ -1,14 +1,14 @@ package com.project.bumawiki.domain.docs.domain.repository; +import java.util.List; + import com.project.bumawiki.domain.docs.domain.Docs; import com.project.bumawiki.domain.docs.presentation.dto.response.DocsPopularResponseDto; import com.project.bumawiki.domain.docs.presentation.dto.response.VersionResponseDto; -import java.util.List; - public interface CustomDocsRepository { - VersionResponseDto getDocsVersion(Docs docs); + VersionResponseDto getDocsVersion(Docs docs); - List findByThumbsUpsDesc(); + List findByThumbsUpsDesc(); } diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/CustomDocsRepositoryImpl.java b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/CustomDocsRepositoryImpl.java index afd562e5..1d4ac345 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/CustomDocsRepositoryImpl.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/CustomDocsRepositoryImpl.java @@ -3,7 +3,7 @@ import static com.project.bumawiki.domain.contribute.domain.QContribute.*; import static com.project.bumawiki.domain.docs.domain.QDocs.*; import static com.project.bumawiki.domain.docs.domain.QVersionDocs.*; -import static com.project.bumawiki.domain.thumbsUp.domain.QThumbsUp.*; +import static com.project.bumawiki.domain.thumbsup.domain.QThumbsUp.*; import static com.project.bumawiki.domain.user.domain.QUser.*; import static com.querydsl.core.types.Projections.*; diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepository.java b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepository.java index f69c93f0..06a4bc5e 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepository.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepository.java @@ -1,33 +1,34 @@ package com.project.bumawiki.domain.docs.domain.repository; -import com.project.bumawiki.domain.docs.domain.Docs; -import com.project.bumawiki.domain.docs.domain.type.DocsType; +import java.util.List; +import java.util.Optional; + import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.util.List; -import java.util.Optional; +import com.project.bumawiki.domain.docs.domain.Docs; +import com.project.bumawiki.domain.docs.domain.type.DocsType; public interface DocsRepository extends JpaRepository, CustomDocsRepository { - @Query("select d from Docs d where d.docsType = :docsType order by d.enroll") - List findByDocsType(@Param("docsType") DocsType docsType); + @Query("select d from Docs d where d.docsType = :docsType order by d.enroll") + List findByDocsType(@Param("docsType") DocsType docsType); - @Query("select d from Docs d where d.title like CONCAT('%',:title,'%') order by d.lastModifiedAt desc") - List findAllByTitle(@Param("title") String title); + @Query("select d from Docs d where d.title like CONCAT('%',:title,'%') order by d.lastModifiedAt desc") + List findAllByTitle(@Param("title") String title); - @Query("select d from Docs d where d.title like :title") - Optional findByTitle(@Param("title") String title); + @Query("select d from Docs d where d.title like :title") + Optional findByTitle(@Param("title") String title); - @Query("select d from Docs d order by d.lastModifiedAt desc") - Page findByLastModifiedAt(Pageable pageable); + @Query("select d from Docs d order by d.lastModifiedAt desc") + Page findByLastModifiedAt(Pageable pageable); - @Query("select d from Docs d order by d.lastModifiedAt asc") - Page findByLastModifiedAtAsc(Pageable pageable); + @Query("select d from Docs d order by d.lastModifiedAt asc") + Page findByLastModifiedAtAsc(Pageable pageable); - @Query("select d from Docs d order by d.lastModifiedAt desc") - List findByLastModifiedAtAll(); + @Query("select d from Docs d order by d.lastModifiedAt desc") + List findByLastModifiedAtAll(); } diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepositoryMapper.java b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepositoryMapper.java index cbbfa0b9..979916f6 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepositoryMapper.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepositoryMapper.java @@ -1,42 +1,46 @@ package com.project.bumawiki.domain.docs.domain.repository; +import java.time.LocalDateTime; +import java.util.Optional; + +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + import com.project.bumawiki.domain.docs.domain.Docs; import com.project.bumawiki.domain.docs.exception.DocsTitleAlreadyExistException; import com.project.bumawiki.domain.docs.presentation.dto.request.DocsCreateRequestDto; import com.project.bumawiki.global.error.exception.BumawikiException; import com.project.bumawiki.global.error.exception.ErrorCode; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; -import java.util.Optional; +import lombok.RequiredArgsConstructor; @Repository @RequiredArgsConstructor public class DocsRepositoryMapper { - private final DocsRepository docsRepository; - - public Docs findById(Long id, ErrorCode errorCode) { - return docsRepository - .findById(id) - .orElseThrow(() -> new BumawikiException(errorCode)); - } - - public void checkTitleAlreadyExist(String title) { - Optional byTitle = docsRepository.findByTitle(title); - if (byTitle.isPresent()) throw DocsTitleAlreadyExistException.EXCEPTION; - } - - @Transactional - public Docs createDocs(final DocsCreateRequestDto docsCreateRequestDto) { - return docsRepository.save( - Docs.builder() - .title(docsCreateRequestDto.getTitle()) - .enroll(docsCreateRequestDto.getEnroll()) - .docsType(docsCreateRequestDto.getDocsType()) - .lastModifiedAt(LocalDateTime.now()) - .build() - ); - } + private final DocsRepository docsRepository; + + public Docs findById(Long id, ErrorCode errorCode) { + return docsRepository + .findById(id) + .orElseThrow(() -> new BumawikiException(errorCode)); + } + + public void checkTitleAlreadyExist(String title) { + Optional byTitle = docsRepository.findByTitle(title); + if (byTitle.isPresent()) { + throw DocsTitleAlreadyExistException.EXCEPTION; + } + } + + @Transactional + public Docs createDocs(final DocsCreateRequestDto docsCreateRequestDto) { + return docsRepository.save( + Docs.builder() + .title(docsCreateRequestDto.getTitle()) + .enroll(docsCreateRequestDto.getEnroll()) + .docsType(docsCreateRequestDto.getDocsType()) + .lastModifiedAt(LocalDateTime.now()) + .build() + ); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/VersionDocsRepository.java b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/VersionDocsRepository.java index 68c22584..1215ee55 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/VersionDocsRepository.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/VersionDocsRepository.java @@ -1,7 +1,8 @@ package com.project.bumawiki.domain.docs.domain.repository; -import com.project.bumawiki.domain.docs.domain.VersionDocs; import org.springframework.data.jpa.repository.JpaRepository; +import com.project.bumawiki.domain.docs.domain.VersionDocs; + public interface VersionDocsRepository extends JpaRepository { } diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/type/DocsType.java b/src/main/java/com/project/bumawiki/domain/docs/domain/type/DocsType.java index f7a0789e..bc4ada30 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/type/DocsType.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/type/DocsType.java @@ -1,32 +1,32 @@ package com.project.bumawiki.domain.docs.domain.type; -import lombok.AllArgsConstructor; -import lombok.Getter; - import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import lombok.AllArgsConstructor; +import lombok.Getter; + @Getter @AllArgsConstructor public enum DocsType { - STUDENT("student"), - ACCIDENT("accident"), - TEACHER("teacher"), - MAJOR_TEACHER("major_teacher"), - MENTOR_TEACHER("mentor_teacher"), - CLUB("club"), - FREE_CLUB("free_club"), - FRAME("frame"), - NOTICE("notice"), - READONLY("readonly"); + STUDENT("student"), + ACCIDENT("accident"), + TEACHER("teacher"), + MAJOR_TEACHER("major_teacher"), + MENTOR_TEACHER("mentor_teacher"), + CLUB("club"), + FREE_CLUB("free_club"), + FRAME("frame"), + NOTICE("notice"), + READONLY("readonly"); - private static final Map BY_LABEL = - Stream.of(values()).collect(Collectors.toMap(DocsType::getName, e -> e)); + private static final Map BY_LABEL = + Stream.of(values()).collect(Collectors.toMap(DocsType::getName, e -> e)); - private final String name; + private final String name; - public static DocsType valueOfLabel(String docsType) { - return BY_LABEL.get(docsType); - } + public static DocsType valueOfLabel(String docsType) { + return BY_LABEL.get(docsType); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/exception/CannotChangeYourDocsException.java b/src/main/java/com/project/bumawiki/domain/docs/exception/CannotChangeYourDocsException.java index 9a1660a7..e1cbbb28 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/exception/CannotChangeYourDocsException.java +++ b/src/main/java/com/project/bumawiki/domain/docs/exception/CannotChangeYourDocsException.java @@ -5,9 +5,10 @@ public class CannotChangeYourDocsException extends BumawikiException { - public final static CannotChangeYourDocsException EXCEPTION = new CannotChangeYourDocsException(ErrorCode.CANNOT_CHANGE_YOUR_DOCS); + public static final CannotChangeYourDocsException EXCEPTION = new CannotChangeYourDocsException( + ErrorCode.CANNOT_CHANGE_YOUR_DOCS); - public CannotChangeYourDocsException(ErrorCode errorCode) { - super(errorCode); - } + public CannotChangeYourDocsException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/exception/DocsNotFoundException.java b/src/main/java/com/project/bumawiki/domain/docs/exception/DocsNotFoundException.java index 31a69a24..9237009d 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/exception/DocsNotFoundException.java +++ b/src/main/java/com/project/bumawiki/domain/docs/exception/DocsNotFoundException.java @@ -5,9 +5,9 @@ public class DocsNotFoundException extends BumawikiException { - public static final DocsNotFoundException EXCEPTION = new DocsNotFoundException(ErrorCode.DOCS_NOT_FOUND); + public static final DocsNotFoundException EXCEPTION = new DocsNotFoundException(ErrorCode.DOCS_NOT_FOUND); - public DocsNotFoundException(ErrorCode errorCode) { - super(errorCode); - } + public DocsNotFoundException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTitleAlreadyExistException.java b/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTitleAlreadyExistException.java index 978d7b32..ec39bab9 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTitleAlreadyExistException.java +++ b/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTitleAlreadyExistException.java @@ -5,9 +5,10 @@ public class DocsTitleAlreadyExistException extends BumawikiException { - public final static DocsTitleAlreadyExistException EXCEPTION = new DocsTitleAlreadyExistException(ErrorCode.POST_TITLE_ALREADY_EXIST); + public static final DocsTitleAlreadyExistException EXCEPTION = new DocsTitleAlreadyExistException( + ErrorCode.POST_TITLE_ALREADY_EXIST); - public DocsTitleAlreadyExistException(ErrorCode errorCode) { - super(errorCode); - } + public DocsTitleAlreadyExistException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTypeNotFoundException.java b/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTypeNotFoundException.java index 14081394..f3a2c419 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTypeNotFoundException.java +++ b/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTypeNotFoundException.java @@ -5,9 +5,10 @@ public class DocsTypeNotFoundException extends BumawikiException { - public static final DocsTypeNotFoundException EXCEPTION = new DocsTypeNotFoundException(ErrorCode.DOCS_TYPE_NOT_FOUND); + public static final DocsTypeNotFoundException EXCEPTION = new DocsTypeNotFoundException( + ErrorCode.DOCS_TYPE_NOT_FOUND); - public DocsTypeNotFoundException(ErrorCode errorCode) { - super(errorCode); - } + public DocsTypeNotFoundException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/exception/NoUpdatableDocsException.java b/src/main/java/com/project/bumawiki/domain/docs/exception/NoUpdatableDocsException.java index 70596c14..8653e961 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/exception/NoUpdatableDocsException.java +++ b/src/main/java/com/project/bumawiki/domain/docs/exception/NoUpdatableDocsException.java @@ -5,9 +5,9 @@ public class NoUpdatableDocsException extends BumawikiException { - public static final NoUpdatableDocsException EXCEPTION = new NoUpdatableDocsException(ErrorCode.NO_UPDATABLE_DOCS); + public static final NoUpdatableDocsException EXCEPTION = new NoUpdatableDocsException(ErrorCode.NO_UPDATABLE_DOCS); - public NoUpdatableDocsException(ErrorCode errorCode) { - super(errorCode); - } + public NoUpdatableDocsException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/exception/VersionNotExistException.java b/src/main/java/com/project/bumawiki/domain/docs/exception/VersionNotExistException.java index f38a7307..93af5780 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/exception/VersionNotExistException.java +++ b/src/main/java/com/project/bumawiki/domain/docs/exception/VersionNotExistException.java @@ -5,9 +5,9 @@ public class VersionNotExistException extends BumawikiException { - public static final NoUpdatableDocsException EXCEPTION = new NoUpdatableDocsException(ErrorCode.VERSION_NOT_EXIST); + public static final NoUpdatableDocsException EXCEPTION = new NoUpdatableDocsException(ErrorCode.VERSION_NOT_EXIST); - public VersionNotExistException(ErrorCode errorCode) { - super(errorCode); - } + public VersionNotExistException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCheckYouLikeThisController.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCheckYouLikeThisController.java index b40e4f59..4b0dc7a1 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCheckYouLikeThisController.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCheckYouLikeThisController.java @@ -1,21 +1,23 @@ package com.project.bumawiki.domain.docs.presentation; -import com.project.bumawiki.domain.docs.service.DocsCheckYouLikeThisService; -import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.project.bumawiki.domain.docs.service.DocsCheckYouLikeThisService; + +import lombok.RequiredArgsConstructor; + @RequiredArgsConstructor @RestController @RequestMapping("/api/docs/like") public class DocsCheckYouLikeThisController { - private final DocsCheckYouLikeThisService docsCheckYouLikeThisService; + private final DocsCheckYouLikeThisService docsCheckYouLikeThisService; - @GetMapping("/{docsId}") - public ResponseEntity checkYouLikeThis(@PathVariable Long docsId) { - return ResponseEntity.ok(docsCheckYouLikeThisService.checkUserLikeThisDocs(docsId)); - } + @GetMapping("/{docsId}") + public ResponseEntity checkYouLikeThis(@PathVariable Long docsId) { + return ResponseEntity.ok(docsCheckYouLikeThisService.checkUserLikeThisDocs(docsId)); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCreateUpdateController.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCreateUpdateController.java index 68f121ae..aeed70c0 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCreateUpdateController.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCreateUpdateController.java @@ -1,20 +1,25 @@ package com.project.bumawiki.domain.docs.presentation; +import java.io.IOException; + +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import com.project.bumawiki.domain.docs.presentation.dto.request.DocsCreateRequestDto; import com.project.bumawiki.domain.docs.presentation.dto.request.DocsTitleUpdateRequestDto; import com.project.bumawiki.domain.docs.presentation.dto.request.DocsTypeUpdateDto; import com.project.bumawiki.domain.docs.presentation.dto.request.DocsUpdateRequestDto; -import com.project.bumawiki.domain.docs.presentation.dto.response.DocsResponseDto; import com.project.bumawiki.domain.docs.service.DocsCreateService; import com.project.bumawiki.domain.docs.service.DocsUpdateService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; +import lombok.RequiredArgsConstructor; @Validated @RequiredArgsConstructor @@ -22,26 +27,28 @@ @RequestMapping("/api/docs") public class DocsCreateUpdateController { - private final DocsUpdateService docsUpdateService; - private final DocsCreateService docsCreateService; - - @PostMapping("/create") - public ResponseEntity createDocs(@RequestBody DocsCreateRequestDto request) throws IOException { - return ResponseEntity.ok(docsCreateService.execute(request)); - } - - @PutMapping("/update/{title}") - public ResponseEntity updateDocs(@RequestHeader("Authorization") String bearer, @PathVariable String title, @RequestBody DocsUpdateRequestDto request) throws IOException { - return ResponseEntity.ok(docsUpdateService.execute(bearer, title, request)); - } - - @PutMapping("/update/title/{title}") - public ResponseEntity updateDocsTitle(@RequestBody DocsTitleUpdateRequestDto requestDto, @PathVariable String title) { - return ResponseEntity.ok(docsUpdateService.titleUpdate(title, requestDto)); - } - - @PutMapping("/update/docsType") - public ResponseEntity updateDocsType(@RequestBody DocsTypeUpdateDto requestDto) { - return ResponseEntity.ok(docsUpdateService.DocsTypeUpdate(requestDto)); - } + private final DocsUpdateService docsUpdateService; + private final DocsCreateService docsCreateService; + + @PostMapping("/create") + public ResponseEntity createDocs(@RequestBody DocsCreateRequestDto request) throws IOException { + return ResponseEntity.ok(docsCreateService.execute(request)); + } + + @PutMapping("/update/{title}") + public ResponseEntity updateDocs(@RequestHeader("Authorization") String bearer, @PathVariable String title, + @RequestBody DocsUpdateRequestDto request) throws IOException { + return ResponseEntity.ok(docsUpdateService.execute(bearer, title, request)); + } + + @PutMapping("/update/title/{title}") + public ResponseEntity updateDocsTitle(@RequestBody DocsTitleUpdateRequestDto requestDto, + @PathVariable String title) { + return ResponseEntity.ok(docsUpdateService.titleUpdate(title, requestDto)); + } + + @PutMapping("/update/docsType") + public ResponseEntity updateDocsType(@RequestBody DocsTypeUpdateDto requestDto) { + return ResponseEntity.ok(docsUpdateService.docsTypeUpdate(requestDto)); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsDeleteController.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsDeleteController.java index e6025a8d..baecdfb2 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsDeleteController.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsDeleteController.java @@ -1,7 +1,5 @@ package com.project.bumawiki.domain.docs.presentation; -import com.project.bumawiki.domain.docs.service.DocsDeleteService; -import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; @@ -9,15 +7,19 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.project.bumawiki.domain.docs.service.DocsDeleteService; + +import lombok.RequiredArgsConstructor; + @Validated @RequiredArgsConstructor @RestController @RequestMapping("/api/docs") public class DocsDeleteController { - private final DocsDeleteService docsDeleteService; + private final DocsDeleteService docsDeleteService; - @DeleteMapping("delete/{id}") - public ResponseEntity deleteDocs(@PathVariable Long id) { - return ResponseEntity.ok(docsDeleteService.execute(id)); - } + @DeleteMapping("delete/{id}") + public ResponseEntity deleteDocs(@PathVariable Long id) { + return ResponseEntity.ok(docsDeleteService.execute(id)); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsInformationController.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsInformationController.java index 4296238a..e2983735 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsInformationController.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsInformationController.java @@ -79,7 +79,7 @@ public ResponseEntity> showDocsModifiedTimeDe @GetMapping("/find/modifiedR") public ResponseEntity> showDocsModifiedTimeAsc( - @PageableDefault(size = 12) Pageable pageable) { + @PageableDefault(size = 12) Pageable pageable) { return ResponseEntity.ok(docsInformationService.showDocsModifiedAtAsc(pageable)); } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsPopularInformationController.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsPopularInformationController.java index 8e929d19..e9a7003a 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsPopularInformationController.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsPopularInformationController.java @@ -1,23 +1,25 @@ package com.project.bumawiki.domain.docs.presentation; -import com.project.bumawiki.domain.docs.presentation.dto.response.DocsPopularResponseDto; -import com.project.bumawiki.domain.docs.service.DocsPopularInformationService; -import lombok.RequiredArgsConstructor; +import java.util.List; + import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; +import com.project.bumawiki.domain.docs.presentation.dto.response.DocsPopularResponseDto; +import com.project.bumawiki.domain.docs.service.DocsPopularInformationService; + +import lombok.RequiredArgsConstructor; @RestController @RequestMapping("/api/docs") @RequiredArgsConstructor public class DocsPopularInformationController { - private final DocsPopularInformationService docsPopularInformationService; + private final DocsPopularInformationService docsPopularInformationService; - @GetMapping("/popular") - public ResponseEntity> docsPopular() { - return ResponseEntity.ok(docsPopularInformationService.getDocsByPopular()); - } + @GetMapping("/popular") + public ResponseEntity> docsPopular() { + return ResponseEntity.ok(docsPopularInformationService.getDocsByPopular()); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/ClubResponseDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/ClubResponseDto.java index befb8e75..b53a17f0 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/ClubResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/ClubResponseDto.java @@ -1,18 +1,18 @@ package com.project.bumawiki.domain.docs.presentation.dto; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonProperty; import com.project.bumawiki.domain.docs.presentation.dto.response.DocsNameAndEnrollResponseDto; -import java.util.List; - public class ClubResponseDto { - @JsonProperty - private List club; - @JsonProperty - private List freeClub; + @JsonProperty + private List club; + @JsonProperty + private List freeClub; - public ClubResponseDto(List club, List freeClub) { - this.club = club; - this.freeClub = freeClub; - } + public ClubResponseDto(List club, List freeClub) { + this.club = club; + this.freeClub = freeClub; + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/MergeConflictDataResponse.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/MergeConflictDataResponse.java index 0635c309..b0a14d86 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/MergeConflictDataResponse.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/MergeConflictDataResponse.java @@ -4,9 +4,7 @@ import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; -import com.project.bumawiki.domain.docs.domain.VersionDocs; import com.project.bumawiki.domain.docs.presentation.dto.response.ContentVersionDocsResponseDto; -import com.project.bumawiki.domain.docs.presentation.dto.response.VersionDocsResponseDto; public record MergeConflictDataResponse( ContentVersionDocsResponseDto firstDocs, @@ -14,4 +12,5 @@ public record MergeConflictDataResponse( ContentVersionDocsResponseDto originalDocs, LinkedList diff1, LinkedList diff2 -) {} +) { +} diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/TeacherResponseDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/TeacherResponseDto.java index c3c048f3..dfd40f91 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/TeacherResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/TeacherResponseDto.java @@ -1,21 +1,22 @@ package com.project.bumawiki.domain.docs.presentation.dto; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonProperty; import com.project.bumawiki.domain.docs.presentation.dto.response.DocsNameAndEnrollResponseDto; -import java.util.List; - public class TeacherResponseDto { - @JsonProperty - private List teacher; - @JsonProperty - private List majorTeacher; - @JsonProperty - private List mentorTeacher; + @JsonProperty + private List teacher; + @JsonProperty + private List majorTeacher; + @JsonProperty + private List mentorTeacher; - public TeacherResponseDto(List teacher, List majorTeacher, List mentorTeacher) { - this.teacher = teacher; - this.majorTeacher = majorTeacher; - this.mentorTeacher = mentorTeacher; - } + public TeacherResponseDto(List teacher, + List majorTeacher, List mentorTeacher) { + this.teacher = teacher; + this.majorTeacher = majorTeacher; + this.mentorTeacher = mentorTeacher; + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/VersionDocsSummaryDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/VersionDocsSummaryDto.java index a1644d6d..11f11fd8 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/VersionDocsSummaryDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/VersionDocsSummaryDto.java @@ -1,23 +1,24 @@ package com.project.bumawiki.domain.docs.presentation.dto; +import java.time.LocalDateTime; + import com.project.bumawiki.domain.docs.domain.VersionDocs; import com.project.bumawiki.domain.user.domain.User; -import lombok.Getter; -import java.time.LocalDateTime; +import lombok.Getter; @Getter public class VersionDocsSummaryDto { - private final Long id; - private final LocalDateTime thisVersionCreatedAt; - private final Long userId; - private final String nickName; + private final Long id; + private final LocalDateTime thisVersionCreatedAt; + private final Long userId; + private final String nickName; - public VersionDocsSummaryDto(VersionDocs versionDocs) { - User contributor = versionDocs.getContributor().getContributor(); - this.id = versionDocs.getId(); - this.thisVersionCreatedAt = versionDocs.getThisVersionCreatedAt(); - this.nickName = contributor.getNickName(); - this.userId = contributor.getId(); - } + public VersionDocsSummaryDto(VersionDocs versionDocs) { + User contributor = versionDocs.getContributor().getContributor(); + this.id = versionDocs.getId(); + this.thisVersionCreatedAt = versionDocs.getThisVersionCreatedAt(); + this.nickName = contributor.getNickName(); + this.userId = contributor.getId(); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsCreateRequestDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsCreateRequestDto.java index ebb19114..1e9a922c 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsCreateRequestDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsCreateRequestDto.java @@ -1,26 +1,26 @@ package com.project.bumawiki.domain.docs.presentation.dto.request; import com.project.bumawiki.domain.docs.domain.type.DocsType; -import lombok.Getter; import jakarta.validation.constraints.NotBlank; +import lombok.Getter; @Getter public class DocsCreateRequestDto { - @NotBlank - private String title; + @NotBlank + private String title; - @NotBlank - private int enroll; + @NotBlank + private int enroll; - @NotBlank - private String contents; + @NotBlank + private String contents; - @NotBlank - private DocsType docsType; + @NotBlank + private DocsType docsType; - public void updateContent(String setContent) { - this.contents = setContent; - } + public void updateContent(String setContent) { + this.contents = setContent; + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsTitleUpdateRequestDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsTitleUpdateRequestDto.java index 52192e20..86f3d2a3 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsTitleUpdateRequestDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsTitleUpdateRequestDto.java @@ -1,11 +1,10 @@ package com.project.bumawiki.domain.docs.presentation.dto.request; -import lombok.Getter; - import jakarta.validation.constraints.NotBlank; +import lombok.Getter; @Getter public class DocsTitleUpdateRequestDto { - @NotBlank - private String title; + @NotBlank + private String title; } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsTypeUpdateDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsTypeUpdateDto.java index 934f38c7..0cda5e5d 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsTypeUpdateDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsTypeUpdateDto.java @@ -1,16 +1,16 @@ package com.project.bumawiki.domain.docs.presentation.dto.request; import com.project.bumawiki.domain.docs.domain.type.DocsType; -import lombok.Getter; import jakarta.validation.constraints.NotBlank; +import lombok.Getter; @Getter public class DocsTypeUpdateDto { - @NotBlank - Long id; - @NotBlank - DocsType docsType; + @NotBlank + Long id; + @NotBlank + DocsType docsType; } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsUpdateRequestDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsUpdateRequestDto.java index fe99a3ca..ace6f7ad 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsUpdateRequestDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsUpdateRequestDto.java @@ -1,15 +1,14 @@ package com.project.bumawiki.domain.docs.presentation.dto.request; -import lombok.Getter; - import jakarta.validation.constraints.NotNull; +import lombok.Getter; @Getter public class DocsUpdateRequestDto { - @NotNull - private String contents; + @NotNull + private String contents; - @NotNull(message = "업데이트할 문서의 버전이 전달되지 않았습니다.") - private int updatingVersion; + @NotNull(message = "업데이트할 문서의 버전이 전달되지 않았습니다.") + private int updatingVersion; } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsNameAndEnrollResponseDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsNameAndEnrollResponseDto.java index ae883ef5..0644d770 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsNameAndEnrollResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsNameAndEnrollResponseDto.java @@ -13,13 +13,13 @@ @Getter public class DocsNameAndEnrollResponseDto { - private Long id; - private String title; - private int enroll; - private String simpleContents; - private DocsType docsType; - private LocalDateTime lastModifiedAt; - private String thumbnail; + private final Long id; + private final String title; + private final int enroll; + private final String simpleContents; + private final DocsType docsType; + private final LocalDateTime lastModifiedAt; + private final String thumbnail; public DocsNameAndEnrollResponseDto(Docs docs) { this.id = docs.getId(); diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsPopularResponseDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsPopularResponseDto.java index 1f3494e9..580d98b9 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsPopularResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsPopularResponseDto.java @@ -4,19 +4,19 @@ import com.project.bumawiki.domain.docs.domain.type.DocsType; public class DocsPopularResponseDto { - @JsonProperty - private final String title; - @JsonProperty - private final int enroll; - @JsonProperty - private final DocsType docsType; - @JsonProperty - private final long thumbsUpsCounts; + @JsonProperty + private final String title; + @JsonProperty + private final int enroll; + @JsonProperty + private final DocsType docsType; + @JsonProperty + private final long thumbsUpsCounts; - public DocsPopularResponseDto(String title, int enroll, DocsType docsType, long thumbsUpsCounts) { - this.title = title; - this.enroll = enroll; - this.docsType = docsType; - this.thumbsUpsCounts = thumbsUpsCounts; - } + public DocsPopularResponseDto(String title, int enroll, DocsType docsType, long thumbsUpsCounts) { + this.title = title; + this.enroll = enroll; + this.docsType = docsType; + this.thumbsUpsCounts = thumbsUpsCounts; + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsThumbsUpResponseDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsThumbsUpResponseDto.java index db597803..fbb50f0a 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsThumbsUpResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/DocsThumbsUpResponseDto.java @@ -4,10 +4,10 @@ public class DocsThumbsUpResponseDto { - @JsonProperty - private final int thumbsUpsCount; + @JsonProperty + private final int thumbsUpsCount; - public DocsThumbsUpResponseDto(int thumbsUpsCount) { - this.thumbsUpsCount = thumbsUpsCount; - } + public DocsThumbsUpResponseDto(int thumbsUpsCount) { + this.thumbsUpsCount = thumbsUpsCount; + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionDocsDiffResponseDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionDocsDiffResponseDto.java index b66866a2..3d7a8363 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionDocsDiffResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionDocsDiffResponseDto.java @@ -1,25 +1,27 @@ package com.project.bumawiki.domain.docs.presentation.dto.response; -import com.project.bumawiki.domain.docs.domain.type.DocsType; -import com.project.bumawiki.domain.docs.presentation.dto.VersionDocsSummaryDto; -import lombok.Getter; +import static org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch.*; import java.util.ArrayList; -import static org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch.Diff; +import com.project.bumawiki.domain.docs.domain.type.DocsType; +import com.project.bumawiki.domain.docs.presentation.dto.VersionDocsSummaryDto; + +import lombok.Getter; @Getter public class VersionDocsDiffResponseDto { - private String title; - private DocsType docsType; - private VersionDocsSummaryDto versionDocs; - private ArrayList diff; + private final String title; + private final DocsType docsType; + private final VersionDocsSummaryDto versionDocs; + private final ArrayList diff; - public VersionDocsDiffResponseDto(String title, DocsType docsType, VersionDocsSummaryDto versionDocs, ArrayList diff) { - this.title = title; - this.docsType = docsType; - this.versionDocs = versionDocs; - this.diff = diff; - } + public VersionDocsDiffResponseDto(String title, DocsType docsType, VersionDocsSummaryDto versionDocs, + ArrayList diff) { + this.title = title; + this.docsType = docsType; + this.versionDocs = versionDocs; + this.diff = diff; + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionDocsResponseDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionDocsResponseDto.java index a50b303a..8e16c9f5 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionDocsResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionDocsResponseDto.java @@ -6,10 +6,10 @@ @Getter public final class VersionDocsResponseDto { - private int index; private final LocalDateTime thisVersionCreatedAt; private final Long userId; private final String nickName; + private int index; public VersionDocsResponseDto(LocalDateTime thisVersionCreatedAt, Long userId, String nickName) { this.thisVersionCreatedAt = thisVersionCreatedAt; diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionResponseDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionResponseDto.java index ff48836d..e08d1d7c 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/response/VersionResponseDto.java @@ -20,10 +20,10 @@ public VersionResponseDto(List versionDocsResponseDto, D this.docsType = findDocs.getDocsType(); this.title = findDocs.getTitle(); - int i = length - 1; + int index = length; for (VersionDocsResponseDto docsResponseDto : versionDocsResponseDto) { - docsResponseDto.updateIndex(i); - i -= 1; + docsResponseDto.updateIndex(index); + index -= 1; } } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/service/DocsCheckYouLikeThisService.java b/src/main/java/com/project/bumawiki/domain/docs/service/DocsCheckYouLikeThisService.java index 1b49ec4d..ae84b7ad 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/service/DocsCheckYouLikeThisService.java +++ b/src/main/java/com/project/bumawiki/domain/docs/service/DocsCheckYouLikeThisService.java @@ -1,26 +1,28 @@ package com.project.bumawiki.domain.docs.service; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import com.project.bumawiki.domain.docs.domain.Docs; import com.project.bumawiki.domain.docs.domain.repository.DocsRepositoryMapper; import com.project.bumawiki.domain.user.UserFacade; import com.project.bumawiki.domain.user.domain.User; import com.project.bumawiki.global.error.exception.ErrorCode; + import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class DocsCheckYouLikeThisService { - private final DocsRepositoryMapper docsRepositoryMapper; - private final UserFacade userFacade; + private final DocsRepositoryMapper docsRepositoryMapper; + private final UserFacade userFacade; - public boolean checkUserLikeThisDocs(final Long docsId) { - User currentUser = userFacade.getCurrentUser(); - Docs docs = docsRepositoryMapper.findById(docsId, ErrorCode.DOCS_NOT_FOUND); - User foundUser = userFacade.getUserByEmail(currentUser.getEmail()); + public boolean checkUserLikeThisDocs(final Long docsId) { + User currentUser = userFacade.getCurrentUser(); + Docs docs = docsRepositoryMapper.findById(docsId, ErrorCode.DOCS_NOT_FOUND); + User foundUser = userFacade.getUserByEmail(currentUser.getEmail()); - return docs.doesUserLike(foundUser); - } + return docs.doesUserLike(foundUser); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/service/DocsCreateService.java b/src/main/java/com/project/bumawiki/domain/docs/service/DocsCreateService.java index 92751ffe..093c5bcf 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/service/DocsCreateService.java +++ b/src/main/java/com/project/bumawiki/domain/docs/service/DocsCreateService.java @@ -7,7 +7,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; import com.project.bumawiki.domain.contribute.domain.Contribute; import com.project.bumawiki.domain.contribute.service.ContributeService; @@ -29,6 +28,17 @@ public class DocsCreateService { private final ContributeService contributeService; private final DocsRepositoryMapper docsRepositoryMapper; + private static void setVersionDocs(final Docs docs, final VersionDocs savedVersionDocs, + final Contribute contribute) { + List versionDocs = new ArrayList<>(); + + versionDocs.add(savedVersionDocs); + + savedVersionDocs.updateContributor(contribute); + + docs.setVersionDocs(versionDocs); + } + @Transactional public Long execute(final DocsCreateRequestDto docsCreateRequestDto) throws IOException { @@ -44,25 +54,6 @@ public Long execute(final DocsCreateRequestDto docsCreateRequestDto) throws IOEx return docs.getId(); } - private static void setVersionDocs(final Docs docs, final VersionDocs savedVersionDocs, - final Contribute contribute) { - List versionDocs = new ArrayList<>(); - - versionDocs.add(savedVersionDocs); - - savedVersionDocs.updateContributor(contribute); - - docs.setVersionDocs(versionDocs); - } - - private void setImageUrl(final DocsCreateRequestDto docsCreateRequestDto, final MultipartFile[] files) throws - IOException { - if (files != null) { - ArrayList FileUrl = imageService.GetFileUrl(files, docsCreateRequestDto.getTitle()); - setImageUrlInContents(docsCreateRequestDto, FileUrl); - } - } - /** * 프론트가 [사진1]이라고 보낸거 우리가 저장한 이미지 주소로 바꾸는 로직 */ diff --git a/src/main/java/com/project/bumawiki/domain/docs/service/DocsDeleteService.java b/src/main/java/com/project/bumawiki/domain/docs/service/DocsDeleteService.java index a46e35f7..c5697f4e 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/service/DocsDeleteService.java +++ b/src/main/java/com/project/bumawiki/domain/docs/service/DocsDeleteService.java @@ -1,19 +1,21 @@ package com.project.bumawiki.domain.docs.service; -import com.project.bumawiki.domain.docs.domain.repository.DocsRepository; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.project.bumawiki.domain.docs.domain.repository.DocsRepository; + +import lombok.RequiredArgsConstructor; + @Service @RequiredArgsConstructor @Transactional public class DocsDeleteService { - private final DocsRepository docsRepository; + private final DocsRepository docsRepository; - public Long execute(Long id) { - docsRepository.deleteById(id); + public Long execute(Long id) { + docsRepository.deleteById(id); - return id; - } + return id; + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/service/DocsInformationService.java b/src/main/java/com/project/bumawiki/domain/docs/service/DocsInformationService.java index 1dec4a42..c62dc56b 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/service/DocsInformationService.java +++ b/src/main/java/com/project/bumawiki/domain/docs/service/DocsInformationService.java @@ -1,5 +1,20 @@ package com.project.bumawiki.domain.docs.service; +import static org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.stream.Collectors; + +import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import com.project.bumawiki.domain.contribute.domain.repository.ContributeRepository; import com.project.bumawiki.domain.docs.domain.Docs; import com.project.bumawiki.domain.docs.domain.VersionDocs; @@ -10,42 +25,29 @@ import com.project.bumawiki.domain.docs.presentation.dto.ClubResponseDto; import com.project.bumawiki.domain.docs.presentation.dto.TeacherResponseDto; import com.project.bumawiki.domain.docs.presentation.dto.VersionDocsSummaryDto; -import com.project.bumawiki.domain.docs.presentation.dto.response.*; +import com.project.bumawiki.domain.docs.presentation.dto.response.DocsNameAndEnrollResponseDto; +import com.project.bumawiki.domain.docs.presentation.dto.response.DocsResponseDto; +import com.project.bumawiki.domain.docs.presentation.dto.response.DocsThumbsUpResponseDto; +import com.project.bumawiki.domain.docs.presentation.dto.response.VersionDocsDiffResponseDto; +import com.project.bumawiki.domain.docs.presentation.dto.response.VersionResponseDto; import com.project.bumawiki.domain.user.domain.User; import lombok.RequiredArgsConstructor; -import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import static org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch.Diff; - @RequiredArgsConstructor @Service @Transactional(readOnly = true) public class DocsInformationService { - private final DocsRepository docsRepository; - private final ContributeRepository contributeRepository; + private final DocsRepository docsRepository; + private final ContributeRepository contributeRepository; - public List findByDocsType(final DocsType docsType) { - List allStudent = docsRepository.findByDocsType(docsType); + public List findByDocsType(final DocsType docsType) { + List allStudent = docsRepository.findByDocsType(docsType); - return allStudent.stream() - .map(DocsNameAndEnrollResponseDto::new) - .collect(Collectors.toList()); - } + return allStudent.stream() + .map(DocsNameAndEnrollResponseDto::new) + .collect(Collectors.toList()); + } public Map> findByDocsTypeOrderByEnroll(final DocsType docsType) { List allDocs = docsRepository.findByDocsType(docsType); @@ -65,101 +67,102 @@ public Map> findByDocsTypeOrderByEnr return enrollMap; } - @Transactional(readOnly = true) - public List findAllByTitle(String title) { - List docs = docsRepository.findAllByTitle(title); - - if (docs.size() == 0) { - throw DocsNotFoundException.EXCEPTION; - } - - return docs.stream() - .map(DocsNameAndEnrollResponseDto::new) - .collect(Collectors.toList()); - } - - @Transactional - public DocsResponseDto findDocs(String title) { - Docs docs = docsRepository.findByTitle(title). - orElseThrow(() -> DocsNotFoundException.EXCEPTION); - - List contributors = contributeRepository.findUserAllByDocs(docs); - - return new DocsResponseDto(docs, contributors); - } - - public VersionResponseDto findDocsVersion(String title) { - Docs docs = docsRepository.findByTitle(title) - .orElseThrow(() -> DocsNotFoundException.EXCEPTION); - - return docsRepository.getDocsVersion(docs); - } - - public List showDocsModifiedAtDesc(Pageable pageable) { - return docsRepository.findByLastModifiedAt(pageable) - .stream() - .map(DocsNameAndEnrollResponseDto::new) - .collect(Collectors.toList()); - } - - public List showDocsModifiedAtAsc(Pageable pageable) { - return docsRepository.findByLastModifiedAtAsc(pageable) - .stream() - .map(DocsNameAndEnrollResponseDto::new) - .collect(Collectors.toList()); - } - - public List showDocsModifiedAtDescAll() { - return docsRepository.findByLastModifiedAtAll() - .stream() - .map(DocsNameAndEnrollResponseDto::new) - .collect(Collectors.toList()); - } - - public VersionDocsDiffResponseDto showVersionDocsDiff(String title, Long version) { - Docs docs = docsRepository.findByTitle(title).orElseThrow( - () -> DocsNotFoundException.EXCEPTION - ); - String baseDocs = ""; - String versionedDocs; - List versionDocs = docs.getDocsVersion(); - try { - versionedDocs = versionDocs.get(version.intValue()).getContents(); - if (version > 0) { - baseDocs = versionDocs.get((int) (version - 1)).getContents(); - } - } catch (IndexOutOfBoundsException e) { - throw VersionNotExistException.EXCEPTION; - } - - DiffMatchPatch dmp = new DiffMatchPatch(); - LinkedList diff = dmp.diffMain(baseDocs, versionedDocs); - dmp.diffCleanupSemantic(diff); - - return new VersionDocsDiffResponseDto(docs.getTitle(), docs.getDocsType(), new VersionDocsSummaryDto(versionDocs.get(version.intValue())), new ArrayList<>(diff)); - } - - @Transactional(readOnly = true) - public DocsThumbsUpResponseDto getDocsThumbsUpsCount(String title) { - Docs docs = docsRepository.findByTitle(title).orElseThrow( - () -> DocsNotFoundException.EXCEPTION - ); - - return new DocsThumbsUpResponseDto(docs.getThumbsUpsCount()); - } - - public TeacherResponseDto getAllTeacher() { - return new TeacherResponseDto( - findByDocsType(DocsType.TEACHER), - findByDocsType(DocsType.MAJOR_TEACHER), - findByDocsType(DocsType.MENTOR_TEACHER) - ); - } - - public ClubResponseDto getAllClub() { - return new ClubResponseDto( - findByDocsType(DocsType.CLUB), - findByDocsType(DocsType.FREE_CLUB) - ); - } + @Transactional(readOnly = true) + public List findAllByTitle(String title) { + List docs = docsRepository.findAllByTitle(title); + + if (docs.size() == 0) { + throw DocsNotFoundException.EXCEPTION; + } + + return docs.stream() + .map(DocsNameAndEnrollResponseDto::new) + .collect(Collectors.toList()); + } + + @Transactional + public DocsResponseDto findDocs(String title) { + Docs docs = docsRepository.findByTitle(title) + .orElseThrow(() -> DocsNotFoundException.EXCEPTION); + + List contributors = contributeRepository.findUserAllByDocs(docs); + + return new DocsResponseDto(docs, contributors); + } + + public VersionResponseDto findDocsVersion(String title) { + Docs docs = docsRepository.findByTitle(title) + .orElseThrow(() -> DocsNotFoundException.EXCEPTION); + + return docsRepository.getDocsVersion(docs); + } + + public List showDocsModifiedAtDesc(Pageable pageable) { + return docsRepository.findByLastModifiedAt(pageable) + .stream() + .map(DocsNameAndEnrollResponseDto::new) + .collect(Collectors.toList()); + } + + public List showDocsModifiedAtAsc(Pageable pageable) { + return docsRepository.findByLastModifiedAtAsc(pageable) + .stream() + .map(DocsNameAndEnrollResponseDto::new) + .collect(Collectors.toList()); + } + + public List showDocsModifiedAtDescAll() { + return docsRepository.findByLastModifiedAtAll() + .stream() + .map(DocsNameAndEnrollResponseDto::new) + .collect(Collectors.toList()); + } + + public VersionDocsDiffResponseDto showVersionDocsDiff(String title, Long version) { + Docs docs = docsRepository.findByTitle(title).orElseThrow( + () -> DocsNotFoundException.EXCEPTION + ); + String baseDocs = ""; + String versionedDocs; + List versionDocs = docs.getDocsVersion(); + try { + versionedDocs = versionDocs.get(version.intValue()).getContents(); + if (version > 0) { + baseDocs = versionDocs.get((int)(version - 1)).getContents(); + } + } catch (IndexOutOfBoundsException e) { + throw VersionNotExistException.EXCEPTION; + } + + DiffMatchPatch dmp = new DiffMatchPatch(); + LinkedList diff = dmp.diffMain(baseDocs, versionedDocs); + dmp.diffCleanupSemantic(diff); + + return new VersionDocsDiffResponseDto(docs.getTitle(), docs.getDocsType(), + new VersionDocsSummaryDto(versionDocs.get(version.intValue())), new ArrayList<>(diff)); + } + + @Transactional(readOnly = true) + public DocsThumbsUpResponseDto getDocsThumbsUpsCount(String title) { + Docs docs = docsRepository.findByTitle(title).orElseThrow( + () -> DocsNotFoundException.EXCEPTION + ); + + return new DocsThumbsUpResponseDto(docs.getThumbsUpsCount()); + } + + public TeacherResponseDto getAllTeacher() { + return new TeacherResponseDto( + findByDocsType(DocsType.TEACHER), + findByDocsType(DocsType.MAJOR_TEACHER), + findByDocsType(DocsType.MENTOR_TEACHER) + ); + } + + public ClubResponseDto getAllClub() { + return new ClubResponseDto( + findByDocsType(DocsType.CLUB), + findByDocsType(DocsType.FREE_CLUB) + ); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/service/DocsPopularInformationService.java b/src/main/java/com/project/bumawiki/domain/docs/service/DocsPopularInformationService.java index f0802292..bc84da90 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/service/DocsPopularInformationService.java +++ b/src/main/java/com/project/bumawiki/domain/docs/service/DocsPopularInformationService.java @@ -1,20 +1,22 @@ package com.project.bumawiki.domain.docs.service; -import com.project.bumawiki.domain.docs.domain.repository.DocsRepository; -import com.project.bumawiki.domain.docs.presentation.dto.response.DocsPopularResponseDto; -import lombok.RequiredArgsConstructor; +import java.util.List; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; +import com.project.bumawiki.domain.docs.domain.repository.DocsRepository; +import com.project.bumawiki.domain.docs.presentation.dto.response.DocsPopularResponseDto; + +import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor public class DocsPopularInformationService { - private final DocsRepository docsRepository; + private final DocsRepository docsRepository; - @Transactional(readOnly = true) - public List getDocsByPopular() { - return docsRepository.findByThumbsUpsDesc(); - } + @Transactional(readOnly = true) + public List getDocsByPopular() { + return docsRepository.findByThumbsUpsDesc(); + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/service/DocsUpdateService.java b/src/main/java/com/project/bumawiki/domain/docs/service/DocsUpdateService.java index fed42fd8..564a5142 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/service/DocsUpdateService.java +++ b/src/main/java/com/project/bumawiki/domain/docs/service/DocsUpdateService.java @@ -73,7 +73,7 @@ public Long titleUpdate(String title, DocsTitleUpdateRequestDto requestDto) { } @Transactional - public Long DocsTypeUpdate(final DocsTypeUpdateDto docsTypeUpdateDto) { + public Long docsTypeUpdate(final DocsTypeUpdateDto docsTypeUpdateDto) { Docs docs = docsRepository.findById(docsTypeUpdateDto.getId()) .orElseThrow(() -> NoUpdatableDocsException.EXCEPTION); @@ -131,8 +131,9 @@ private void updateDocsOneself(String title, Integer enroll, String authId, Docs private void updateReadOnlyDocs(DocsType docsType) { - if (docsType.equals(DocsType.READONLY)) + if (docsType.equals(DocsType.READONLY)) { throw NoUpdatableDocsException.EXCEPTION; + } } private Docs setVersionDocsToDocs(VersionDocs versionDocs) { diff --git a/src/main/java/com/project/bumawiki/domain/image/ImageController.java b/src/main/java/com/project/bumawiki/domain/image/ImageController.java index 79de6df2..58391f33 100644 --- a/src/main/java/com/project/bumawiki/domain/image/ImageController.java +++ b/src/main/java/com/project/bumawiki/domain/image/ImageController.java @@ -1,7 +1,7 @@ package com.project.bumawiki.domain.image; -import com.project.bumawiki.domain.image.service.ImageService; -import org.springframework.beans.factory.annotation.Autowired; +import java.io.IOException; + import org.springframework.core.io.Resource; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -10,39 +10,36 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import jakarta.servlet.http.HttpServletRequest; -import java.io.IOException; +import com.project.bumawiki.domain.image.service.ImageService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +@RequiredArgsConstructor @RestController @RequestMapping("/api/image") public class ImageController { - private ImageService imageService; - - @Autowired - public void FileController(ImageService imageService) { - this.imageService = imageService; - } + private final ImageService imageService; - @GetMapping("/display/{DocsName}/{fileName}") - public ResponseEntity displayImage(@PathVariable String fileName, - @PathVariable String DocsName, - HttpServletRequest request) { - // Load file as Resource - Resource resource = imageService.loadFileAsResource(DocsName, fileName); - // Try to determine file's content type - String contentType = null; - try { - contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath()); - } catch (IOException ex) { - } - if (contentType == null) { - contentType = "application/octet-stream"; - } - return ResponseEntity.ok() - .contentType(MediaType.parseMediaType(contentType)) - .header("Content-Type", contentType) - .body(resource); - } + @GetMapping("/display/{docsName}/{fileName}") + public ResponseEntity displayImage(@PathVariable String fileName, + @PathVariable String docsName, + HttpServletRequest request) { + // Load file as Resource + Resource resource = imageService.loadFileAsResource(docsName, fileName); + // Try to determine file's content type + String contentType = null; + try { + contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath()); + } catch (IOException ex) { + } + if (contentType == null) { + contentType = "application/octet-stream"; + } + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(contentType)) + .header("Content-Type", contentType) + .body(resource); + } } diff --git a/src/main/java/com/project/bumawiki/domain/image/exception/NoImageException.java b/src/main/java/com/project/bumawiki/domain/image/exception/NoImageException.java index 8019ea29..ebf1d88c 100644 --- a/src/main/java/com/project/bumawiki/domain/image/exception/NoImageException.java +++ b/src/main/java/com/project/bumawiki/domain/image/exception/NoImageException.java @@ -5,9 +5,9 @@ public class NoImageException extends BumawikiException { - public static final NoImageException EXCEPTION = new NoImageException(ErrorCode.NO_IMAGE); + public static final NoImageException EXCEPTION = new NoImageException(ErrorCode.NO_IMAGE); - public NoImageException(ErrorCode errorCode) { - super(errorCode); - } -} \ No newline at end of file + public NoImageException(ErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/image/presentation/FileStorageProperties.java b/src/main/java/com/project/bumawiki/domain/image/presentation/FileStorageProperties.java index 61f02861..5c0729e9 100644 --- a/src/main/java/com/project/bumawiki/domain/image/presentation/FileStorageProperties.java +++ b/src/main/java/com/project/bumawiki/domain/image/presentation/FileStorageProperties.java @@ -1,14 +1,13 @@ package com.project.bumawiki.domain.image.presentation; -import lombok.AllArgsConstructor; +import org.springframework.boot.context.properties.ConfigurationProperties; + import lombok.Getter; import lombok.RequiredArgsConstructor; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; @Getter @RequiredArgsConstructor @ConfigurationProperties(prefix = "image") public class FileStorageProperties { - private final String path; -} \ No newline at end of file + private final String path; +} diff --git a/src/main/java/com/project/bumawiki/domain/image/service/ImageService.java b/src/main/java/com/project/bumawiki/domain/image/service/ImageService.java index 54d50ac2..4b0839fb 100644 --- a/src/main/java/com/project/bumawiki/domain/image/service/ImageService.java +++ b/src/main/java/com/project/bumawiki/domain/image/service/ImageService.java @@ -1,12 +1,5 @@ package com.project.bumawiki.domain.image.service; -import com.project.bumawiki.domain.image.exception.NoImageException; -import org.springframework.core.io.Resource; -import org.springframework.core.io.UrlResource; -import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; -import org.springframework.web.multipart.MultipartFile; - import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; @@ -17,64 +10,72 @@ import java.security.SecureRandom; import java.util.ArrayList; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import com.project.bumawiki.domain.image.exception.NoImageException; + @Service public class ImageService { - private static final String uploadPath = "/home/insert/Desktop/image/"; + private static final String uploadPath = "/home/insert/Desktop/image/"; - private static String getRandomStr() { - int leftLimit = 97; // letter 'a' - int rightLimit = 122; // letter 'z' - int targetStringLength = 10; - SecureRandom random = new SecureRandom(); - String generatedString = random.ints(leftLimit, rightLimit + 1) - .limit(targetStringLength) - .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) - .toString(); - System.out.println("random : " + generatedString); - return generatedString; - } + private static String getRandomStr() { + int leftLimit = 97; // letter 'a' + int rightLimit = 122; // letter 'z' + int targetStringLength = 10; + SecureRandom random = new SecureRandom(); + String generatedString = random.ints(leftLimit, rightLimit + 1) + .limit(targetStringLength) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + System.out.println("random : " + generatedString); + return generatedString; + } - public String saveFile(MultipartFile file, String userName) throws IOException { + public String saveFile(MultipartFile file, String userName) throws IOException { - String randomStr = getRandomStr(); - String fileName = randomStr + StringUtils.cleanPath(file.getOriginalFilename()); + String randomStr = getRandomStr(); + String fileName = randomStr + StringUtils.cleanPath(file.getOriginalFilename()); - Path uploadPath = Paths.get(ImageService.uploadPath + userName); - if (!Files.exists(uploadPath)) { - Files.createDirectories(uploadPath); - } + Path uploadPath = Paths.get(ImageService.uploadPath + userName); + if (!Files.exists(uploadPath)) { + Files.createDirectories(uploadPath); + } - try (InputStream inputStream = file.getInputStream()) { - Path filePath = uploadPath.resolve(fileName); - Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING); - return fileName; - } catch (IOException ioe) { - throw new IOException("Could not save image file: " + fileName, ioe); - } - } + try (InputStream inputStream = file.getInputStream()) { + Path filePath = uploadPath.resolve(fileName); + Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING); + return fileName; + } catch (IOException ioe) { + throw new IOException("Could not save image file: " + fileName, ioe); + } + } - public ArrayList GetFileUrl(MultipartFile[] files, String DocsName) throws IOException { - ArrayList ImageUrl = new ArrayList<>(); - for (MultipartFile file : files) { - String fileName = saveFile(file, DocsName); - ImageUrl.add("<>"); - } - return ImageUrl; - } + public ArrayList getFileUrl(MultipartFile[] files, String docsName) throws IOException { + ArrayList imageUrl = new ArrayList<>(); + for (MultipartFile file : files) { + String fileName = saveFile(file, docsName); + imageUrl.add("<>"); + } + return imageUrl; + } - public Resource loadFileAsResource(String DocsName, String fileName) { - Path uploadPath = Paths.get(ImageService.uploadPath, DocsName); - try { - Path filePath = uploadPath.resolve(fileName).normalize(); - Resource resource = new UrlResource(filePath.toUri()); - if (resource.exists()) { - return resource; - } else { - throw NoImageException.EXCEPTION; - } - } catch (MalformedURLException ex) { - System.out.println(DocsName + "/" + fileName); - throw NoImageException.EXCEPTION; - } - } + public Resource loadFileAsResource(String docsName, String fileName) { + Path uploadPath = Paths.get(ImageService.uploadPath, docsName); + try { + Path filePath = uploadPath.resolve(fileName).normalize(); + Resource resource = new UrlResource(filePath.toUri()); + if (resource.exists()) { + return resource; + } else { + throw NoImageException.EXCEPTION; + } + } catch (MalformedURLException ex) { + System.out.println(docsName + "/" + fileName); + throw NoImageException.EXCEPTION; + } + } } diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/domain/ThumbsUp.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/domain/ThumbsUp.java deleted file mode 100644 index fb98359f..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/domain/ThumbsUp.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.domain; - -import com.project.bumawiki.domain.docs.domain.Docs; -import com.project.bumawiki.domain.thumbsUp.presentation.dto.ThumbsUpResponseDto; -import com.project.bumawiki.domain.user.domain.User; -import lombok.*; - -import jakarta.persistence.*; -import java.util.Objects; - -@Entity -@Builder -@Getter -@AllArgsConstructor(access = AccessLevel.PRIVATE) -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ThumbsUp { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "thumbs_up_id") - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "docs_id") - private Docs docs; - - public boolean doesUserThumbsUp(User user) { - return this.user.equals(user); - } - - public boolean doYouThumbsUp(Docs docs) { - return this.docs.equals(docs); - } - - public boolean equals(ThumbsUp thumbsUp) { - return Objects.equals(user, thumbsUp.getUser()) && - Objects.equals(docs, thumbsUp.docs); - } - - public ThumbsUpResponseDto getDto() { - return new ThumbsUpResponseDto(docs); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/domain/repository/CustomThumbsUpRepository.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/domain/repository/CustomThumbsUpRepository.java deleted file mode 100644 index 4cf6a474..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/domain/repository/CustomThumbsUpRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.domain.repository; - -import com.project.bumawiki.domain.thumbsUp.presentation.dto.ThumbsUpResponseDto; -import com.project.bumawiki.domain.user.domain.User; - -import java.util.List; - -public interface CustomThumbsUpRepository { - List getUserThumbsUp(User user); -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/domain/repository/CustomThumbsUpRepositoryImpl.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/domain/repository/CustomThumbsUpRepositoryImpl.java deleted file mode 100644 index 21e0e154..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/domain/repository/CustomThumbsUpRepositoryImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.domain.repository; - -import com.project.bumawiki.domain.thumbsUp.presentation.dto.ThumbsUpResponseDto; -import com.project.bumawiki.domain.user.domain.User; -import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.List; - -import static com.project.bumawiki.domain.docs.domain.QDocs.docs; -import static com.project.bumawiki.domain.thumbsUp.domain.QThumbsUp.thumbsUp; -import static com.querydsl.core.types.Projections.constructor; - -@Repository -@RequiredArgsConstructor -public class CustomThumbsUpRepositoryImpl implements CustomThumbsUpRepository { - - private final JPAQueryFactory jpaQueryFactory; - - @Override - public List getUserThumbsUp(User user) { - return jpaQueryFactory - .select(constructor(ThumbsUpResponseDto.class, docs)) - .from(thumbsUp) - .leftJoin(thumbsUp.docs, docs) - .where(thumbsUp.user.eq(user)) - .distinct() - .fetch(); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/exception/AlreadyThumbsUpexception.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/exception/AlreadyThumbsUpexception.java deleted file mode 100644 index 19fed99d..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/exception/AlreadyThumbsUpexception.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.exception; - -import com.project.bumawiki.global.error.exception.BumawikiException; -import com.project.bumawiki.global.error.exception.ErrorCode; - -public class AlreadyThumbsUpexception extends BumawikiException { - - public static final AlreadyThumbsUpexception EXCEPTION = new AlreadyThumbsUpexception(ErrorCode.ALREADY_THUMBS_UP); - - private AlreadyThumbsUpexception(ErrorCode errorCode) { - super(errorCode); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/exception/NoDocsYouThumbsUpException.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/exception/NoDocsYouThumbsUpException.java deleted file mode 100644 index 601151c5..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/exception/NoDocsYouThumbsUpException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.exception; - -import com.project.bumawiki.global.error.exception.BumawikiException; -import com.project.bumawiki.global.error.exception.ErrorCode; - -public class NoDocsYouThumbsUpException extends BumawikiException { - - public static final NoDocsYouThumbsUpException EXCEPTION = new NoDocsYouThumbsUpException(ErrorCode.NO_DOCS_YOU_THUMBS_UP); - - private NoDocsYouThumbsUpException(ErrorCode errorCode) { - super(errorCode); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/exception/YouDontThumbsUpThisDocs.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/exception/YouDontThumbsUpThisDocs.java deleted file mode 100644 index 61f39ec2..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/exception/YouDontThumbsUpThisDocs.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.exception; - -import com.project.bumawiki.global.error.exception.BumawikiException; -import com.project.bumawiki.global.error.exception.ErrorCode; - -public class YouDontThumbsUpThisDocs extends BumawikiException { - - public static final YouDontThumbsUpThisDocs EXCEPTION = new YouDontThumbsUpThisDocs(ErrorCode.YOU_DONT_THUMBS_UP_THIS_DOCS); - - private YouDontThumbsUpThisDocs(ErrorCode errorCode) { - super(errorCode); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/ThumbsUpManipulateController.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/ThumbsUpManipulateController.java deleted file mode 100644 index 5f7d9572..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/ThumbsUpManipulateController.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.presentation; - -import com.project.bumawiki.domain.thumbsUp.presentation.dto.ThumbsUpRequestDto; -import com.project.bumawiki.domain.thumbsUp.service.ThumbsUpManipulateService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -@RestController -@RequestMapping("api/thumbs/up") -@RequiredArgsConstructor -public class ThumbsUpManipulateController { - - private final ThumbsUpManipulateService likesService; - - @PostMapping("/create") - public ResponseEntity createLike(@RequestBody ThumbsUpRequestDto likeRequestDto) { - likesService.createDocsThumbsUp(likeRequestDto); - - return ResponseEntity.ok().build(); - } - - @DeleteMapping("/delete") - public ResponseEntity removeLike(@RequestBody ThumbsUpRequestDto likeRequestDto) { - likesService.removeLike(likeRequestDto); - - return ResponseEntity.ok().build(); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/dto/ThumbsUpRequestDto.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/dto/ThumbsUpRequestDto.java deleted file mode 100644 index a0b0fc74..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/dto/ThumbsUpRequestDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.presentation.dto; - -import lombok.Getter; - -@Getter -public class ThumbsUpRequestDto { - - private Long docsId; -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/dto/ThumbsUpResponseDto.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/dto/ThumbsUpResponseDto.java deleted file mode 100644 index 8139b2d2..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/dto/ThumbsUpResponseDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.presentation.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.project.bumawiki.domain.docs.domain.Docs; -import com.project.bumawiki.domain.docs.domain.type.DocsType; - -public class ThumbsUpResponseDto { - - @JsonProperty - private final String title; - @JsonProperty - private final DocsType docsType; - - public ThumbsUpResponseDto(Docs docs) { - this.title = docs.getTitle(); - this.docsType = docs.getDocsType(); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/service/ThumbsUpManipulateService.java b/src/main/java/com/project/bumawiki/domain/thumbsUp/service/ThumbsUpManipulateService.java deleted file mode 100644 index 754f7b7c..00000000 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/service/ThumbsUpManipulateService.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.project.bumawiki.domain.thumbsUp.service; - -import com.project.bumawiki.domain.docs.domain.Docs; -import com.project.bumawiki.domain.docs.domain.repository.DocsRepositoryMapper; -import com.project.bumawiki.domain.thumbsUp.domain.ThumbsUp; -import com.project.bumawiki.domain.thumbsUp.presentation.dto.ThumbsUpRequestDto; -import com.project.bumawiki.domain.user.domain.User; -import com.project.bumawiki.domain.user.domain.repository.UserRepository; -import com.project.bumawiki.domain.user.exception.UserNotFoundException; -import com.project.bumawiki.global.error.exception.ErrorCode; -import com.project.bumawiki.global.util.SecurityUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class ThumbsUpManipulateService { - private final DocsRepositoryMapper docsRepositoryMapper; - private final UserRepository userRepository; - - @Transactional - public void createDocsThumbsUp(ThumbsUpRequestDto likeRequestDto) { - User user = getUser(); - Docs foundDocs = getDocs(likeRequestDto); - - addThumbsUp(foundDocs, user); - } - - @Transactional - public void removeLike(ThumbsUpRequestDto likeRequestDto) { - User user = getUser(); - Docs foundDocs = getDocs(likeRequestDto); - - cancelThumbsUp(foundDocs, user); - } - - //Like 추가 - private void addThumbsUp(Docs foundDocs, User user) { - ThumbsUp thumbsUp = createThumbsUp(foundDocs, user); - foundDocs.addThumbsUp(thumbsUp); - user.addThumbsUp(thumbsUp); - } - - //Like 삭제 - private void cancelThumbsUp(Docs foundDocs, User user) { - ThumbsUp thumbsUpToDelete = createThumbsUp(foundDocs, user); - foundDocs.cancelThumbsUp(thumbsUpToDelete); - user.cancelThumbsUp(thumbsUpToDelete); - } - - //Docs, User Like 만들기 - private ThumbsUp createThumbsUp(Docs foundDocs, User user) { - return ThumbsUp.builder() - .docs(foundDocs) - .user(user) - .build(); - } - - //Docs, User 가져오기 - private Docs getDocs(ThumbsUpRequestDto likeRequestDto) { - return docsRepositoryMapper.findById( - likeRequestDto.getDocsId(), - ErrorCode.NO_DOCS_YOU_THUMBS_UP - ); - } - - private User getUser() { - Long userId = SecurityUtil - .getCurrentUserWithLogin() - .getId(); - - return userRepository.findById(userId) - .orElseThrow(() -> UserNotFoundException.EXCEPTION); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/domain/ThumbsUp.java b/src/main/java/com/project/bumawiki/domain/thumbsup/domain/ThumbsUp.java new file mode 100644 index 00000000..623c0bb9 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/domain/ThumbsUp.java @@ -0,0 +1,59 @@ +package com.project.bumawiki.domain.thumbsup.domain; + +import java.util.Objects; + +import com.project.bumawiki.domain.docs.domain.Docs; +import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpResponseDto; +import com.project.bumawiki.domain.user.domain.User; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Builder +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ThumbsUp { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "thumbs_up_id") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "docs_id") + private Docs docs; + + public boolean doesUserThumbsUp(User user) { + return this.user.equals(user); + } + + public boolean doYouThumbsUp(Docs docs) { + return this.docs.equals(docs); + } + + public boolean equals(ThumbsUp thumbsUp) { + return Objects.equals(user, thumbsUp.getUser()) + && Objects.equals(docs, thumbsUp.docs); + } + + public ThumbsUpResponseDto getDto() { + return new ThumbsUpResponseDto(docs); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/domain/repository/CustomThumbsUpRepository.java b/src/main/java/com/project/bumawiki/domain/thumbsup/domain/repository/CustomThumbsUpRepository.java new file mode 100644 index 00000000..bf9e79eb --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/domain/repository/CustomThumbsUpRepository.java @@ -0,0 +1,10 @@ +package com.project.bumawiki.domain.thumbsup.domain.repository; + +import java.util.List; + +import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpResponseDto; +import com.project.bumawiki.domain.user.domain.User; + +public interface CustomThumbsUpRepository { + List getUserThumbsUp(User user); +} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/domain/repository/CustomThumbsUpRepositoryImpl.java b/src/main/java/com/project/bumawiki/domain/thumbsup/domain/repository/CustomThumbsUpRepositoryImpl.java new file mode 100644 index 00000000..9ebf5ac1 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/domain/repository/CustomThumbsUpRepositoryImpl.java @@ -0,0 +1,33 @@ +package com.project.bumawiki.domain.thumbsup.domain.repository; + +import static com.project.bumawiki.domain.docs.domain.QDocs.*; +import static com.project.bumawiki.domain.thumbsup.domain.QThumbsUp.*; +import static com.querydsl.core.types.Projections.*; + +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpResponseDto; +import com.project.bumawiki.domain.user.domain.User; +import com.querydsl.jpa.impl.JPAQueryFactory; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class CustomThumbsUpRepositoryImpl implements CustomThumbsUpRepository { + + private final JPAQueryFactory jpaQueryFactory; + + @Override + public List getUserThumbsUp(User user) { + return jpaQueryFactory + .select(constructor(ThumbsUpResponseDto.class, docs)) + .from(thumbsUp) + .leftJoin(thumbsUp.docs, docs) + .where(thumbsUp.user.eq(user)) + .distinct() + .fetch(); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/exception/AlreadyThumbsUpException.java b/src/main/java/com/project/bumawiki/domain/thumbsup/exception/AlreadyThumbsUpException.java new file mode 100644 index 00000000..bd572248 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/exception/AlreadyThumbsUpException.java @@ -0,0 +1,13 @@ +package com.project.bumawiki.domain.thumbsup.exception; + +import com.project.bumawiki.global.error.exception.BumawikiException; +import com.project.bumawiki.global.error.exception.ErrorCode; + +public class AlreadyThumbsUpException extends BumawikiException { + + public static final AlreadyThumbsUpException EXCEPTION = new AlreadyThumbsUpException(ErrorCode.ALREADY_THUMBS_UP); + + private AlreadyThumbsUpException(ErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/exception/NoDocsYouThumbsUpException.java b/src/main/java/com/project/bumawiki/domain/thumbsup/exception/NoDocsYouThumbsUpException.java new file mode 100644 index 00000000..5bd2db35 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/exception/NoDocsYouThumbsUpException.java @@ -0,0 +1,14 @@ +package com.project.bumawiki.domain.thumbsup.exception; + +import com.project.bumawiki.global.error.exception.BumawikiException; +import com.project.bumawiki.global.error.exception.ErrorCode; + +public class NoDocsYouThumbsUpException extends BumawikiException { + + public static final NoDocsYouThumbsUpException EXCEPTION = new NoDocsYouThumbsUpException( + ErrorCode.NO_DOCS_YOU_THUMBS_UP); + + private NoDocsYouThumbsUpException(ErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/exception/YouDontThumbsUpThisDocs.java b/src/main/java/com/project/bumawiki/domain/thumbsup/exception/YouDontThumbsUpThisDocs.java new file mode 100644 index 00000000..96cfd966 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/exception/YouDontThumbsUpThisDocs.java @@ -0,0 +1,14 @@ +package com.project.bumawiki.domain.thumbsup.exception; + +import com.project.bumawiki.global.error.exception.BumawikiException; +import com.project.bumawiki.global.error.exception.ErrorCode; + +public class YouDontThumbsUpThisDocs extends BumawikiException { + + public static final YouDontThumbsUpThisDocs EXCEPTION = new YouDontThumbsUpThisDocs( + ErrorCode.YOU_DONT_THUMBS_UP_THIS_DOCS); + + private YouDontThumbsUpThisDocs(ErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/ThumbsUpInformationController.java b/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/ThumbsUpInformationController.java similarity index 50% rename from src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/ThumbsUpInformationController.java rename to src/main/java/com/project/bumawiki/domain/thumbsup/presentation/ThumbsUpInformationController.java index f32ff14a..bc2326a3 100644 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/presentation/ThumbsUpInformationController.java +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/ThumbsUpInformationController.java @@ -1,23 +1,25 @@ -package com.project.bumawiki.domain.thumbsUp.presentation; +package com.project.bumawiki.domain.thumbsup.presentation; + +import java.util.List; -import com.project.bumawiki.domain.thumbsUp.presentation.dto.ThumbsUpResponseDto; -import com.project.bumawiki.domain.thumbsUp.service.ThumbsUpInformationService; -import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; +import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpResponseDto; +import com.project.bumawiki.domain.thumbsup.service.ThumbsUpInformationService; + +import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @RequestMapping("/api/thumbs/up") @RestController public class ThumbsUpInformationController { - private final ThumbsUpInformationService thumbsUpInformationService; + private final ThumbsUpInformationService thumbsUpInformationService; - @GetMapping("/get") - public ResponseEntity> getThumbsUp() { - return ResponseEntity.ok(thumbsUpInformationService.getThumbsUpList()); - } + @GetMapping("/get") + public ResponseEntity> getThumbsUp() { + return ResponseEntity.ok(thumbsUpInformationService.getThumbsUpList()); + } } diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/ThumbsUpManipulateController.java b/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/ThumbsUpManipulateController.java new file mode 100644 index 00000000..e6d94ee1 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/ThumbsUpManipulateController.java @@ -0,0 +1,35 @@ +package com.project.bumawiki.domain.thumbsup.presentation; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpRequestDto; +import com.project.bumawiki.domain.thumbsup.service.ThumbsUpManipulateService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("api/thumbs/up") +@RequiredArgsConstructor +public class ThumbsUpManipulateController { + + private final ThumbsUpManipulateService likesService; + + @PostMapping("/create") + public ResponseEntity createLike(@RequestBody ThumbsUpRequestDto likeRequestDto) { + likesService.createDocsThumbsUp(likeRequestDto); + + return ResponseEntity.ok().build(); + } + + @DeleteMapping("/delete") + public ResponseEntity removeLike(@RequestBody ThumbsUpRequestDto likeRequestDto) { + likesService.removeLike(likeRequestDto); + + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/dto/ThumbsUpRequestDto.java b/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/dto/ThumbsUpRequestDto.java new file mode 100644 index 00000000..2d242e47 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/dto/ThumbsUpRequestDto.java @@ -0,0 +1,9 @@ +package com.project.bumawiki.domain.thumbsup.presentation.dto; + +import lombok.Getter; + +@Getter +public class ThumbsUpRequestDto { + + private Long docsId; +} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/dto/ThumbsUpResponseDto.java b/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/dto/ThumbsUpResponseDto.java new file mode 100644 index 00000000..815b0178 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/presentation/dto/ThumbsUpResponseDto.java @@ -0,0 +1,18 @@ +package com.project.bumawiki.domain.thumbsup.presentation.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.project.bumawiki.domain.docs.domain.Docs; +import com.project.bumawiki.domain.docs.domain.type.DocsType; + +public class ThumbsUpResponseDto { + + @JsonProperty + private final String title; + @JsonProperty + private final DocsType docsType; + + public ThumbsUpResponseDto(Docs docs) { + this.title = docs.getTitle(); + this.docsType = docs.getDocsType(); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/thumbsUp/service/ThumbsUpInformationService.java b/src/main/java/com/project/bumawiki/domain/thumbsup/service/ThumbsUpInformationService.java similarity index 50% rename from src/main/java/com/project/bumawiki/domain/thumbsUp/service/ThumbsUpInformationService.java rename to src/main/java/com/project/bumawiki/domain/thumbsup/service/ThumbsUpInformationService.java index e6843f11..093000b8 100644 --- a/src/main/java/com/project/bumawiki/domain/thumbsUp/service/ThumbsUpInformationService.java +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/service/ThumbsUpInformationService.java @@ -1,26 +1,28 @@ -package com.project.bumawiki.domain.thumbsUp.service; +package com.project.bumawiki.domain.thumbsup.service; + +import java.util.List; -import com.project.bumawiki.domain.thumbsUp.domain.repository.CustomThumbsUpRepository; -import com.project.bumawiki.domain.thumbsUp.presentation.dto.ThumbsUpResponseDto; -import com.project.bumawiki.domain.user.domain.User; -import com.project.bumawiki.global.util.SecurityUtil; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; +import com.project.bumawiki.domain.thumbsup.domain.repository.CustomThumbsUpRepository; +import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpResponseDto; +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.global.util.SecurityUtil; + +import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class ThumbsUpInformationService { - private final CustomThumbsUpRepository customThumbsUpRepository; + private final CustomThumbsUpRepository customThumbsUpRepository; - public List getThumbsUpList() { - User user = SecurityUtil.getCurrentUserOrNotLogin(); + public List getThumbsUpList() { + User user = SecurityUtil.getCurrentUserOrNotLogin(); - return customThumbsUpRepository.getUserThumbsUp(user); - } + return customThumbsUpRepository.getUserThumbsUp(user); + } } diff --git a/src/main/java/com/project/bumawiki/domain/thumbsup/service/ThumbsUpManipulateService.java b/src/main/java/com/project/bumawiki/domain/thumbsup/service/ThumbsUpManipulateService.java new file mode 100644 index 00000000..22811831 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/thumbsup/service/ThumbsUpManipulateService.java @@ -0,0 +1,78 @@ +package com.project.bumawiki.domain.thumbsup.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.project.bumawiki.domain.docs.domain.Docs; +import com.project.bumawiki.domain.docs.domain.repository.DocsRepositoryMapper; +import com.project.bumawiki.domain.thumbsup.domain.ThumbsUp; +import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpRequestDto; +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.domain.user.domain.repository.UserRepository; +import com.project.bumawiki.domain.user.exception.UserNotFoundException; +import com.project.bumawiki.global.error.exception.ErrorCode; +import com.project.bumawiki.global.util.SecurityUtil; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ThumbsUpManipulateService { + private final DocsRepositoryMapper docsRepositoryMapper; + private final UserRepository userRepository; + + @Transactional + public void createDocsThumbsUp(ThumbsUpRequestDto likeRequestDto) { + User user = getUser(); + Docs foundDocs = getDocs(likeRequestDto); + + addThumbsUp(foundDocs, user); + } + + @Transactional + public void removeLike(ThumbsUpRequestDto likeRequestDto) { + User user = getUser(); + Docs foundDocs = getDocs(likeRequestDto); + + cancelThumbsUp(foundDocs, user); + } + + //Like 추가 + private void addThumbsUp(Docs foundDocs, User user) { + ThumbsUp thumbsUp = createThumbsUp(foundDocs, user); + foundDocs.addThumbsUp(thumbsUp); + user.addThumbsUp(thumbsUp); + } + + //Like 삭제 + private void cancelThumbsUp(Docs foundDocs, User user) { + ThumbsUp thumbsUpToDelete = createThumbsUp(foundDocs, user); + foundDocs.cancelThumbsUp(thumbsUpToDelete); + user.cancelThumbsUp(thumbsUpToDelete); + } + + //Docs, User Like 만들기 + private ThumbsUp createThumbsUp(Docs foundDocs, User user) { + return ThumbsUp.builder() + .docs(foundDocs) + .user(user) + .build(); + } + + //Docs, User 가져오기 + private Docs getDocs(ThumbsUpRequestDto likeRequestDto) { + return docsRepositoryMapper.findById( + likeRequestDto.getDocsId(), + ErrorCode.NO_DOCS_YOU_THUMBS_UP + ); + } + + private User getUser() { + Long userId = SecurityUtil + .getCurrentUserWithLogin() + .getId(); + + return userRepository.findById(userId) + .orElseThrow(() -> UserNotFoundException.EXCEPTION); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/user/UserFacade.java b/src/main/java/com/project/bumawiki/domain/user/UserFacade.java index 93899369..960c1b5d 100644 --- a/src/main/java/com/project/bumawiki/domain/user/UserFacade.java +++ b/src/main/java/com/project/bumawiki/domain/user/UserFacade.java @@ -1,29 +1,31 @@ package com.project.bumawiki.domain.user; +import org.springframework.stereotype.Component; + import com.project.bumawiki.domain.user.domain.User; import com.project.bumawiki.domain.user.domain.repository.UserRepository; import com.project.bumawiki.domain.user.exception.UserNotFoundException; import com.project.bumawiki.domain.user.exception.UserNotLoginException; import com.project.bumawiki.global.util.SecurityUtil; + import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class UserFacade { - private final UserRepository userRepository; + private final UserRepository userRepository; - public User getCurrentUser() { - User currentUserWithLogin = SecurityUtil - .getCurrentUserOrNotLogin(); + public User getCurrentUser() { + User currentUserWithLogin = SecurityUtil + .getCurrentUserOrNotLogin(); - return userRepository - .findById(currentUserWithLogin.getId()) - .orElseThrow(() -> UserNotLoginException.EXCEPTION); - } + return userRepository + .findById(currentUserWithLogin.getId()) + .orElseThrow(() -> UserNotLoginException.EXCEPTION); + } - public User getUserByEmail(String email) { - return userRepository.findByEmail(email) - .orElseThrow(() -> UserNotFoundException.EXCEPTION); - } + public User getUserByEmail(String email) { + return userRepository.findByEmail(email) + .orElseThrow(() -> UserNotFoundException.EXCEPTION); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/domain/User.java b/src/main/java/com/project/bumawiki/domain/user/domain/User.java index c21b7295..ae98f04a 100644 --- a/src/main/java/com/project/bumawiki/domain/user/domain/User.java +++ b/src/main/java/com/project/bumawiki/domain/user/domain/User.java @@ -5,10 +5,10 @@ import java.util.stream.Collectors; import com.project.bumawiki.domain.contribute.domain.Contribute; -import com.project.bumawiki.domain.thumbsUp.domain.ThumbsUp; -import com.project.bumawiki.domain.thumbsUp.exception.AlreadyThumbsUpexception; -import com.project.bumawiki.domain.thumbsUp.exception.YouDontThumbsUpThisDocs; -import com.project.bumawiki.domain.thumbsUp.presentation.dto.ThumbsUpResponseDto; +import com.project.bumawiki.domain.thumbsup.domain.ThumbsUp; +import com.project.bumawiki.domain.thumbsup.exception.AlreadyThumbsUpException; +import com.project.bumawiki.domain.thumbsup.exception.YouDontThumbsUpThisDocs; +import com.project.bumawiki.domain.thumbsup.presentation.dto.ThumbsUpResponseDto; import com.project.bumawiki.domain.user.domain.authority.Authority; import jakarta.persistence.CascadeType; @@ -34,39 +34,32 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class User { + @OneToMany( + mappedBy = "user", + fetch = FetchType.LAZY, + cascade = CascadeType.ALL, + orphanRemoval = true) + @Builder.Default + private final List thumbsUps = new ArrayList<>(); @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_id") private Long id; - @Column(unique = true, length = 32) private String email; - @Column(length = 16) private String name; - @Column(length = 8) private Integer enroll; - @Column(length = 20) private String nickName; - @Enumerated(EnumType.STRING) @Column(length = 16) private Authority authority; - @Builder.Default @OneToMany(mappedBy = "contributor", cascade = CascadeType.ALL) private List contributeDocs = new ArrayList<>(); - @OneToMany( - mappedBy = "user", - fetch = FetchType.LAZY, - cascade = CascadeType.ALL, - orphanRemoval = true) - @Builder.Default - private final List thumbsUps = new ArrayList<>(); - public void cancelThumbsUp(ThumbsUp thumbsUp) { boolean removed = thumbsUps .removeIf(thumbsUp::equals); @@ -82,7 +75,7 @@ public void addThumbsUp(ThumbsUp thumbsUp) { .anyMatch(iterThumbsUp -> iterThumbsUp.equals(thumbsUp)); if (anyMatch) { - throw AlreadyThumbsUpexception.EXCEPTION; + throw AlreadyThumbsUpException.EXCEPTION; } this.thumbsUps.add(thumbsUp); } diff --git a/src/main/java/com/project/bumawiki/domain/user/domain/authority/Authority.java b/src/main/java/com/project/bumawiki/domain/user/domain/authority/Authority.java index ab4c7473..f9b42094 100644 --- a/src/main/java/com/project/bumawiki/domain/user/domain/authority/Authority.java +++ b/src/main/java/com/project/bumawiki/domain/user/domain/authority/Authority.java @@ -1,5 +1,5 @@ package com.project.bumawiki.domain.user.domain.authority; public enum Authority { - USER, ADMIN, BANNED + USER, ADMIN, BANNED } diff --git a/src/main/java/com/project/bumawiki/domain/user/domain/repository/UserRepositoryMapper.java b/src/main/java/com/project/bumawiki/domain/user/domain/repository/UserRepositoryMapper.java index ce71a07f..a4f4e2bd 100644 --- a/src/main/java/com/project/bumawiki/domain/user/domain/repository/UserRepositoryMapper.java +++ b/src/main/java/com/project/bumawiki/domain/user/domain/repository/UserRepositoryMapper.java @@ -1,24 +1,26 @@ package com.project.bumawiki.domain.user.domain.repository; +import org.springframework.stereotype.Repository; + import com.project.bumawiki.domain.user.domain.User; import com.project.bumawiki.domain.user.exception.UserNotFoundException; + import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; @Repository @RequiredArgsConstructor public class UserRepositoryMapper { - private final UserRepository userRepository; + private final UserRepository userRepository; - public User getByEmail(final String email) { - return userRepository.findByEmail(email) - .orElseThrow(() -> UserNotFoundException.EXCEPTION); - } + public User getByEmail(final String email) { + return userRepository.findByEmail(email) + .orElseThrow(() -> UserNotFoundException.EXCEPTION); + } - public User getById(final Long userId) { - return userRepository.findById(userId) - .orElseThrow(() -> UserNotFoundException.EXCEPTION); - } + public User getById(final Long userId) { + return userRepository.findById(userId) + .orElseThrow(() -> UserNotFoundException.EXCEPTION); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/exception/UserNotFoundException.java b/src/main/java/com/project/bumawiki/domain/user/exception/UserNotFoundException.java index 61b31529..3a42e2a1 100644 --- a/src/main/java/com/project/bumawiki/domain/user/exception/UserNotFoundException.java +++ b/src/main/java/com/project/bumawiki/domain/user/exception/UserNotFoundException.java @@ -5,9 +5,9 @@ public class UserNotFoundException extends BumawikiException { - public static final UserNotFoundException EXCEPTION = new UserNotFoundException(ErrorCode.USER_NOT_FOUND); + public static final UserNotFoundException EXCEPTION = new UserNotFoundException(ErrorCode.USER_NOT_FOUND); - public UserNotFoundException(ErrorCode errorCode) { - super(errorCode); - } + public UserNotFoundException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/exception/UserNotLoginException.java b/src/main/java/com/project/bumawiki/domain/user/exception/UserNotLoginException.java index c641880b..b8f3ecb5 100644 --- a/src/main/java/com/project/bumawiki/domain/user/exception/UserNotLoginException.java +++ b/src/main/java/com/project/bumawiki/domain/user/exception/UserNotLoginException.java @@ -5,9 +5,9 @@ public class UserNotLoginException extends BumawikiException { - public static final UserNotFoundException EXCEPTION = new UserNotFoundException(ErrorCode.USER_NOT_LOGIN); + public static final UserNotFoundException EXCEPTION = new UserNotFoundException(ErrorCode.USER_NOT_LOGIN); - public UserNotLoginException(ErrorCode errorCode) { - super(errorCode); - } + public UserNotLoginException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/UserAuthorityController.java b/src/main/java/com/project/bumawiki/domain/user/presentation/UserAuthorityController.java index fb9af90a..3bdef9dd 100644 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/UserAuthorityController.java +++ b/src/main/java/com/project/bumawiki/domain/user/presentation/UserAuthorityController.java @@ -1,25 +1,27 @@ package com.project.bumawiki.domain.user.presentation; -import com.project.bumawiki.domain.user.domain.authority.Authority; -import com.project.bumawiki.domain.user.presentation.dto.UserAuthorityDto; -import com.project.bumawiki.domain.user.service.UserAuthorityService; -import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.project.bumawiki.domain.user.domain.authority.Authority; +import com.project.bumawiki.domain.user.presentation.dto.UserAuthorityDto; +import com.project.bumawiki.domain.user.service.UserAuthorityService; + +import lombok.RequiredArgsConstructor; + @RestController @RequestMapping("/api") @RequiredArgsConstructor public class UserAuthorityController { - private final UserAuthorityService userAuthorityService; + private final UserAuthorityService userAuthorityService; - @PutMapping("/set/authority") - public ResponseEntity setUserAuthority(@RequestBody final UserAuthorityDto userAuthorityDto) { - Authority authority = userAuthorityService.execute(userAuthorityDto); - return ResponseEntity.ok().body(authority); - } + @PutMapping("/set/authority") + public ResponseEntity setUserAuthority(@RequestBody final UserAuthorityDto userAuthorityDto) { + Authority authority = userAuthorityService.execute(userAuthorityDto); + return ResponseEntity.ok().body(authority); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/UserInfoController.java b/src/main/java/com/project/bumawiki/domain/user/presentation/UserInfoController.java index e9308b97..4ac18f2f 100644 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/UserInfoController.java +++ b/src/main/java/com/project/bumawiki/domain/user/presentation/UserInfoController.java @@ -1,9 +1,5 @@ package com.project.bumawiki.domain.user.presentation; -import com.project.bumawiki.domain.user.domain.User; -import com.project.bumawiki.domain.user.presentation.dto.UserResponseDto; -import com.project.bumawiki.domain.user.service.UserInfoService; -import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -11,26 +7,32 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.domain.user.presentation.dto.UserResponseDto; +import com.project.bumawiki.domain.user.service.UserInfoService; + +import lombok.RequiredArgsConstructor; + @Validated @RequiredArgsConstructor @RestController @RequestMapping("/api") public class UserInfoController { - private final UserInfoService userInfoService; - - @GetMapping("/user") - public ResponseEntity findUserInfo() { - User loginUser = userInfoService.getLoginUser(); - UserResponseDto response = new UserResponseDto(loginUser); - return ResponseEntity.ok().body(response); - } - - @GetMapping("/user/id/{id}") - public ResponseEntity findAnotherUserInFo(@PathVariable Long id) { - User foundUser = userInfoService.findAnotherInfo(id); - UserResponseDto response = new UserResponseDto(foundUser); - return ResponseEntity.ok().body(response); - } + private final UserInfoService userInfoService; + + @GetMapping("/user") + public ResponseEntity findUserInfo() { + User loginUser = userInfoService.getLoginUser(); + UserResponseDto response = new UserResponseDto(loginUser); + return ResponseEntity.ok().body(response); + } + + @GetMapping("/user/id/{id}") + public ResponseEntity findAnotherUserInFo(@PathVariable Long id) { + User foundUser = userInfoService.findAnotherInfo(id); + UserResponseDto response = new UserResponseDto(foundUser); + return ResponseEntity.ok().body(response); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/SimpleUserDto.java b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/SimpleUserDto.java index 8f06143b..be052bd6 100644 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/SimpleUserDto.java +++ b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/SimpleUserDto.java @@ -6,13 +6,13 @@ @Getter public class SimpleUserDto { - private Long id; + private final Long id; - private String email; + private final String email; - private String nickName; + private final String nickName; - private String name; + private final String name; public SimpleUserDto(User user) { this.id = user.getId(); diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserAuthorityDto.java b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserAuthorityDto.java index b67b84e2..e79d23bd 100644 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserAuthorityDto.java +++ b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserAuthorityDto.java @@ -1,18 +1,18 @@ package com.project.bumawiki.domain.user.presentation.dto; import com.project.bumawiki.domain.user.domain.authority.Authority; -import lombok.AllArgsConstructor; -import lombok.Getter; import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; @Getter @AllArgsConstructor public class UserAuthorityDto { - @NotNull - private String email; - @NotNull - private Authority authority; + @NotNull + private String email; + @NotNull + private Authority authority; } diff --git a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserResponseDto.java b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserResponseDto.java index 412b2f5b..1b897d9e 100644 --- a/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserResponseDto.java +++ b/src/main/java/com/project/bumawiki/domain/user/presentation/dto/UserResponseDto.java @@ -1,47 +1,48 @@ package com.project.bumawiki.domain.user.presentation.dto; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + import com.project.bumawiki.domain.contribute.domain.Contribute; import com.project.bumawiki.domain.contribute.dto.ContributeResponseDto; import com.project.bumawiki.domain.user.domain.User; import com.project.bumawiki.domain.user.domain.authority.Authority; + import jakarta.validation.constraints.NotNull; import lombok.Getter; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - @Getter public class UserResponseDto { - private Long id; + private final Long id; - private String email; + private final String email; - private String nickName; + private final String nickName; - private String name; + private final String name; - private Authority authority; + private final Authority authority; - private List contributeDocs; + private final List contributeDocs; - public UserResponseDto(User user) { - this.id = user.getId(); - this.email = user.getEmail(); - this.nickName = user.getNickName(); - this.authority = user.getAuthority(); - this.name = user.getName(); - List contributeDocs = getContributeReversed(user); - this.contributeDocs = contributeDocs - .stream() - .map(ContributeResponseDto::new) - .collect(Collectors.toList()); - } + public UserResponseDto(User user) { + this.id = user.getId(); + this.email = user.getEmail(); + this.nickName = user.getNickName(); + this.authority = user.getAuthority(); + this.name = user.getName(); + List contributeDocs = getContributeReversed(user); + this.contributeDocs = contributeDocs + .stream() + .map(ContributeResponseDto::new) + .collect(Collectors.toList()); + } - @NotNull - private static List getContributeReversed(User user) { - List contributeDocs = user.getContributeDocs(); - Collections.reverse(contributeDocs); - return contributeDocs; - } + @NotNull + private static List getContributeReversed(User user) { + List contributeDocs = user.getContributeDocs(); + Collections.reverse(contributeDocs); + return contributeDocs; + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/service/UserAuthorityService.java b/src/main/java/com/project/bumawiki/domain/user/service/UserAuthorityService.java index 52912c48..c6a0e8db 100644 --- a/src/main/java/com/project/bumawiki/domain/user/service/UserAuthorityService.java +++ b/src/main/java/com/project/bumawiki/domain/user/service/UserAuthorityService.java @@ -1,24 +1,25 @@ package com.project.bumawiki.domain.user.service; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import com.project.bumawiki.domain.user.domain.User; import com.project.bumawiki.domain.user.domain.authority.Authority; import com.project.bumawiki.domain.user.domain.repository.UserRepositoryMapper; import com.project.bumawiki.domain.user.presentation.dto.UserAuthorityDto; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor @Transactional public class UserAuthorityService { - private final UserRepositoryMapper userRepositoryMapper; + private final UserRepositoryMapper userRepositoryMapper; - public Authority execute(final UserAuthorityDto userAuthorityDto) { - User user = userRepositoryMapper.getByEmail(userAuthorityDto.getEmail()); - user.changeUserAuthority(userAuthorityDto.getAuthority()); - return user.getAuthority(); - } + public Authority execute(final UserAuthorityDto userAuthorityDto) { + User user = userRepositoryMapper.getByEmail(userAuthorityDto.getEmail()); + user.changeUserAuthority(userAuthorityDto.getAuthority()); + return user.getAuthority(); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/service/UserInfoService.java b/src/main/java/com/project/bumawiki/domain/user/service/UserInfoService.java index c006affd..1aa08f68 100644 --- a/src/main/java/com/project/bumawiki/domain/user/service/UserInfoService.java +++ b/src/main/java/com/project/bumawiki/domain/user/service/UserInfoService.java @@ -4,20 +4,21 @@ import com.project.bumawiki.domain.user.domain.repository.UserRepositoryMapper; import com.project.bumawiki.global.annotation.ServiceWithTransactionalReadOnly; import com.project.bumawiki.global.util.SecurityUtil; + import lombok.RequiredArgsConstructor; @ServiceWithTransactionalReadOnly @RequiredArgsConstructor public class UserInfoService { - private final UserRepositoryMapper userRepositoryMapper; + private final UserRepositoryMapper userRepositoryMapper; - public User getLoginUser() { - Long id = SecurityUtil.getCurrentUserWithLogin().getId(); - return userRepositoryMapper.getById(id); - } + public User getLoginUser() { + Long id = SecurityUtil.getCurrentUserWithLogin().getId(); + return userRepositoryMapper.getById(id); + } - public User findAnotherInfo(Long userId) { - return userRepositoryMapper.getById(userId); - } + public User findAnotherInfo(Long userId) { + return userRepositoryMapper.getById(userId); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/service/UserLoginService.java b/src/main/java/com/project/bumawiki/domain/user/service/UserLoginService.java index 039b513a..5b07f42b 100644 --- a/src/main/java/com/project/bumawiki/domain/user/service/UserLoginService.java +++ b/src/main/java/com/project/bumawiki/domain/user/service/UserLoginService.java @@ -1,5 +1,7 @@ package com.project.bumawiki.domain.user.service; +import java.io.IOException; + import com.project.bumawiki.domain.auth.domain.AuthId; import com.project.bumawiki.domain.auth.domain.repository.AuthIdRepository; import com.project.bumawiki.domain.auth.service.UserSignUpOrUpdateService; @@ -8,34 +10,32 @@ import com.project.bumawiki.global.jwt.dto.TokenResponseDto; import com.project.bumawiki.global.jwt.properties.JwtProperties; import com.project.bumawiki.global.jwt.util.JwtProvider; -import lombok.RequiredArgsConstructor; -import java.io.IOException; +import lombok.RequiredArgsConstructor; @ServiceWithTransactionalReadOnly @RequiredArgsConstructor public class UserLoginService { - private final UserSignUpOrUpdateService userSignUpORUpdateService; - private final JwtProvider jwtProvider; - private final JwtProperties jwtProperties; - private final AuthIdRepository authIdRepository; - - - public TokenResponseDto execute(String authId) throws IOException { - - User user = userSignUpORUpdateService.execute(authId); - saveAuthId(user.getEmail()); - - return jwtProvider.generateToken(user.getEmail(), user.getAuthority().name()); - } - - private void saveAuthId(String email) { - authIdRepository.save( - AuthId.builder() - .id(email) - .authId(email) - .ttl(jwtProperties.getRefreshExp()) - .build() - ); - } + private final UserSignUpOrUpdateService userSignUpOrUpdateService; + private final JwtProvider jwtProvider; + private final JwtProperties jwtProperties; + private final AuthIdRepository authIdRepository; + + public TokenResponseDto execute(String authId) throws IOException { + + User user = userSignUpOrUpdateService.execute(authId); + saveAuthId(user.getEmail()); + + return jwtProvider.generateToken(user.getEmail(), user.getAuthority().name()); + } + + private void saveAuthId(String email) { + authIdRepository.save( + AuthId.builder() + .id(email) + .authId(email) + .ttl(jwtProperties.getRefreshExp()) + .build() + ); + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/service/UserLogoutService.java b/src/main/java/com/project/bumawiki/domain/user/service/UserLogoutService.java index 07f4bd9a..04efbd60 100644 --- a/src/main/java/com/project/bumawiki/domain/user/service/UserLogoutService.java +++ b/src/main/java/com/project/bumawiki/domain/user/service/UserLogoutService.java @@ -1,38 +1,36 @@ package com.project.bumawiki.domain.user.service; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import com.project.bumawiki.domain.auth.domain.repository.AuthIdRepository; import com.project.bumawiki.domain.auth.domain.repository.RefreshTokenRepository; import com.project.bumawiki.global.jwt.properties.JwtConstants; import com.project.bumawiki.global.jwt.util.JwtUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Service public class UserLogoutService { - private final JwtUtil jwtUtil; - private final AuthIdRepository authIdRepository; - private final RefreshTokenRepository refreshTokenRepository; - - - @Transactional - public String execute(String bearerRefreshToken) { - String authId = jwtUtil.getJwtBody(bearerRefreshToken).get(JwtConstants.AUTH_ID.message).toString(); - + private final JwtUtil jwtUtil; + private final AuthIdRepository authIdRepository; + private final RefreshTokenRepository refreshTokenRepository; - authIdRepository.findByAuthId(authId) - .ifPresent(authIdRepository::delete); + @Transactional + public String execute(String bearerRefreshToken) { + String authId = jwtUtil.getJwtBody(bearerRefreshToken).get(JwtConstants.AUTH_ID.message).toString(); + authIdRepository.findByAuthId(authId) + .ifPresent(authIdRepository::delete); - refreshTokenRepository.findById(authId) - .ifPresent(refreshTokenRepository::delete); + refreshTokenRepository.findById(authId) + .ifPresent(refreshTokenRepository::delete); - SecurityContextHolder.clearContext(); + SecurityContextHolder.clearContext(); - return authId; - } + return authId; + } } diff --git a/src/main/java/com/project/bumawiki/domain/user/service/UserService.java b/src/main/java/com/project/bumawiki/domain/user/service/UserService.java index 12093ebb..4c61935b 100644 --- a/src/main/java/com/project/bumawiki/domain/user/service/UserService.java +++ b/src/main/java/com/project/bumawiki/domain/user/service/UserService.java @@ -5,22 +5,23 @@ import com.project.bumawiki.global.annotation.ServiceWithTransactionalReadOnly; import com.project.bumawiki.global.jwt.properties.JwtConstants; import com.project.bumawiki.global.jwt.util.JwtUtil; + import lombok.RequiredArgsConstructor; @ServiceWithTransactionalReadOnly @RequiredArgsConstructor public class UserService { - private final JwtUtil jwtUtil; - private final AuthIdRepository authIdRepository; + private final JwtUtil jwtUtil; + private final AuthIdRepository authIdRepository; - public String checkIsLoginUser(String bearer) { - String authId = jwtUtil.getJwtBody(bearer).get(JwtConstants.AUTH_ID.message).toString(); + public String checkIsLoginUser(String bearer) { + String authId = jwtUtil.getJwtBody(bearer).get(JwtConstants.AUTH_ID.message).toString(); - authIdRepository.findByAuthId(authId) - .orElseThrow(() -> UserNotLoginException.EXCEPTION); + authIdRepository.findByAuthId(authId) + .orElseThrow(() -> UserNotLoginException.EXCEPTION); - return authId; - } + return authId; + } } diff --git a/src/main/java/com/project/bumawiki/global/annotation/ServiceWithTransactionalReadOnly.java b/src/main/java/com/project/bumawiki/global/annotation/ServiceWithTransactionalReadOnly.java index 5e375b0d..d5bcc0e9 100644 --- a/src/main/java/com/project/bumawiki/global/annotation/ServiceWithTransactionalReadOnly.java +++ b/src/main/java/com/project/bumawiki/global/annotation/ServiceWithTransactionalReadOnly.java @@ -1,13 +1,13 @@ package com.project.bumawiki.global.annotation; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.*; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Target(TYPE) @Retention(RUNTIME) diff --git a/src/main/java/com/project/bumawiki/global/config/p6spy/P6SpySqlFormatter.java b/src/main/java/com/project/bumawiki/global/config/p6spy/P6SpySqlFormatter.java index 5944f86c..c0178ce3 100644 --- a/src/main/java/com/project/bumawiki/global/config/p6spy/P6SpySqlFormatter.java +++ b/src/main/java/com/project/bumawiki/global/config/p6spy/P6SpySqlFormatter.java @@ -1,38 +1,41 @@ package com.project.bumawiki.global.config.p6spy; +import java.util.Locale; + +import org.hibernate.engine.jdbc.internal.FormatStyle; +import org.springframework.context.annotation.Configuration; + import com.p6spy.engine.logging.Category; import com.p6spy.engine.spy.P6SpyOptions; import com.p6spy.engine.spy.appender.MessageFormattingStrategy; -import org.hibernate.engine.jdbc.internal.FormatStyle; -import org.springframework.context.annotation.Configuration; import jakarta.annotation.PostConstruct; -import java.util.Locale; @Configuration public class P6SpySqlFormatter implements MessageFormattingStrategy { - @PostConstruct - public void setLogMessageFormat() { - P6SpyOptions.getActiveInstance().setLogMessageFormat(this.getClass().getName()); - } - - @Override - public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { - sql = formatSql(category, sql); - return String.format("[%s] | %d ms | %s", category, elapsed, formatSql(category, sql)); - } - - private String formatSql(String category, String sql) { - if (sql != null && !sql.trim().isEmpty() && Category.STATEMENT.getName().equals(category)) { - String trimmedSQL = sql.trim().toLowerCase(Locale.ROOT); - if (trimmedSQL.startsWith("create") || trimmedSQL.startsWith("alter") || trimmedSQL.startsWith("comment")) { - sql = FormatStyle.DDL.getFormatter().format(sql); - } else { - sql = FormatStyle.BASIC.getFormatter().format(sql); - } - return sql; - } - return sql; - } + @PostConstruct + public void setLogMessageFormat() { + P6SpyOptions.getActiveInstance().setLogMessageFormat(this.getClass().getName()); + } + + @Override + public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, + String sql, String url) { + sql = formatSql(category, sql); + return String.format("[%s] | %d ms | %s", category, elapsed, formatSql(category, sql)); + } + + private String formatSql(String category, String sql) { + if (sql != null && !sql.trim().isEmpty() && Category.STATEMENT.getName().equals(category)) { + String trimmedSql = sql.trim().toLowerCase(Locale.ROOT); + if (trimmedSql.startsWith("create") || trimmedSql.startsWith("alter") || trimmedSql.startsWith("comment")) { + sql = FormatStyle.DDL.getFormatter().format(sql); + } else { + sql = FormatStyle.BASIC.getFormatter().format(sql); + } + return sql; + } + return sql; + } } diff --git a/src/main/java/com/project/bumawiki/global/config/querydsl/QueryDslConfig.java b/src/main/java/com/project/bumawiki/global/config/querydsl/QueryDslConfig.java index c35d7030..aa144e4a 100644 --- a/src/main/java/com/project/bumawiki/global/config/querydsl/QueryDslConfig.java +++ b/src/main/java/com/project/bumawiki/global/config/querydsl/QueryDslConfig.java @@ -1,21 +1,22 @@ package com.project.bumawiki.global.config.querydsl; -import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import com.querydsl.jpa.impl.JPAQueryFactory; + import jakarta.persistence.EntityManager; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; @Configuration @RequiredArgsConstructor(access = AccessLevel.PROTECTED) public class QueryDslConfig { - private final EntityManager em; + private final EntityManager em; - @Bean - public JPAQueryFactory queryFactory() { - return new JPAQueryFactory(em); - } + @Bean + public JPAQueryFactory queryFactory() { + return new JPAQueryFactory(em); + } } diff --git a/src/main/java/com/project/bumawiki/global/config/security/SecurityConfig.java b/src/main/java/com/project/bumawiki/global/config/security/SecurityConfig.java index 999d64c9..6a2cce1b 100644 --- a/src/main/java/com/project/bumawiki/global/config/security/SecurityConfig.java +++ b/src/main/java/com/project/bumawiki/global/config/security/SecurityConfig.java @@ -1,17 +1,7 @@ package com.project.bumawiki.global.config.security; -import static org.springframework.http.HttpMethod.DELETE; -import static org.springframework.http.HttpMethod.GET; -import static org.springframework.http.HttpMethod.POST; -import static org.springframework.http.HttpMethod.PUT; +import static org.springframework.http.HttpMethod.*; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.bumawiki.global.error.CustomAuthenticationEntryPoint; -import com.project.bumawiki.global.error.ExceptionFilter; -import com.project.bumawiki.global.jwt.auth.JwtAuth; -import com.project.bumawiki.global.jwt.auth.JwtFilter; -import com.project.bumawiki.global.jwt.util.JwtUtil; -import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; @@ -23,42 +13,51 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.cors.CorsUtils; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.project.bumawiki.global.error.CustomAuthenticationEntryPoint; +import com.project.bumawiki.global.error.ExceptionFilter; +import com.project.bumawiki.global.jwt.auth.JwtAuth; +import com.project.bumawiki.global.jwt.auth.JwtFilter; +import com.project.bumawiki.global.jwt.util.JwtUtil; + +import lombok.RequiredArgsConstructor; + @Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig { - private final ObjectMapper objectMapper; - private final JwtUtil jwtUtil; - private final JwtAuth jwtAuth; + private final ObjectMapper objectMapper; + private final JwtUtil jwtUtil; + private final JwtAuth jwtAuth; - @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http - .csrf(AbstractHttpConfigurer::disable) - .formLogin(AbstractHttpConfigurer::disable) - .cors(Customizer.withDefaults()) - .sessionManagement( - (sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) - .authorizeHttpRequests(authorize -> authorize - .requestMatchers(CorsUtils::isPreFlightRequest).permitAll() - .requestMatchers(POST, "/api/docs/create").hasAnyAuthority("USER", "ADMIN") - .requestMatchers(PUT, "/api/docs/update/**").hasAnyAuthority("USER", "ADMIN") - .requestMatchers(DELETE, "/api/docs/delete/**").hasAuthority("ADMIN") - .requestMatchers(PUT, "/api/docs/update/title/**").hasAuthority("ADMIN") - .requestMatchers(PUT, "/api/docs/update/docsType").hasAuthority("ADMIN") - //thumbsUp - .requestMatchers(POST, "/api/thumbs/up").hasAnyAuthority("USER", "ADMIN") - .requestMatchers(DELETE, "/api/thumbs/up").hasAnyAuthority("USER", "ADMIN") - .requestMatchers(GET, "/api/thumbs/up").hasAnyAuthority("USER", "ADMIN") - .anyRequest().permitAll() - ) - .exceptionHandling(exceptionHandler -> exceptionHandler.authenticationEntryPoint( - new CustomAuthenticationEntryPoint(objectMapper))) - .addFilterBefore(new JwtFilter(jwtAuth, jwtUtil), UsernamePasswordAuthenticationFilter.class) - .addFilterBefore(new ExceptionFilter(), JwtFilter.class); + http + .csrf(AbstractHttpConfigurer::disable) + .formLogin(AbstractHttpConfigurer::disable) + .cors(Customizer.withDefaults()) + .sessionManagement( + (sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .authorizeHttpRequests(authorize -> authorize + .requestMatchers(CorsUtils::isPreFlightRequest).permitAll() + .requestMatchers(POST, "/api/docs/create").hasAnyAuthority("USER", "ADMIN") + .requestMatchers(PUT, "/api/docs/update/**").hasAnyAuthority("USER", "ADMIN") + .requestMatchers(DELETE, "/api/docs/delete/**").hasAuthority("ADMIN") + .requestMatchers(PUT, "/api/docs/update/title/**").hasAuthority("ADMIN") + .requestMatchers(PUT, "/api/docs/update/docsType").hasAuthority("ADMIN") + //thumbsUp + .requestMatchers(POST, "/api/thumbs/up").hasAnyAuthority("USER", "ADMIN") + .requestMatchers(DELETE, "/api/thumbs/up").hasAnyAuthority("USER", "ADMIN") + .requestMatchers(GET, "/api/thumbs/up").hasAnyAuthority("USER", "ADMIN") + .anyRequest().permitAll() + ) + .exceptionHandling(exceptionHandler -> exceptionHandler.authenticationEntryPoint( + new CustomAuthenticationEntryPoint(objectMapper))) + .addFilterBefore(new JwtFilter(jwtAuth, jwtUtil), UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(new ExceptionFilter(), JwtFilter.class); - return http.build(); - } + return http.build(); + } } diff --git a/src/main/java/com/project/bumawiki/global/config/security/auth/AuthDetails.java b/src/main/java/com/project/bumawiki/global/config/security/auth/AuthDetails.java index 7bc14a1d..a42a4d87 100644 --- a/src/main/java/com/project/bumawiki/global/config/security/auth/AuthDetails.java +++ b/src/main/java/com/project/bumawiki/global/config/security/auth/AuthDetails.java @@ -1,55 +1,57 @@ package com.project.bumawiki.global.config.security.auth; -import com.project.bumawiki.domain.user.domain.User; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import java.util.Collection; +import java.util.Collections; + import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; -import java.util.Collection; -import java.util.Collections; +import com.project.bumawiki.domain.user.domain.User; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Getter public class AuthDetails implements UserDetails { - private final User user; - - @Override - public Collection getAuthorities() { - return Collections.singletonList( - new SimpleGrantedAuthority(user.getAuthority().name()) - ); - } - - @Override - public String getPassword() { - return null; - } - - @Override - public String getUsername() { - return user.getEmail(); - } - - @Override - public boolean isAccountNonExpired() { - return true; - } - - @Override - public boolean isAccountNonLocked() { - return true; - } - - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - @Override - public boolean isEnabled() { - return true; - } + private final User user; + + @Override + public Collection getAuthorities() { + return Collections.singletonList( + new SimpleGrantedAuthority(user.getAuthority().name()) + ); + } + + @Override + public String getPassword() { + return null; + } + + @Override + public String getUsername() { + return user.getEmail(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } } diff --git a/src/main/java/com/project/bumawiki/global/config/security/auth/AuthDetailsService.java b/src/main/java/com/project/bumawiki/global/config/security/auth/AuthDetailsService.java index 25659d1e..a53b51b9 100644 --- a/src/main/java/com/project/bumawiki/global/config/security/auth/AuthDetailsService.java +++ b/src/main/java/com/project/bumawiki/global/config/security/auth/AuthDetailsService.java @@ -1,23 +1,25 @@ package com.project.bumawiki.global.config.security.auth; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + import com.project.bumawiki.domain.user.domain.repository.UserRepository; import com.project.bumawiki.domain.user.exception.UserNotFoundException; import com.project.bumawiki.global.annotation.ServiceWithTransactionalReadOnly; + import lombok.RequiredArgsConstructor; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; @RequiredArgsConstructor @ServiceWithTransactionalReadOnly public class AuthDetailsService implements UserDetailsService { - private final UserRepository userRepository; + private final UserRepository userRepository; - @Override - public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { - return userRepository.findByEmail(email) - .map(AuthDetails::new) - .orElseThrow(() -> UserNotFoundException.EXCEPTION); - } + @Override + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + return userRepository.findByEmail(email) + .map(AuthDetails::new) + .orElseThrow(() -> UserNotFoundException.EXCEPTION); + } } diff --git a/src/main/java/com/project/bumawiki/global/error/CustomAuthenticationEntryPoint.java b/src/main/java/com/project/bumawiki/global/error/CustomAuthenticationEntryPoint.java index 6d427e60..0e84a35f 100644 --- a/src/main/java/com/project/bumawiki/global/error/CustomAuthenticationEntryPoint.java +++ b/src/main/java/com/project/bumawiki/global/error/CustomAuthenticationEntryPoint.java @@ -1,29 +1,32 @@ package com.project.bumawiki.global.error; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.bumawiki.global.error.exception.ErrorCode; -import lombok.RequiredArgsConstructor; +import java.io.IOException; + import org.springframework.http.MediaType; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.project.bumawiki.global.error.exception.ErrorCode; + import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; +import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { - private final ObjectMapper objectMapper; + private final ObjectMapper objectMapper; - @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { - ErrorCode errorCode = ErrorCode.FORBIDDEN; - String errorResponseJson = objectMapper.writeValueAsString( - new ErrorResponse(errorCode.getStatus(), errorCode.getCode(), errorCode.getMessage())); + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, + AuthenticationException authException) throws IOException { + ErrorCode errorCode = ErrorCode.FORBIDDEN; + String errorResponseJson = objectMapper.writeValueAsString( + new ErrorResponse(errorCode.getStatus(), errorCode.getCode(), errorCode.getMessage())); - response.setStatus(errorCode.getStatus()); - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - response.getWriter().write(errorResponseJson); - } + response.setStatus(errorCode.getStatus()); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.getWriter().write(errorResponseJson); + } } diff --git a/src/main/java/com/project/bumawiki/global/error/ErrorResponse.java b/src/main/java/com/project/bumawiki/global/error/ErrorResponse.java index 0e873161..fd0acf96 100644 --- a/src/main/java/com/project/bumawiki/global/error/ErrorResponse.java +++ b/src/main/java/com/project/bumawiki/global/error/ErrorResponse.java @@ -6,15 +6,23 @@ @Getter @AllArgsConstructor public class ErrorResponse { - private int status; - private String code; - private String message; + private final String errorLogsFormat = """ + { + "status": "%s", + "code": "%s", + "message": "%s" + } + """; - public String toString() { - return "{" + - "\n\t\"status\": " + status + "," + - "\n\t\"code\": \" " + code + "\"," + - "\n\t\"message\": \" " + message + "\"" + - "\n}"; - } + private int status; + private String code; + private String message; + + public String toString() { + return errorLogsFormat.formatted( + status, + code, + message + ); + } } diff --git a/src/main/java/com/project/bumawiki/global/error/ExceptionFilter.java b/src/main/java/com/project/bumawiki/global/error/ExceptionFilter.java index ba21e9d8..d0de40bd 100644 --- a/src/main/java/com/project/bumawiki/global/error/ExceptionFilter.java +++ b/src/main/java/com/project/bumawiki/global/error/ExceptionFilter.java @@ -1,43 +1,46 @@ package com.project.bumawiki.global.error; +import java.io.IOException; + +import org.springframework.http.MediaType; +import org.springframework.web.filter.OncePerRequestFilter; + import com.project.bumawiki.global.error.exception.BumawikiException; import com.project.bumawiki.global.error.exception.ErrorCode; + import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.JwtException; -import jakarta.validation.constraints.NotNull; -import org.springframework.http.MediaType; -import org.springframework.web.filter.OncePerRequestFilter; - import jakarta.servlet.FilterChain; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; +import jakarta.validation.constraints.NotNull; public class ExceptionFilter extends OncePerRequestFilter { - @Override - protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain filterChain) throws IOException { - try { - filterChain.doFilter(request, response); - } catch (BumawikiException e) { - writeErrorCode(response, e.getErrorCode()); - } catch (ExpiredJwtException e) { - writeErrorCode(response, ErrorCode.EXPIRED_JWT); - } catch (JwtException e) { - writeErrorCode(response, ErrorCode.INVALID_TOKEN); - } catch (Exception e) { - e.printStackTrace(); - writeErrorCode(response, ErrorCode.INTERNAL_SERVER_ERROR); - } - } + @Override + protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, + @NotNull FilterChain filterChain) throws IOException { + try { + filterChain.doFilter(request, response); + } catch (BumawikiException e) { + writeErrorCode(response, e.getErrorCode()); + } catch (ExpiredJwtException e) { + writeErrorCode(response, ErrorCode.EXPIRED_JWT); + } catch (JwtException e) { + writeErrorCode(response, ErrorCode.INVALID_TOKEN); + } catch (Exception e) { + e.printStackTrace(); + writeErrorCode(response, ErrorCode.INTERNAL_SERVER_ERROR); + } + } - private void writeErrorCode(HttpServletResponse response, ErrorCode errorCode) throws IOException { - ErrorResponse errorResponse = new ErrorResponse( - errorCode.getStatus(), errorCode.getCode(), errorCode.getMessage() - ); + private void writeErrorCode(HttpServletResponse response, ErrorCode errorCode) throws IOException { + ErrorResponse errorResponse = new ErrorResponse( + errorCode.getStatus(), errorCode.getCode(), errorCode.getMessage() + ); - response.setStatus(errorResponse.getStatus()); - response.setCharacterEncoding("UTF-8"); - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - response.getWriter().write(errorResponse.toString()); - } + response.setStatus(errorResponse.getStatus()); + response.setCharacterEncoding("UTF-8"); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.getWriter().write(errorResponse.toString()); + } } diff --git a/src/main/java/com/project/bumawiki/global/error/GlobalExceptionHandler.java b/src/main/java/com/project/bumawiki/global/error/GlobalExceptionHandler.java index 3e57eaa8..4e333dd1 100644 --- a/src/main/java/com/project/bumawiki/global/error/GlobalExceptionHandler.java +++ b/src/main/java/com/project/bumawiki/global/error/GlobalExceptionHandler.java @@ -1,8 +1,8 @@ package com.project.bumawiki.global.error; -import com.project.bumawiki.global.error.exception.BumawikiException; -import com.project.bumawiki.global.error.exception.ErrorCode; -import lombok.extern.slf4j.Slf4j; +import java.util.HashMap; +import java.util.Map; + import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.BindException; @@ -11,69 +11,80 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import com.project.bumawiki.global.error.exception.BumawikiException; +import com.project.bumawiki.global.error.exception.ErrorCode; + import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; -import java.util.HashMap; -import java.util.Map; +import lombok.extern.slf4j.Slf4j; @RestControllerAdvice @Slf4j public class GlobalExceptionHandler { - @ExceptionHandler(BumawikiException.class) - public ResponseEntity handleGlobal(BumawikiException e) { - final ErrorCode errorCode = e.getErrorCode(); - log.error( - "\n" + "{\n" + - "\t\"status\": " + errorCode.getStatus() + "\"," + - "\n\t\"code\": \"" + errorCode.getCode() + "\"," + - "\n\t\"message\": \"" + errorCode.getMessage() + "\"" + - "\n}" - ); - return new ResponseEntity<>( - new ErrorResponse( - errorCode.getStatus(), - errorCode.getCode(), - errorCode.getMessage()), - HttpStatus.valueOf(errorCode.getStatus()) - ); - } + @SuppressWarnings("checkstyle:RegexpSinglelineJava") + private static final String errorLogsFormat = """ + { + "status": "%s", + "code": "%s", + "message": "%s" + } + """; + + @ExceptionHandler(BumawikiException.class) + public ResponseEntity handleGlobal(BumawikiException error) { + final ErrorCode errorCode = error.getErrorCode(); + log.error( + errorLogsFormat.formatted( + errorCode.getStatus(), + errorCode.getCode(), + errorCode.getMessage() + ) + ); + return new ResponseEntity<>( + new ErrorResponse( + errorCode.getStatus(), + errorCode.getCode(), + errorCode.getMessage()), + HttpStatus.valueOf(errorCode.getStatus()) + ); + } - @ExceptionHandler({BindException.class}) - public ResponseEntity bindException(BindException e) { - Map errorMap = new HashMap<>(); + @ExceptionHandler({BindException.class}) + public ResponseEntity bindException(BindException bindException) { + Map errorMap = new HashMap<>(); - for (FieldError error : e.getFieldErrors()) { - errorMap.put(error.getField(), error.getDefaultMessage()); - log.error(error.toString()); - log.error(error.getDefaultMessage()); - } - return new ResponseEntity<>(errorMap, HttpStatus.BAD_REQUEST); - } + for (FieldError error : bindException.getFieldErrors()) { + errorMap.put(error.getField(), error.getDefaultMessage()); + log.error(error.toString()); + log.error(error.getDefaultMessage()); + } + return new ResponseEntity<>(errorMap, HttpStatus.BAD_REQUEST); + } - @ExceptionHandler({ConstraintViolationException.class}) - public ResponseEntity constraintViolationException(ConstraintViolationException e) { - Map errorMap = new HashMap<>(); + @ExceptionHandler({ConstraintViolationException.class}) + public ResponseEntity constraintViolationException(ConstraintViolationException error) { + Map errorMap = new HashMap<>(); - for (ConstraintViolation error : e.getConstraintViolations()) { - errorMap.put("constraint error", error.getMessage()); - log.error(error.toString()); - } + for (ConstraintViolation e : error.getConstraintViolations()) { + errorMap.put("constraint error", e.getMessage()); + log.error(error.toString()); + } - return new ResponseEntity<>(errorMap, HttpStatus.BAD_REQUEST); - } + return new ResponseEntity<>(errorMap, HttpStatus.BAD_REQUEST); + } - @ExceptionHandler(MethodArgumentNotValidException.class) - public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - Map errorMap = new HashMap<>(); + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException error) { + Map errorMap = new HashMap<>(); - String errorMessage = e.getBindingResult() - .getAllErrors() - .get(0) - .getDefaultMessage(); + String errorMessage = error.getBindingResult() + .getAllErrors() + .get(0) + .getDefaultMessage(); - errorMap.put("validation error", errorMessage); + errorMap.put("validation error", errorMessage); - log.error(errorMessage); - return new ResponseEntity<>(errorMap, HttpStatus.BAD_REQUEST); - } + log.error(errorMessage); + return new ResponseEntity<>(errorMap, HttpStatus.BAD_REQUEST); + } } diff --git a/src/main/java/com/project/bumawiki/global/error/exception/BumawikiException.java b/src/main/java/com/project/bumawiki/global/error/exception/BumawikiException.java index f11f7aca..5efc3c55 100644 --- a/src/main/java/com/project/bumawiki/global/error/exception/BumawikiException.java +++ b/src/main/java/com/project/bumawiki/global/error/exception/BumawikiException.java @@ -6,5 +6,5 @@ @RequiredArgsConstructor @Getter public class BumawikiException extends RuntimeException { - private final ErrorCode errorCode; + private final ErrorCode errorCode; } diff --git a/src/main/java/com/project/bumawiki/global/error/exception/ErrorCode.java b/src/main/java/com/project/bumawiki/global/error/exception/ErrorCode.java index b45039ff..959c8c5d 100644 --- a/src/main/java/com/project/bumawiki/global/error/exception/ErrorCode.java +++ b/src/main/java/com/project/bumawiki/global/error/exception/ErrorCode.java @@ -1,6 +1,7 @@ package com.project.bumawiki.global.error.exception; import com.fasterxml.jackson.annotation.JsonFormat; + import lombok.AllArgsConstructor; import lombok.Getter; @@ -9,57 +10,57 @@ @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum ErrorCode { - //Like - ALREADY_THUMBS_UP(400, "THUMBSUP-400-1", "이미 이 문서에 좋아요를 눌렀습니다."), - YOU_DONT_THUMBS_UP_THIS_DOCS(400, "THUMBSUP-400-2", "이 문서에 좋아요를 누르지 않았습니다."), - NO_DOCS_YOU_THUMBS_UP(404, "THUMBSUP-404-1", "좋아요를 누르려는 문서가 없습니다."), + //Like + ALREADY_THUMBS_UP(400, "THUMBSUP-400-1", "이미 이 문서에 좋아요를 눌렀습니다."), + YOU_DONT_THUMBS_UP_THIS_DOCS(400, "THUMBSUP-400-2", "이 문서에 좋아요를 누르지 않았습니다."), + NO_DOCS_YOU_THUMBS_UP(404, "THUMBSUP-404-1", "좋아요를 누르려는 문서가 없습니다."), - //Docs - DOCS_IS_NOT_CONFLICTED(400, "DOCS-400-1", "문서가 충돌나지 않았습니다."), - DOCS_CONFLICTED(400, "DOCS-400-2", "문서가 충돌 상태이기 때문에 수정할 수 없습니다."), - NO_UPDATABLE_DOCS(403, "DOCS-403-1", "없데이트 하려고 하는 문서가 없습니다."), - POST_TITLE_ALREADY_EXIST(403, "DOCS-403-1", "같은 제목의 문서가 이미 존재합니다."), - CANNOT_CHANGE_YOUR_DOCS(403, "DOCS-403-2", "본인의 문서는 수정할 수 없습니다."), - DOCS_NOT_FOUND(404, "DOCS-404-2", "문서를 조회할 수 없습니다."), - DOCS_TYPE_NOT_FOUND(404, "DOCS-404-3", "문서 타입이 존재하지 않습니다."), - VERSION_NOT_EXIST(404, "DOCS-404-4", "문서 버전이 존재하지 않습니다."), - NO_SUCH_VERSION(404, "DOCS-404-5", "문서 버전이 존재하지 않습니다."), + //Docs + DOCS_IS_NOT_CONFLICTED(400, "DOCS-400-1", "문서가 충돌나지 않았습니다."), + DOCS_CONFLICTED(400, "DOCS-400-2", "문서가 충돌 상태이기 때문에 수정할 수 없습니다."), + NO_UPDATABLE_DOCS(403, "DOCS-403-1", "없데이트 하려고 하는 문서가 없습니다."), + POST_TITLE_ALREADY_EXIST(403, "DOCS-403-1", "같은 제목의 문서가 이미 존재합니다."), + CANNOT_CHANGE_YOUR_DOCS(403, "DOCS-403-2", "본인의 문서는 수정할 수 없습니다."), + DOCS_NOT_FOUND(404, "DOCS-404-2", "문서를 조회할 수 없습니다."), + DOCS_TYPE_NOT_FOUND(404, "DOCS-404-3", "문서 타입이 존재하지 않습니다."), + VERSION_NOT_EXIST(404, "DOCS-404-4", "문서 버전이 존재하지 않습니다."), + NO_SUCH_VERSION(404, "DOCS-404-5", "문서 버전이 존재하지 않습니다."), - FORBIDDEN(403, "COMMON-403-1", "Forbidden"), + FORBIDDEN(403, "COMMON-403-1", "Forbidden"), - //User - USER_NOT_LOGIN(403, "USER-403-1", "로그인하지 않았습니다."), - USER_NOT_FOUND(404, "USER-404-1", "사용자를 조회할 수 없습니다."), + //User + USER_NOT_LOGIN(403, "USER-403-1", "로그인하지 않았습니다."), + USER_NOT_FOUND(404, "USER-404-1", "사용자를 조회할 수 없습니다."), - //JWT - INVALID_TOKEN(403, "TOKEN-403-1", "잘못된 토큰으로 접근하였습니다."), - EXPIRED_JWT(403, "TOKEN-403-2", "액세스 토큰이 만료되었습니다."), - REFRESH_TOKEN_EXPIRED(403, "TOKEN-403-3", "리프레시 토큰이 만료되었습니다."), + //JWT + INVALID_TOKEN(403, "TOKEN-403-1", "잘못된 토큰으로 접근하였습니다."), + EXPIRED_JWT(403, "TOKEN-403-2", "액세스 토큰이 만료되었습니다."), + REFRESH_TOKEN_EXPIRED(403, "TOKEN-403-3", "리프레시 토큰이 만료되었습니다."), - //ServerError, - INVALID_ARGUMENT(400, "ARG-400-1", "Arg Is Not Valid"), - BSM_AUTH_INVALID_CLIENT(500, "BSM-500-1", "Bsm Client Is Invalid"), - INTERNAL_SERVER_ERROR(500, "SERVER-500-1", "Internal Server Error"), + //ServerError, + INVALID_ARGUMENT(400, "ARG-400-1", "Arg Is Not Valid"), + BSM_AUTH_INVALID_CLIENT(500, "BSM-500-1", "Bsm Client Is Invalid"), + INTERNAL_SERVER_ERROR(500, "SERVER-500-1", "Internal Server Error"), - //Image, - NO_IMAGE(400, "IMG-400-1", "이미지가 없습니다."), - IMAGE_NOT_FOUND_EXCEPTION(404, "IMG-404-1", "이미지를 조회할 수 없습니다."), - S3_SAVE_EXCEPTION(500,"IMG-500-1" , "S3 Save Exception"), + //Image, + NO_IMAGE(400, "IMG-400-1", "이미지가 없습니다."), + IMAGE_NOT_FOUND_EXCEPTION(404, "IMG-404-1", "이미지를 조회할 수 없습니다."), + S3_SAVE_EXCEPTION(500, "IMG-500-1", "S3 Save Exception"), - //coin, - MONEY_NOT_ENOUGH(400, "COIN-400-1", "돈이 충분하지 않습니다."), - COIN_NOT_ENOUGH(400,"COIN-400-2" , "코인이 충분하지 않습니다."), - TRADE_ALREADY_FINISHED(400, "COIN-400-3", "거래가 이미 종료되었습니다."), - ALREADY_AWARDED(400, "COIN-400-4", "이미 보상을 받았습니다."), - ALREADY_CREATED(401, "COIN-401-1", "코인 지갑이 이미 생성되었습니다."), - CANCEL_OTHERS_TRADE(403,"COIN-403-1" , "다른 사람의 거래를 취소할 수 없습니다."), - COIN_ACCOUNT_NOT_FOUND_EXCEPTION(404, "COIN-404-1", "코인 계정을 찾을 수 없습니다."), - NO_PERIOD(404, "COIN-404-2", "기간이 없습니다."), - PRICE_NOT_FOUND(404, "COIN-404-2", "가격을 찾을 수 없습니다."), - TRADE_NOT_FOUND(404, "COIN-404-3", "거래를 조회할 수 없습니다."), - RANDOM_INSTANCE(500, "COIN-500-1", "Random Instance Create Exception"); + //coin, + MONEY_NOT_ENOUGH(400, "COIN-400-1", "돈이 충분하지 않습니다."), + COIN_NOT_ENOUGH(400, "COIN-400-2", "코인이 충분하지 않습니다."), + TRADE_ALREADY_FINISHED(400, "COIN-400-3", "거래가 이미 종료되었습니다."), + ALREADY_AWARDED(400, "COIN-400-4", "이미 보상을 받았습니다."), + ALREADY_CREATED(401, "COIN-401-1", "코인 지갑이 이미 생성되었습니다."), + CANCEL_OTHERS_TRADE(403, "COIN-403-1", "다른 사람의 거래를 취소할 수 없습니다."), + COIN_ACCOUNT_NOT_FOUND_EXCEPTION(404, "COIN-404-1", "코인 계정을 찾을 수 없습니다."), + NO_PERIOD(404, "COIN-404-2", "기간이 없습니다."), + PRICE_NOT_FOUND(404, "COIN-404-2", "가격을 찾을 수 없습니다."), + TRADE_NOT_FOUND(404, "COIN-404-3", "거래를 조회할 수 없습니다."), + RANDOM_INSTANCE(500, "COIN-500-1", "Random Instance Create Exception"); - private final int status; - private final String code; - private final String message; + private final int status; + private final String code; + private final String message; } diff --git a/src/main/java/com/project/bumawiki/global/jwt/auth/JwtAuth.java b/src/main/java/com/project/bumawiki/global/jwt/auth/JwtAuth.java index d8a86b0a..b1a309ad 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/auth/JwtAuth.java +++ b/src/main/java/com/project/bumawiki/global/jwt/auth/JwtAuth.java @@ -1,39 +1,42 @@ package com.project.bumawiki.global.jwt.auth; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + import com.project.bumawiki.global.config.security.auth.AuthDetailsService; import com.project.bumawiki.global.jwt.exception.InvalidJwtException; import com.project.bumawiki.global.jwt.properties.JwtConstants; import com.project.bumawiki.global.jwt.util.JwtUtil; + import io.jsonwebtoken.Claims; import lombok.RequiredArgsConstructor; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class JwtAuth { - private final JwtUtil jwtUtil; - private final AuthDetailsService authDetailsService; + private final JwtUtil jwtUtil; + private final AuthDetailsService authDetailsService; - public Authentication authentication(String token) { - Claims claims = jwtUtil.getJwt(token).getPayload(); + public Authentication authentication(String token) { + Claims claims = jwtUtil.getJwt(token).getPayload(); - if (isNotAccessToken(token)) { - throw InvalidJwtException.EXCEPTION; - } + if (isNotAccessToken(token)) { + throw InvalidJwtException.EXCEPTION; + } - UserDetails userDetails = authDetailsService.loadUserByUsername(claims.get(JwtConstants.AUTH_ID.message).toString()); - return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities()); - } + UserDetails userDetails = authDetailsService.loadUserByUsername( + claims.get(JwtConstants.AUTH_ID.message).toString()); + return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities()); + } - private boolean isNotAccessToken(String token) { - if (token.isEmpty()) { - throw InvalidJwtException.EXCEPTION; - } - String role = jwtUtil.getJwt(token).getHeader().get(JwtConstants.TYPE.message).toString(); - return !role.equals(JwtConstants.ACCESS_KEY.message); - } + private boolean isNotAccessToken(String token) { + if (token.isEmpty()) { + throw InvalidJwtException.EXCEPTION; + } + String role = jwtUtil.getJwt(token).getHeader().get(JwtConstants.TYPE.message).toString(); + return !role.equals(JwtConstants.ACCESS_KEY.message); + } } diff --git a/src/main/java/com/project/bumawiki/global/jwt/auth/JwtFilter.java b/src/main/java/com/project/bumawiki/global/jwt/auth/JwtFilter.java index c60f04cf..a074e206 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/auth/JwtFilter.java +++ b/src/main/java/com/project/bumawiki/global/jwt/auth/JwtFilter.java @@ -1,35 +1,38 @@ package com.project.bumawiki.global.jwt.auth; -import com.project.bumawiki.global.jwt.util.JwtUtil; -import lombok.RequiredArgsConstructor; +import java.io.IOException; + import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.filter.OncePerRequestFilter; -import jakarta.validation.constraints.NotNull; + +import com.project.bumawiki.global.jwt.util.JwtUtil; + import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class JwtFilter extends OncePerRequestFilter { - private final JwtAuth jwtAuth; - private final JwtUtil jwtUtil; - + private final JwtAuth jwtAuth; + private final JwtUtil jwtUtil; - @Override - protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - String token = jwtUtil.resolveToken(request); - SetAuthenticationInSecurityContext(token); - filterChain.doFilter(request, response); - } + @Override + protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + String token = jwtUtil.resolveToken(request); + setAuthenticationInSecurityContext(token); + filterChain.doFilter(request, response); + } - private void SetAuthenticationInSecurityContext(String token) { - if (token != null) { - Authentication authentication = jwtAuth.authentication(token); - SecurityContextHolder.getContext().setAuthentication(authentication); - } - } + private void setAuthenticationInSecurityContext(String token) { + if (token != null) { + Authentication authentication = jwtAuth.authentication(token); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } } diff --git a/src/main/java/com/project/bumawiki/global/jwt/dto/TokenResponseDto.java b/src/main/java/com/project/bumawiki/global/jwt/dto/TokenResponseDto.java index 54b2d684..42092139 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/dto/TokenResponseDto.java +++ b/src/main/java/com/project/bumawiki/global/jwt/dto/TokenResponseDto.java @@ -1,23 +1,24 @@ package com.project.bumawiki.global.jwt.dto; +import java.time.ZonedDateTime; + import com.fasterxml.jackson.annotation.JsonFormat; + import lombok.Builder; import lombok.Getter; -import java.time.ZonedDateTime; - @Getter public class TokenResponseDto { - private final String accessToken; - private final String refreshToken; + private final String accessToken; + private final String refreshToken; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") - private final ZonedDateTime expiredAt; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") + private final ZonedDateTime expiredAt; - @Builder - public TokenResponseDto(String accessToken, String refreshToken, ZonedDateTime expiredAt) { - this.accessToken = accessToken; - this.refreshToken = refreshToken; - this.expiredAt = expiredAt; - } + @Builder + public TokenResponseDto(String accessToken, String refreshToken, ZonedDateTime expiredAt) { + this.accessToken = accessToken; + this.refreshToken = refreshToken; + this.expiredAt = expiredAt; + } } diff --git a/src/main/java/com/project/bumawiki/global/jwt/exception/ExpiredJwtException.java b/src/main/java/com/project/bumawiki/global/jwt/exception/ExpiredJwtException.java index d0284a21..d45a35df 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/exception/ExpiredJwtException.java +++ b/src/main/java/com/project/bumawiki/global/jwt/exception/ExpiredJwtException.java @@ -4,9 +4,9 @@ import com.project.bumawiki.global.error.exception.ErrorCode; public class ExpiredJwtException extends BumawikiException { - public final static ExpiredJwtException EXCEPTION = new ExpiredJwtException(ErrorCode.EXPIRED_JWT); + public static final ExpiredJwtException EXCEPTION = new ExpiredJwtException(ErrorCode.EXPIRED_JWT); - public ExpiredJwtException(ErrorCode errorCode) { - super(errorCode); - } + public ExpiredJwtException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/global/jwt/exception/InvalidJwtException.java b/src/main/java/com/project/bumawiki/global/jwt/exception/InvalidJwtException.java index efc766c4..34f7851c 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/exception/InvalidJwtException.java +++ b/src/main/java/com/project/bumawiki/global/jwt/exception/InvalidJwtException.java @@ -5,9 +5,9 @@ public class InvalidJwtException extends BumawikiException { - public static InvalidJwtException EXCEPTION = new InvalidJwtException(ErrorCode.INVALID_TOKEN); + public static InvalidJwtException EXCEPTION = new InvalidJwtException(ErrorCode.INVALID_TOKEN); - public InvalidJwtException(ErrorCode errorCode) { - super(errorCode); - } + public InvalidJwtException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/global/jwt/exception/RefreshTokenExpiredException.java b/src/main/java/com/project/bumawiki/global/jwt/exception/RefreshTokenExpiredException.java index 9b177091..9d674cc7 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/exception/RefreshTokenExpiredException.java +++ b/src/main/java/com/project/bumawiki/global/jwt/exception/RefreshTokenExpiredException.java @@ -5,9 +5,10 @@ public class RefreshTokenExpiredException extends BumawikiException { - public final static RefreshTokenExpiredException EXCEPTION = new RefreshTokenExpiredException(ErrorCode.REFRESH_TOKEN_EXPIRED); + public static final RefreshTokenExpiredException EXCEPTION = new RefreshTokenExpiredException( + ErrorCode.REFRESH_TOKEN_EXPIRED); - public RefreshTokenExpiredException(ErrorCode errorCode) { - super(errorCode); - } + public RefreshTokenExpiredException(ErrorCode errorCode) { + super(errorCode); + } } diff --git a/src/main/java/com/project/bumawiki/global/jwt/properties/JwtConstants.java b/src/main/java/com/project/bumawiki/global/jwt/properties/JwtConstants.java index 9276f7d2..9ec5ce42 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/properties/JwtConstants.java +++ b/src/main/java/com/project/bumawiki/global/jwt/properties/JwtConstants.java @@ -7,13 +7,13 @@ @Getter public enum JwtConstants { - AUTH_ID("auth_id"), - TYPE("type"), - EMPTY(" "), - PREFIX("prefix"), - ROLE("role"), - ACCESS_KEY("access_token"), - REFRESH_KEY("refresh_token"); + AUTH_ID("auth_id"), + TYPE("type"), + EMPTY(" "), + PREFIX("prefix"), + ROLE("role"), + ACCESS_KEY("access_token"), + REFRESH_KEY("refresh_token"); - public final String message; + public final String message; } diff --git a/src/main/java/com/project/bumawiki/global/jwt/properties/JwtProperties.java b/src/main/java/com/project/bumawiki/global/jwt/properties/JwtProperties.java index 91545ae3..d4c77c6a 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/properties/JwtProperties.java +++ b/src/main/java/com/project/bumawiki/global/jwt/properties/JwtProperties.java @@ -1,29 +1,29 @@ package com.project.bumawiki.global.jwt.properties; -import io.jsonwebtoken.io.Decoders; -import io.jsonwebtoken.security.Keys; -import java.security.Key; import javax.crypto.SecretKey; -import lombok.Getter; -import lombok.RequiredArgsConstructor; + import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.bind.ConstructorBinding; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import lombok.Getter; + @Getter @ConfigurationProperties(prefix = "auth.jwt") public class JwtProperties { - private final String header; - private final SecretKey secret; - private final Long accessExp; - private final Long refreshExp; - private final String prefix; + private final String header; + private final SecretKey secret; + private final Long accessExp; + private final Long refreshExp; + private final String prefix; - @ConstructorBinding - public JwtProperties(String header, String secret, Long accessExp, Long refreshExp, String prefix) { - this.header = header; - this.secret = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secret));; - this.accessExp = accessExp; - this.refreshExp = refreshExp; - this.prefix = prefix; - } + @ConstructorBinding + public JwtProperties(String header, String secret, Long accessExp, Long refreshExp, String prefix) { + this.header = header; + this.secret = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secret)); + this.accessExp = accessExp; + this.refreshExp = refreshExp; + this.prefix = prefix; + } } diff --git a/src/main/java/com/project/bumawiki/global/jwt/util/JwtProvider.java b/src/main/java/com/project/bumawiki/global/jwt/util/JwtProvider.java index 4303ea49..df442768 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/util/JwtProvider.java +++ b/src/main/java/com/project/bumawiki/global/jwt/util/JwtProvider.java @@ -1,61 +1,66 @@ package com.project.bumawiki.global.jwt.util; +import static com.project.bumawiki.global.jwt.properties.JwtConstants.*; + +import java.time.ZonedDateTime; +import java.util.Date; + +import org.springframework.stereotype.Component; + import com.project.bumawiki.domain.auth.domain.RefreshToken; import com.project.bumawiki.domain.auth.domain.repository.RefreshTokenRepository; import com.project.bumawiki.global.jwt.dto.TokenResponseDto; import com.project.bumawiki.global.jwt.properties.JwtProperties; + import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.time.ZonedDateTime; -import java.util.Date; - -import static com.project.bumawiki.global.jwt.properties.JwtConstants.*; @Slf4j @RequiredArgsConstructor @Component public class JwtProvider { - private final JwtProperties jwtProperties; - private final RefreshTokenRepository refreshTokenRepository; - - public String generateAccessToken(String authId, String role) { - return jwtProperties.getPrefix() + EMPTY.getMessage() + generateToken(authId, role, ACCESS_KEY.getMessage(), jwtProperties.getAccessExp()); - } - - public TokenResponseDto generateToken(String authId, String role) { - String accessToken = jwtProperties.getPrefix() + EMPTY.getMessage() + generateToken(authId, role, ACCESS_KEY.getMessage(), jwtProperties.getAccessExp()); - String refreshToken = jwtProperties.getPrefix() + EMPTY.getMessage() + generateToken(authId, role, REFRESH_KEY.getMessage(), jwtProperties.getRefreshExp()); - - refreshTokenRepository.save(RefreshToken.builder() - .id(authId) - .refreshToken(refreshToken) - .ttl(jwtProperties.getRefreshExp()) - .expiredAt(getExpiredTime()) - .build() - ); - - return new TokenResponseDto(accessToken, refreshToken, getExpiredTime()); - } - - - private String generateToken(String authId, String role, String type, Long exp) { - return Jwts.builder() - .header() - .add(TYPE.message, type).and() - .claim(ROLE.getMessage(), role) - .claim(AUTH_ID.getMessage(), authId) - .signWith(jwtProperties.getSecret()) - .expiration( - new Date(System.currentTimeMillis() + exp * 1000) - ) - .compact(); - } - - public ZonedDateTime getExpiredTime() { - return ZonedDateTime.now().plusSeconds(jwtProperties.getRefreshExp()); - } + private final JwtProperties jwtProperties; + private final RefreshTokenRepository refreshTokenRepository; + + public String generateAccessToken(String authId, String role) { + return jwtProperties.getPrefix() + EMPTY.getMessage() + generateToken(authId, role, ACCESS_KEY.getMessage(), + jwtProperties.getAccessExp()); + } + + public TokenResponseDto generateToken(String authId, String role) { + String accessToken = + jwtProperties.getPrefix() + EMPTY.getMessage() + generateToken(authId, role, ACCESS_KEY.getMessage(), + jwtProperties.getAccessExp()); + String refreshToken = + jwtProperties.getPrefix() + EMPTY.getMessage() + generateToken(authId, role, REFRESH_KEY.getMessage(), + jwtProperties.getRefreshExp()); + + refreshTokenRepository.save(RefreshToken.builder() + .id(authId) + .refreshToken(refreshToken) + .ttl(jwtProperties.getRefreshExp()) + .expiredAt(getExpiredTime()) + .build() + ); + + return new TokenResponseDto(accessToken, refreshToken, getExpiredTime()); + } + + private String generateToken(String authId, String role, String type, Long exp) { + return Jwts.builder() + .header() + .add(TYPE.message, type).and() + .claim(ROLE.getMessage(), role) + .claim(AUTH_ID.getMessage(), authId) + .signWith(jwtProperties.getSecret()) + .expiration( + new Date(System.currentTimeMillis() + exp * 1000) + ) + .compact(); + } + + public ZonedDateTime getExpiredTime() { + return ZonedDateTime.now().plusSeconds(jwtProperties.getRefreshExp()); + } } diff --git a/src/main/java/com/project/bumawiki/global/jwt/util/JwtUtil.java b/src/main/java/com/project/bumawiki/global/jwt/util/JwtUtil.java index a410d293..840cd5e2 100644 --- a/src/main/java/com/project/bumawiki/global/jwt/util/JwtUtil.java +++ b/src/main/java/com/project/bumawiki/global/jwt/util/JwtUtil.java @@ -1,61 +1,62 @@ package com.project.bumawiki.global.jwt.util; +import static com.project.bumawiki.global.jwt.properties.JwtConstants.*; + +import java.util.Objects; + +import org.springframework.stereotype.Component; + import com.project.bumawiki.domain.auth.domain.repository.AuthIdRepository; import com.project.bumawiki.global.jwt.exception.ExpiredJwtException; import com.project.bumawiki.global.jwt.exception.InvalidJwtException; import com.project.bumawiki.global.jwt.properties.JwtProperties; + import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jws; import io.jsonwebtoken.Jwts; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import jakarta.servlet.http.HttpServletRequest; -import java.util.Objects; - -import static com.project.bumawiki.global.jwt.properties.JwtConstants.AUTH_ID; @Component @Slf4j @RequiredArgsConstructor public class JwtUtil { - private final JwtProperties jwtProperties; - private final AuthIdRepository authIdRepository; - - public String resolveToken(HttpServletRequest request) { - String bearer = request.getHeader(jwtProperties.getHeader()); - - return parseToken(bearer); - } - - public String parseToken(String bearer) { - if (!Objects.equals(bearer, "") && bearer != null) { - String token = bearer.replaceAll(jwtProperties.getPrefix(), "").trim(); - checkingIfJwtExpired(token); - return token; - } - return null; - } - - public void checkingIfJwtExpired(String token) { - String authId = getJwt(token).getPayload().get(AUTH_ID.getMessage()).toString(); - - authIdRepository.findByAuthId(authId) - .orElseThrow(() -> ExpiredJwtException.EXCEPTION); - } - - public Jws getJwt(String token) { - if (token == null) { - throw InvalidJwtException.EXCEPTION; - } - return Jwts.parser().verifyWith(jwtProperties.getSecret()).build().parseSignedClaims(token); - } - - - public Claims getJwtBody(String bearer) { - Jws jwt = getJwt(parseToken(bearer)); - return jwt.getPayload(); - } + private final JwtProperties jwtProperties; + private final AuthIdRepository authIdRepository; + + public String resolveToken(HttpServletRequest request) { + String bearer = request.getHeader(jwtProperties.getHeader()); + + return parseToken(bearer); + } + + public String parseToken(String bearer) { + if (!Objects.equals(bearer, "") && bearer != null) { + String token = bearer.replaceAll(jwtProperties.getPrefix(), "").trim(); + checkingIfJwtExpired(token); + return token; + } + return null; + } + + public void checkingIfJwtExpired(String token) { + String authId = getJwt(token).getPayload().get(AUTH_ID.getMessage()).toString(); + + authIdRepository.findByAuthId(authId) + .orElseThrow(() -> ExpiredJwtException.EXCEPTION); + } + + public Jws getJwt(String token) { + if (token == null) { + throw InvalidJwtException.EXCEPTION; + } + return Jwts.parser().verifyWith(jwtProperties.getSecret()).build().parseSignedClaims(token); + } + + public Claims getJwtBody(String bearer) { + Jws jwt = getJwt(parseToken(bearer)); + return jwt.getPayload(); + } } diff --git a/src/main/java/com/project/bumawiki/global/oauth/BsmOauthProperties.java b/src/main/java/com/project/bumawiki/global/oauth/BsmOauthProperties.java index ddcbe9cc..4afb9abe 100644 --- a/src/main/java/com/project/bumawiki/global/oauth/BsmOauthProperties.java +++ b/src/main/java/com/project/bumawiki/global/oauth/BsmOauthProperties.java @@ -1,23 +1,22 @@ package com.project.bumawiki.global.oauth; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; + import leehj050211.bsmOauth.BsmOauth; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Component; @Getter @RequiredArgsConstructor @ConfigurationProperties(prefix = "bsm") public class BsmOauthProperties { - private final String client_id; - private final String secret_key; + private final String clientId; + private final String secretKey; - @Bean("bsmOauth") - public BsmOauth bsmOauth() { - return new BsmOauth(client_id, secret_key); - } + @Bean("bsmOauth") + public BsmOauth bsmOauth() { + return new BsmOauth(clientId, secretKey); + } } diff --git a/src/main/java/com/project/bumawiki/global/s3/controller/dto/ImageResponse.java b/src/main/java/com/project/bumawiki/global/s3/controller/dto/ImageResponse.java index 21a0da61..02259ad5 100644 --- a/src/main/java/com/project/bumawiki/global/s3/controller/dto/ImageResponse.java +++ b/src/main/java/com/project/bumawiki/global/s3/controller/dto/ImageResponse.java @@ -1,7 +1,5 @@ package com.project.bumawiki.global.s3.controller.dto; -import org.springframework.web.multipart.MultipartFile; - import lombok.Getter; @Getter diff --git a/src/main/java/com/project/bumawiki/global/util/SecurityUtil.java b/src/main/java/com/project/bumawiki/global/util/SecurityUtil.java index 44882902..57ca102c 100644 --- a/src/main/java/com/project/bumawiki/global/util/SecurityUtil.java +++ b/src/main/java/com/project/bumawiki/global/util/SecurityUtil.java @@ -1,36 +1,36 @@ package com.project.bumawiki.global.util; +import org.springframework.security.core.context.SecurityContextHolder; import com.project.bumawiki.domain.user.domain.User; import com.project.bumawiki.domain.user.exception.UserNotLoginException; import com.project.bumawiki.global.config.security.auth.AuthDetails; -import org.springframework.security.core.context.SecurityContextHolder; public class SecurityUtil { - public static User getCurrentUserWithLogin() { - try { - return getUser(); - } catch (ClassCastException e) { - throw UserNotLoginException.EXCEPTION; - } - } + public static User getCurrentUserWithLogin() { + try { + return getUser(); + } catch (ClassCastException e) { + throw UserNotLoginException.EXCEPTION; + } + } - public static User getCurrentUserOrNotLogin() { - return getUser(); - } + public static User getCurrentUserOrNotLogin() { + return getUser(); + } - private static User getUser() { + private static User getUser() { - Object principal = SecurityContextHolder.getContext() - .getAuthentication() - .getPrincipal(); + Object principal = SecurityContextHolder.getContext() + .getAuthentication() + .getPrincipal(); - if (principal instanceof String) { - throw UserNotLoginException.EXCEPTION; - } + if (principal instanceof String) { + throw UserNotLoginException.EXCEPTION; + } - AuthDetails authDetails = (AuthDetails) principal; + AuthDetails authDetails = (AuthDetails)principal; - return authDetails.getUser(); - } + return authDetails.getUser(); + } } diff --git a/src/main/java/com/project/bumawiki/global/web/WebMvcMapping.java b/src/main/java/com/project/bumawiki/global/web/WebMvcMapping.java index 99ebb73e..a51c32e1 100644 --- a/src/main/java/com/project/bumawiki/global/web/WebMvcMapping.java +++ b/src/main/java/com/project/bumawiki/global/web/WebMvcMapping.java @@ -6,16 +6,16 @@ @Configuration public class WebMvcMapping implements WebMvcConfigurer { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOrigins( - "http://localhost:3000", - "http://localhost:3001", - "http://localhost:3002", - "https://buma.wiki" - ) - .allowedMethods("*") - .allowedHeaders("*"); - } + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins( + "http://localhost:3000", + "http://localhost:3001", + "http://localhost:3002", + "https://buma.wiki" + ) + .allowedMethods("*") + .allowedHeaders("*"); + } } diff --git a/src/test/java/com/project/bumawiki/BumawikiApplicationTests.java b/src/test/java/com/project/bumawiki/BumawikiApplicationTests.java index 7dd054a6..961bd6c5 100644 --- a/src/test/java/com/project/bumawiki/BumawikiApplicationTests.java +++ b/src/test/java/com/project/bumawiki/BumawikiApplicationTests.java @@ -2,9 +2,7 @@ import org.springframework.boot.test.context.SpringBootTest; - @SpringBootTest class BumawikiApplicationTests { - } From b604b74b3b2c844f9c164115bdc98e7ffe12d2f3 Mon Sep 17 00:00:00 2001 From: qlido Date: Fri, 5 Apr 2024 14:55:09 +0900 Subject: [PATCH 5/8] =?UTF-8?q?Feat:=20workflow=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 1c5b7ab1..3d302952 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -1,10 +1,3 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle - name: Java CI with Gradle on: @@ -18,9 +11,7 @@ permissions: jobs: build: - runs-on: ubuntu-latest - steps: - uses: actions/checkout@v3 - name: Set up JDK 17 @@ -31,6 +22,9 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - + + - name: checkStyle + run: ./gradlew check + - name: Build with Gradle run: ./gradlew build From 727d9e76a3a507e9a86fe90c8b20ef19de6b7857 Mon Sep 17 00:00:00 2001 From: qlido Date: Fri, 5 Apr 2024 14:55:31 +0900 Subject: [PATCH 6/8] =?UTF-8?q?Feat:=20sonarcloud=EC=99=80=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 564c6bf8..68ab89ba 100644 --- a/build.gradle +++ b/build.gradle @@ -110,6 +110,7 @@ sonarqube { property "sonar.projectKey", "Team-INSERT_BUMAWIKI_SERVER_V2" property "sonar.organization", "team-insert" property "sonar.host.url", "https://sonarcloud.io" + property "sonar.java.checkstyle.reportPaths", "build/reports/checkstyle/main.xml" } } //sonarCloud testCoverage @@ -129,7 +130,7 @@ compileTestJava.options.encoding = 'UTF-8' tasks.withType(Checkstyle).configureEach { reports { - xml.required = false + xml.required = true html.required = true } } From b977e736d38bb5e345f7d11fcea73af97b269c48 Mon Sep 17 00:00:00 2001 From: qlido Date: Sat, 6 Apr 2024 21:50:44 +0900 Subject: [PATCH 7/8] feat: commit lint --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 68ab89ba..e7ce7404 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,7 @@ plugins { id "checkstyle" //git hooks id "com.star-zero.gradle.githook" version "1.2.1" + id "it.nicolasfarabegoli.conventional-commits" version "3.1.3" } group = 'com.project' @@ -148,7 +149,6 @@ githook { hooks { "pre-commit" { task = "check" - shell = "echo 1" } } } From 87c02b76df0888d798949707003e3cf8e9644b43 Mon Sep 17 00:00:00 2001 From: qlido Date: Sat, 6 Apr 2024 22:07:45 +0900 Subject: [PATCH 8/8] =?UTF-8?q?fix(gradle):=20warning=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e7ce7404..710c0543 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,7 @@ plugins { group = 'com.project' version = '0.0.1-SNAPSHOT' +//noinspection GroovyUnusedAssignment sourceCompatibility = '17' repositories { @@ -79,7 +80,7 @@ tasks.named('test') { } //querydsl 추가 -def querydslDir = "$buildDir/generated/querydsl" +def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile tasks.withType(JavaCompile).configureEach { options.getGeneratedSourceOutputDirectory().set(file(querydslDir)) }