diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..fbdc8fc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,534 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = false +max_line_length = 120 +tab_width = 2 +ij_continuation_indent_size = 4 +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 + +[*.prisma] +indent_size = 2 +tab_width = 2 +ij_prisma_line_comment_add_space = true +ij_prisma_line_comment_add_space_on_reformat = true +ij_prisma_line_comment_at_first_column = false +ij_prisma_run_prisma_fmt_on_reformat = true + +[*.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 + +[.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,phpunit.xml.dist}] +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 +ij_xml_use_custom_settings = false + +[{*.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 = true +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 = true +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_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 = always +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 = always +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 = true +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 = true +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_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 = always +ij_javascript_while_on_new_line = false +ij_javascript_wrap_comments = false + +[{*.go,*.go2}] +indent_style = tab +ij_continuation_indent_size = 4 +ij_go_GROUP_CURRENT_PROJECT_IMPORTS = false +ij_go_add_leading_space_to_comments = false +ij_go_add_parentheses_for_single_import = false +ij_go_call_parameters_new_line_after_left_paren = true +ij_go_call_parameters_right_paren_on_new_line = true +ij_go_call_parameters_wrap = off +ij_go_fill_paragraph_width = 80 +ij_go_group_stdlib_imports = true +ij_go_import_sorting = gofmt +ij_go_keep_indents_on_empty_lines = false +ij_go_local_group_mode = project +ij_go_local_package_prefixes = +ij_go_move_all_imports_in_one_declaration = true +ij_go_move_all_stdlib_imports_in_one_group = true +ij_go_remove_redundant_import_aliases = false +ij_go_run_go_fmt_on_reformat = true +ij_go_use_back_quotes_for_imports = false +ij_go_wrap_comp_lit = off +ij_go_wrap_comp_lit_newline_after_lbrace = true +ij_go_wrap_comp_lit_newline_before_rbrace = true +ij_go_wrap_func_params = off +ij_go_wrap_func_params_newline_after_lparen = true +ij_go_wrap_func_params_newline_before_rparen = true +ij_go_wrap_func_result = off +ij_go_wrap_func_result_newline_after_lparen = true +ij_go_wrap_func_result_newline_before_rparen = true + +[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,composer.lock,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 + +[{*.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 + +[{*.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 + +[{*.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 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 80aec12..911526b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,125 +1,125 @@ -name: CI - -on: - push: - branches: ["master"] - -jobs: - api-build: - name: API - runs-on: ubuntu-latest - container: golang:1.19-bullseye - timeout-minutes: 15 - services: - bucket: - image: minio/minio:edge-cicd - env: - MINIO_ROOT_USER: root - MINIO_ROOT_PASSWORD: verysecurepassword - MINIO_ACCESS_KEY: minio_access_key - MINIO_SECRET_KEY: minio_access_key - ports: - - 9000:9000 - options: >- - --health-cmd "curl -f http://bucket:9000/minio/health/live" - --health-interval 45s - --health-timeout 30s - --health-retries 10 - --health-start-period 120s - volumes: - - minio-data:/data - redis: - image: redis:6-bullseye - ports: - - 6379:6379 - defaults: - run: - working-directory: ./api - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Installling dependencies - run: go mod download - - - name: Build - run: go build main.go - - - name: Run test & coverage - run: go test -v -race -coverprofile=coverage.out -covermode=atomic ./... - env: - ENV: development - PORT: 5000 - MINIO_HOST: bucket:9000 - MINIO_ACCESS_ID: root - MINIO_SECRET_KEY: verysecurepassword - REDIS_URL: redis://@redis:6379 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: go - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 - - - name: Create Sentry release - uses: getsentry/action-release@v1 - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG }} - SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT_API}} - with: - environment: production - set_commits: skip - version: ${{ github.sha }} - - - uses: codecov/codecov-action@v2 - with: - flags: api - - client-build: - name: Client - runs-on: ubuntu-latest - container: node:18-bullseye - timeout-minutes: 15 - defaults: - run: - working-directory: ./client - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Installling dependencies - run: npm install - - - name: Lint - run: npm run lint - - - name: Build - run: npm run build - env: - VITE_SENTRY_DSN: https://examplePublicKey@o0.ingest.sentry.io/0 - VITE_NODE_ENV: development - VITE_API_ENDPOINT: https://jokesbapak2.reinaldyrafli.com/api/v1 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: javascript - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 - - - name: Create Sentry release - uses: getsentry/action-release@v1 - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG }} - SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT_CLIENT }} - with: - environment: production - set_commits: skip - version: ${{ github.sha }} +name: CI + +on: + push: + branches: [ "master" ] + +jobs: + api-build: + name: API + runs-on: ubuntu-latest + container: golang:1.21.0-bookworm + timeout-minutes: 15 + services: + bucket: + image: minio/minio:edge-cicd + env: + MINIO_ROOT_USER: root + MINIO_ROOT_PASSWORD: verysecurepassword + MINIO_ACCESS_KEY: minio_access_key + MINIO_SECRET_KEY: minio_access_key + ports: + - 9000:9000 + options: >- + --health-cmd "curl -f http://bucket:9000/minio/health/live" + --health-interval 45s + --health-timeout 30s + --health-retries 10 + --health-start-period 120s + volumes: + - minio-data:/data + redis: + image: redis:7.0.12-bookworm + ports: + - 6379:6379 + defaults: + run: + working-directory: ./api + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Installling dependencies + run: go mod download + + - name: Build + run: go build main.go + + - name: Run test & coverage + run: go test -v -race -coverprofile=coverage.out -covermode=atomic ./... + env: + ENV: development + PORT: 5000 + MINIO_HOST: bucket:9000 + MINIO_ACCESS_ID: root + MINIO_SECRET_KEY: verysecurepassword + REDIS_URL: redis://@redis:6379 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: go + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 + + - name: Create Sentry release + uses: getsentry/action-release@v1 + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_TOKEN }} + SENTRY_ORG: ${{ secrets.SENTRY_ORG }} + SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT_API}} + with: + environment: production + set_commits: skip + version: ${{ github.sha }} + + - uses: codecov/codecov-action@v2 + with: + flags: api + + client-build: + name: Client + runs-on: ubuntu-latest + container: node:18.17.1-bookworm + timeout-minutes: 15 + defaults: + run: + working-directory: ./client + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Installling dependencies + run: npm install + + - name: Lint + run: npm run lint + + - name: Build + run: npm run build + env: + VITE_SENTRY_DSN: https://examplePublicKey@o0.ingest.sentry.io/0 + VITE_NODE_ENV: development + VITE_API_ENDPOINT: https://jokesbapak2.reinaldyrafli.com/api/v1 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: javascript + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 + + - name: Create Sentry release + uses: getsentry/action-release@v1 + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_TOKEN }} + SENTRY_ORG: ${{ secrets.SENTRY_ORG }} + SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT_CLIENT }} + with: + environment: production + set_commits: skip + version: ${{ github.sha }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index cdb8dec..1b7841a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,106 +1,106 @@ -name: PR - -on: - pull_request: - branches: ["*"] - -jobs: - client-build: - name: Client - runs-on: ubuntu-latest - container: node:18-bullseye - timeout-minutes: 15 - defaults: - run: - working-directory: ./client - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Installling dependencies - run: npm install - - - name: Lint - run: npx eslint --ext .svelte,.js,.ts --ignore-path .gitignore . - - - name: Formatting - run: npx prettier --check --ignore-path .gitignore --plugin-search-dir=. "./**/*.(ts|json|js|svelte)" - - - name: Build - run: npm run build - env: - VITE_SENTRY_DSN: https://examplePublicKey@o0.ingest.sentry.io/0 - VITE_NODE_ENV: development - VITE_API_ENDPOINT: https://jokesbapak2.reinaldyrafli.com/api/v1 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: javascript - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 - - api-build: - name: API - runs-on: ubuntu-latest - container: golang:1.19-bullseye - timeout-minutes: 15 - services: - bucket: - image: minio/minio:edge-cicd - env: - MINIO_ROOT_USER: root - MINIO_ROOT_PASSWORD: verysecurepassword - MINIO_ACCESS_KEY: minio_access_key - MINIO_SECRET_KEY: minio_access_key - ports: - - 9000:9000 - options: >- - --health-cmd "curl -f http://bucket:9000/minio/health/live" - --health-interval 45s - --health-timeout 30s - --health-retries 10 - --health-start-period 120s - volumes: - - minio-data:/data - redis: - image: redis:6-bullseye - ports: - - 6379:6379 - defaults: - run: - working-directory: ./api - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Installling dependencies - run: go mod download - - - name: Build - run: go build main.go - - - name: Run test & coverage - run: go test -v -coverprofile=coverage.out -covermode=atomic ./... - env: - ENV: development - PORT: 5000 - MINIO_HOST: bucket:9000 - MINIO_ACCESS_ID: root - MINIO_SECRET_KEY: verysecurepassword - REDIS_URL: redis://@redis:6379 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: go - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 - - - uses: codecov/codecov-action@v2 - with: - flags: api +name: PR + +on: + pull_request: + branches: [ "*" ] + +jobs: + client-build: + name: Client + runs-on: ubuntu-latest + container: node:18.17.1-bookworm + timeout-minutes: 15 + defaults: + run: + working-directory: ./client + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Install dependencies + run: npm install + + - name: Lint + run: npx eslint --ext .svelte,.js,.ts --ignore-path .gitignore . + + - name: Formatting + run: npx prettier --check --ignore-path .gitignore --plugin-search-dir=. "./**/*.(ts|json|js|svelte)" + + - name: Build + run: npm run build + env: + VITE_SENTRY_DSN: https://examplePublicKey@o0.ingest.sentry.io/0 + VITE_NODE_ENV: development + VITE_API_ENDPOINT: https://jokesbapak2.reinaldyrafli.com/api/v1 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: javascript + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 + + api-build: + name: API + runs-on: ubuntu-latest + container: golang:1.21.0-bookworm + timeout-minutes: 15 + services: + bucket: + image: minio/minio:edge-cicd + env: + MINIO_ROOT_USER: root + MINIO_ROOT_PASSWORD: verysecurepassword + MINIO_ACCESS_KEY: minio_access_key + MINIO_SECRET_KEY: minio_access_key + ports: + - 9000:9000 + options: >- + --health-cmd "curl -f http://bucket:9000/minio/health/live" + --health-interval 45s + --health-timeout 30s + --health-retries 10 + --health-start-period 120s + volumes: + - minio-data:/data + redis: + image: redis:7.0.12-bookworm + ports: + - 6379:6379 + defaults: + run: + working-directory: ./api + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Installling dependencies + run: go mod download + + - name: Build + run: go build main.go + + - name: Run test & coverage + run: go test -v -coverprofile=coverage.out -covermode=atomic ./... + env: + ENV: development + PORT: 5000 + MINIO_HOST: bucket:9000 + MINIO_ACCESS_ID: root + MINIO_SECRET_KEY: verysecurepassword + REDIS_URL: redis://@redis:6379 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: go + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 + + - uses: codecov/codecov-action@v2 + with: + flags: api diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..1c2fda5 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..2a6a89a --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jokes-bapak2.iml b/.idea/jokes-bapak2.iml new file mode 100644 index 0000000..338a266 --- /dev/null +++ b/.idea/jokes-bapak2.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..7c28244 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..c8397c9 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d6248fb..530784a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,75 +1,87 @@ -# Contributing Guide - -First of all. Thank you for considering to contribute on Jokes Bapak2 API project. I hope this project will get better and we will become more bapak2 than ever. - -This project is a monorepo, meaning the backend, frontend, and Github CI are all in one place (one repository). Before you do anything, if you're going to do some breaking change or you'll write (or remove) large numbers of LOC (line of codes), please open an issue first and let us know about it. So that our work won't bother you and you'll have a breeze on developing this. - -## Project Prerequisites && Setup - -### Front End (`./client`) - -You'll have to install: -* Node.js LTS (preferably with [fnm](https://github.com/Schniz/fnm) or [nvm](https://github.com/nvm-sh/nvm)) -* Yarn v1 - -See the [README](./client/README.md) on client for detailed project setup. - -### Back End (`./api`) - -You'll have to install: -* Go v1.16.x -* (Optional) [Fiber CLI](https://github.com/gofiber/cli) for ease of development - -See the [README](./api/README.md) on client for detailed project setup. - -### With Docker Compose - -If you're just developing the front end and too lazy installing Go and such (or the other way around), you can use `docker-compose` file specified on the main page. - -You'll have to install: -* Docker (preferably with Docker Desktop if you're on Windows or Mac) -* Docker Compose - -```bash -# Create a docker container but don't start it yet. -$ docker-compose up --no-start - -# Or if you want to create the docker container and start it right away -$ docker-compose up - -# If you want to have it running in the background -$ docker-compose up --detach - -# Start existing container -$ docker-compose start - -# Stop running container -$ docker-compose stop - -# Destroy current container -$ docker-compose down -``` - -## Before submitting PR - -### Front End (`./client`) - -Please run these: -* `yarn lint` -* `yarn format` -* `yarn build` - -If those command didn't pass, please fix the problem first. Please recheck your changes, make sure NOT to leave any secret token/keys behind. - -### Back End (`./api`) - -Please run these: -* `go fmt` -* `go build main.go` -* `go test -v -race -coverprofile=coverage.out -covermode=atomic ./...` - -If those command didn't pass, please fix the problem first. Please recheck your changes, make sure NOT to leave any secret token/keys behind. - -## One more thing.. - +# Contributing Guide + +First of all. Thank you for considering to contribute on Jokes Bapak2 API project. I hope this project will get better +and we will become more bapak2 than ever. + +This project is a monorepo, meaning the backend, frontend, and Github CI are all in one place (one repository). Before +you do anything, if you're going to do some breaking change or you'll write (or remove) large numbers of LOC (line of +codes), please open an issue first and let us know about it. So that our work won't bother you and you'll have a breeze +on developing this. + +## Project Prerequisites && Setup + +### Front End (`./client`) + +You'll have to install: + +* Node.js LTS (preferably with [fnm](https://github.com/Schniz/fnm) or [nvm](https://github.com/nvm-sh/nvm)) +* Yarn v1 + +See the [README](./client/README.md) on client for detailed project setup. + +### Back End (`./api`) + +You'll have to install: + +* Go v1.16.x +* (Optional) [Fiber CLI](https://github.com/gofiber/cli) for ease of development + +See the [README](./api/README.md) on client for detailed project setup. + +### With Docker Compose + +If you're just developing the front end and too lazy installing Go and such (or the other way around), you can +use `docker-compose` file specified on the main page. + +You'll have to install: + +* Docker (preferably with Docker Desktop if you're on Windows or Mac) +* Docker Compose + +```bash +# Create a docker container but don't start it yet. +$ docker-compose up --no-start + +# Or if you want to create the docker container and start it right away +$ docker-compose up + +# If you want to have it running in the background +$ docker-compose up --detach + +# Start existing container +$ docker-compose start + +# Stop running container +$ docker-compose stop + +# Destroy current container +$ docker-compose down +``` + +## Before submitting PR + +### Front End (`./client`) + +Please run these: + +* `yarn lint` +* `yarn format` +* `yarn build` + +If those command didn't pass, please fix the problem first. Please recheck your changes, make sure NOT to leave any +secret token/keys behind. + +### Back End (`./api`) + +Please run these: + +* `go fmt` +* `go build main.go` +* `go test -v -race -coverprofile=coverage.out -covermode=atomic ./...` + +If those command didn't pass, please fix the problem first. Please recheck your changes, make sure NOT to leave any +secret token/keys behind. + +## One more thing.. + Oh my God, thank you so much!!! Working on an open source project is interesting right?? 😆 \ No newline at end of file diff --git a/README.md b/README.md index f44ddbb..b3023e9 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,19 @@ -👋 Hey there! Always a work in progress, if you'd like to contribute this while this repo is still growing, that would be so great! +👋 Hey there! Always a work in progress, if you'd like to contribute this while this repo is still growing, that would be +so great! ou can access the front facing web on [jokesbapak2.reinaldyrafli.com](http://jokesbapak2.reinaldyrafli.com/). ## Brief explanation of what is this -Jokes Bapak2 is an image API that you can use for free! I've been seeing lots and lots of Indonesian dad jokes on Twitter, Facebook and Instagram on early 2020. In a month, I made a Discord bot that provides the jokes. But I thought, why not make it as an API? +Jokes Bapak2 is an image API that you can use for free! I've been seeing lots and lots of Indonesian dad jokes on +Twitter, Facebook and Instagram on early 2020. In a month, I made a Discord bot that provides the jokes. But I thought, +why not make it as an API? -This is some kind of [icanhazdadjokes](https://icanhazdadjoke.com/) but it's Indonesian and it's not text, it's images. Dad jokes in Indonesia is somewhat a bit different than in US/UK because, I guess, here, it's a lot dumber. +This is some kind of [icanhazdadjokes](https://icanhazdadjoke.com/) but it's Indonesian and it's not text, it's images. +Dad jokes in Indonesia is somewhat a bit different than in US/UK because, I guess, here, it's a lot dumber. ## Project Directories @@ -24,29 +28,31 @@ This is some kind of [icanhazdadjokes](https://icanhazdadjoke.com/) but it's Ind You can consume this API via a website (linked in the front facing web) with a few endpoints: - * `/` - Random jokes bapak2 - * `/id/{number}` - Jokes bapak2 based on ID - * `/today` - Jokes bapak2 of the day - * `/total` - Total available jokes bapak2 +* `/` - Random jokes bapak2 +* `/id/{number}` - Jokes bapak2 based on ID +* `/today` - Jokes bapak2 of the day +* `/total` - Total available jokes bapak2 Currently I'm (still) searching for an alternative for AWS S3 that I can use for free. ## Tech stacks - * Go (for `api` / back end) - * Node.js (for `client` / front end) - * Postgres - * Redis +* Go (for `api` / back end) +* Node.js (for `client` / front end) +* Postgres +* Redis That's it. ## Development Two ways of doing this: - 1. Install all the tech stack on your local machine - 2. Using docker-compose -See [CONTRIBUTING](./CONTRIBUTING.md) or README files on each project directory for further instruction on how to run the development environment. +1. Install all the tech stack on your local machine +2. Using docker-compose + +See [CONTRIBUTING](./CONTRIBUTING.md) or README files on each project directory for further instruction on how to run +the development environment. ## Thanks to diff --git a/api/Dockerfile b/api/Dockerfile index 6dfc94f..8d001dd 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19.0-bullseye AS builder +FROM golang:1.21.0-bookworm AS builder WORKDIR /app @@ -6,13 +6,15 @@ COPY . . RUN go build -o main . -FROM debian:bullseye AS runtime +FROM debian:bookworm-slim AS runtime WORKDIR /app -RUN apt-get update && apt-get upgrade --no-install-recommends -y \ - && apt-get install -y curl ca-certificates \ - && apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update && \ + apt-get upgrade --no-install-recommends -y && \ + apt-get install -y curl ca-certificates && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* COPY --from=builder /app/main . diff --git a/api/README.md b/api/README.md index bbb53fc..a3b7f65 100644 --- a/api/README.md +++ b/api/README.md @@ -1,78 +1,79 @@ -# Jokes Bapak2 API - -Still work in progress - -## Development - -```bash -# Install modules -$ go mod download -# or -$ go mod vendor - -# run the local server -$ go run main.go - -# build everything -$ go build main.go -``` - -There is a placeholder data ready for you to query it manually in `/platform/database/placeholder.sql`. Have a good time developing! - -## Used packages - -| Name | Version | Type | -| --- | --- | --- | -| [gofiber/fiber](https://github.com/gofiber/fiber) | `v2.21.0` | Framework | -| [jackc/pgx](https://github.com/jackc/pgx) | `v4.13.0` | Database | -| [go-redis/redis](https://github.com/go-redis/redis) | `v8.11.4` | Cache | -| [allegro/bigcache](https://github.com/allegro/bigcache) | `v3.0.1` | Cache | -| [joho/godotenv](https://github.com/joho/godotenv) | `v1.4.0` | Config | -| [getsentry/sentry-go](https://github.com/getsentry/sentry-go) | `v0.11.0` | Logging | -| [aldy505/phc-crypto](https://github.com/aldy505/phc-crypto) | `v1.1.0` | Utils | -| [Masterminds/squirrel](https://github.com/Masterminds/squirrel ) | `v1.5.1` | Utils | -| [aldy505/bob](https://github.com/aldy505/bob) | `v0.0.4` | Utils | -| [gojek/heimdall](https://github.com/gojek/heimdall) | `v7.0.2` | Utils | -| [georgysavva/scany](https://github.com/georgysavva/scany) | `v0.2.9` | Utils | -| [pquerna/ffjson](https://github.com/pquerna/ffjson) | `v0.0.0-20190930134022-aa0246cd15f7` | Utils | - -## Directory structure - -``` -. -├── core - Pure business logic -│ ├── administrator -│ ├── joke -│ ├── schema -│ ├── submit -│ └── validator -├── Dockerfile - Docker image for API -├── documentation.json - Swagger documentation -├── documentation.yaml - Swagger documentation -├── favicon.png -├── go.mod - Module declaration -├── go.sum - Checksum for modules -├── handler - Route handlers -│ ├── health -│ ├── joke -│ └── submit -├── main.go - Application entry point -├── middleware - Route middlewares -├── platform - Third party packages -│ └── database -├── README.md - You are here -├── routes - Route definitions -└── utils - Utility functions -``` - -## `.env` configuration - -```ini -ENV=development -PORT=5000 - -DATABASE_URL=postgres://postgres:password@localhost:5432/jokesbapak2 -REDIS_URL=redis://@localhost:6379 - -SENTRY_DSN= +# Jokes Bapak2 API + +Still work in progress + +## Development + +```bash +# Install modules +$ go mod download +# or +$ go mod vendor + +# run the local server +$ go run main.go + +# build everything +$ go build main.go +``` + +There is a placeholder data ready for you to query it manually in `/platform/database/placeholder.sql`. Have a good time +developing! + +## Used packages + +| Name | Version | Type | +|------------------------------------------------------------------|--------------------------------------|-----------| +| [gofiber/fiber](https://github.com/gofiber/fiber) | `v2.21.0` | Framework | +| [jackc/pgx](https://github.com/jackc/pgx) | `v4.13.0` | Database | +| [go-redis/redis](https://github.com/go-redis/redis) | `v8.11.4` | Cache | +| [allegro/bigcache](https://github.com/allegro/bigcache) | `v3.0.1` | Cache | +| [joho/godotenv](https://github.com/joho/godotenv) | `v1.4.0` | Config | +| [getsentry/sentry-go](https://github.com/getsentry/sentry-go) | `v0.11.0` | Logging | +| [aldy505/phc-crypto](https://github.com/aldy505/phc-crypto) | `v1.1.0` | Utils | +| [Masterminds/squirrel](https://github.com/Masterminds/squirrel ) | `v1.5.1` | Utils | +| [aldy505/bob](https://github.com/aldy505/bob) | `v0.0.4` | Utils | +| [gojek/heimdall](https://github.com/gojek/heimdall) | `v7.0.2` | Utils | +| [georgysavva/scany](https://github.com/georgysavva/scany) | `v0.2.9` | Utils | +| [pquerna/ffjson](https://github.com/pquerna/ffjson) | `v0.0.0-20190930134022-aa0246cd15f7` | Utils | + +## Directory structure + +``` +. +├── core - Pure business logic +│ ├── administrator +│ ├── joke +│ ├── schema +│ ├── submit +│ └── validator +├── Dockerfile - Docker image for API +├── documentation.json - Swagger documentation +├── documentation.yaml - Swagger documentation +├── favicon.png +├── go.mod - Module declaration +├── go.sum - Checksum for modules +├── handler - Route handlers +│ ├── health +│ ├── joke +│ └── submit +├── main.go - Application entry point +├── middleware - Route middlewares +├── platform - Third party packages +│ └── database +├── README.md - You are here +├── routes - Route definitions +└── utils - Utility functions +``` + +## `.env` configuration + +```ini +ENV=development +PORT=5000 + +DATABASE_URL=postgres://postgres:password@localhost:5432/jokesbapak2 +REDIS_URL=redis://@localhost:6379 + +SENTRY_DSN= ``` \ No newline at end of file diff --git a/api/core/joke/getter_test.go b/api/core/joke/getter_test.go index 792c75d..01283d4 100644 --- a/api/core/joke/getter_test.go +++ b/api/core/joke/getter_test.go @@ -2,9 +2,10 @@ package joke_test import ( "context" - "jokes-bapak2-api/core/joke" "testing" "time" + + "jokes-bapak2-api/core/joke" ) func TestGetRandomJoke(t *testing.T) { diff --git a/api/core/joke/list_test.go b/api/core/joke/list_test.go index ae8a083..5d3a9ab 100644 --- a/api/core/joke/list_test.go +++ b/api/core/joke/list_test.go @@ -2,9 +2,10 @@ package joke_test import ( "context" - "jokes-bapak2-api/core/joke" "testing" "time" + + "jokes-bapak2-api/core/joke" ) func TestListJokeFromBucket(t *testing.T) { diff --git a/api/core/joke/today_test.go b/api/core/joke/today_test.go index 20ecafc..025498f 100644 --- a/api/core/joke/today_test.go +++ b/api/core/joke/today_test.go @@ -2,9 +2,10 @@ package joke_test import ( "context" - "jokes-bapak2-api/core/joke" "testing" "time" + + "jokes-bapak2-api/core/joke" ) func TestGetTodaysJoke(t *testing.T) { diff --git a/api/core/joke/total_test.go b/api/core/joke/total_test.go index cd62d30..3862746 100644 --- a/api/core/joke/total_test.go +++ b/api/core/joke/total_test.go @@ -2,9 +2,10 @@ package joke_test import ( "context" - "jokes-bapak2-api/core/joke" "testing" "time" + + "jokes-bapak2-api/core/joke" ) func TestGetTotalJoke(t *testing.T) { diff --git a/api/documentation.yaml b/api/documentation.yaml index f577d7e..eccdb2c 100644 --- a/api/documentation.yaml +++ b/api/documentation.yaml @@ -1,321 +1,321 @@ -openapi: 3.0.0 -info: - title: Jokesbapak2 Image API - description: > - Jokes Bapak2 is an image API that you can use for free! I've been seeing lots and lots of Indonesian dad jokes on Twitter, - Facebook and Instagram on early 2020. In a month, I made a Discord bot that provides the jokes. - But I thought, why not make it as an API? - version: 0.0.1 - contact: - name: Reinaldy Rafli - url: https://github.com/aldy505 - email: aldy505@tutanota.com - license: - name: GNU General Public License v3.0 - url: https://github.com/aldy505/jokes-bapak2/blob/master/LICENSE -servers: - - url: "https://jokesbapak2.reinaldyrafli.com/api/v1" - description: Production - - url: "https://jokesbapak2.reinaldyrafli.com/api" - description: Production - - url: "http://localhost:5000" - description: Development -paths: - /: - get: - tags: - - Jokes - summary: Get random Jokes Bapak2 image - description: Returns a different image (PNG, JPG, or GIF) for every call. - responses: - 200: - description: Image data - content: - "image/gif": {} - "image/png": {} - "image/jpeg": {} - put: - summary: Add a new joke into database - description: asd - tags: - - Jokes - requestBody: - description: asds - required: true - content: - application/json: - schema: - allOf: - - $ref: "#/components/schemas/request.auth" - - $ref: "#/components/schemas/request.joke" - responses: - 201: - description: Image has been added - content: - application/json: - schema: - $ref: "#/components/schemas/request.joke" - example: - link: https://link.to/image.jpg - 400: - description: Bad request - content: - application/json: - schema: - $ref: "#/components/schemas/response.error" - example: - error: URL provided is not a valid image - 403: - description: Must be authenticated to submit a joke - content: - application/json: - schema: - $ref: "#/components/schemas/response.error" - /id/{id}: - parameters: - - in: path - name: id - schema: - type: number - required: true - description: A number that represents image's ID - get: - summary: Get random Jokes Bapak2 image by ID - description: Returns consistent image for every call. - tags: - - Jokes - responses: - 200: - description: Image data - content: - "image/jpeg": {} - "image/png": {} - "image/gif": {} - 404: - description: Provided image ID was not found - content: - text/plain: - schema: - type: string - example: Requested ID was not found. - patch: - summary: Update a Joke with certain image ID - description: Returns consistent image for every call. - tags: - - Jokes - responses: - 200: - description: Sucessfully updated an image item - content: - application/json: - schema: - allOf: - - $ref: "#/components/schemas/response.confirmation" - - $ref: "#/components/schemas/request.joke" - 400: - description: Link provided is not a valid image - content: - application/json: - schema: - $ref: "#/components/schemas/response.error" - 403: - description: Must be authenticated to submit a joke - content: - application/json: - schema: - $ref: "#/components/schemas/response.error" - 406: - description: If the Joke ID does not exists - content: - application/json: - schema: - $ref: "#/components/schemas/response.error" - delete: - summary: Delete a Joke with certain image ID - description: hi - tags: - - Jokes - responses: - 200: - description: Sucessfully deleted an image item - content: - application/json: - schema: - $ref: "#/components/schemas/response.confirmation" - 403: - description: Must be authenticated to submit a joke - content: - application/json: - schema: - $ref: "#/components/schemas/response.error" - 406: - description: If the Joke ID does not exists - content: - application/json: - schema: - $ref: "#/components/schemas/response.error" - /today: - get: - summary: Get the joke of the day - description: A joke a day makes more of a dad out of you. - tags: - - Jokes - responses: - 200: - description: Image data - content: - "image/jpeg": {} - "image/png": {} - "image/gif": {} - /total: - get: - summary: Get total amount of jokes in database - tags: - - Jokes - responses: - 200: - description: Total jokes - content: - application/json: - schema: - $ref: "#/components/schemas/response.confirmation" - example: - message: "154" - /submit: - get: - summary: Get submitted Jokes - tags: - - Submission - parameters: - - name: author - in: query - required: false - description: Author to be queried - schema: - type: string - - name: approved - in: query - required: false - description: Whether query just approved jokes or not - schema: - type: boolean - - name: limit - in: query - required: false - schema: - type: number - - name: page - in: query - required: false - schema: - type: number - responses: - 200: - description: asd - content: - application/json: - schema: - type: object - properties: - count: - type: number - jokes: - type: array - items: - $ref: "#/components/schemas/response.submission" - post: - summary: Submit a joke - description: > - Must be in multipart/form-data format. - Author must be in the format of "Name <email>". - tags: - - Submission - requestBody: - content: - multipart/form-data: - schema: - properties: - link: - description: Image link - type: string - image: - description: Image data - type: string - author: - description: Person who submitted this - type: string - required: - - author - - image - - link - responses: - 201: - description: Joke successfully submitted - content: - application/json: - schema: - allOf: - - $ref: "#/components/schemas/response.confirmation" - - type: object - properties: - data: - $ref: "#/components/schemas/response.submission" - 400: - description: Invalid data was sent - content: - application/json: - schema: - $ref: "#/components/schemas/response.error" - /health: - get: - summary: Health check - description: Ping the databases to make sure everything's alright - tags: - - Health - responses: - 200: - description: Everything is okay - 403: - description: Something is not okay - content: - application/json: - schema: - $ref: "#/components/schemas/response.error" - -components: - schemas: - request.auth: - type: object - properties: - key: - type: string - token: - type: string - request.joke: - type: object - properties: - link: - type: string - response.confirmation: - type: object - properties: - message: - type: string - response.error: - type: object - properties: - error: - type: string - response.submission: - type: object - properties: - id: - type: number - link: - type: string - created_at: - type: string - author: - type: string - status: - type: number +openapi: 3.0.0 +info: + title: Jokesbapak2 Image API + description: > + Jokes Bapak2 is an image API that you can use for free! I've been seeing lots and lots of Indonesian dad jokes on Twitter, + Facebook and Instagram on early 2020. In a month, I made a Discord bot that provides the jokes. + But I thought, why not make it as an API? + version: 0.0.1 + contact: + name: Reinaldy Rafli + url: https://github.com/aldy505 + email: aldy505@tutanota.com + license: + name: GNU General Public License v3.0 + url: https://github.com/aldy505/jokes-bapak2/blob/master/LICENSE +servers: + - url: "https://jokesbapak2.reinaldyrafli.com/api/v1" + description: Production + - url: "https://jokesbapak2.reinaldyrafli.com/api" + description: Production + - url: "http://localhost:5000" + description: Development +paths: + /: + get: + tags: + - Jokes + summary: Get random Jokes Bapak2 image + description: Returns a different image (PNG, JPG, or GIF) for every call. + responses: + 200: + description: Image data + content: + "image/gif": { } + "image/png": { } + "image/jpeg": { } + put: + summary: Add a new joke into database + description: asd + tags: + - Jokes + requestBody: + description: asds + required: true + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/request.auth" + - $ref: "#/components/schemas/request.joke" + responses: + 201: + description: Image has been added + content: + application/json: + schema: + $ref: "#/components/schemas/request.joke" + example: + link: https://link.to/image.jpg + 400: + description: Bad request + content: + application/json: + schema: + $ref: "#/components/schemas/response.error" + example: + error: URL provided is not a valid image + 403: + description: Must be authenticated to submit a joke + content: + application/json: + schema: + $ref: "#/components/schemas/response.error" + /id/{id}: + parameters: + - in: path + name: id + schema: + type: number + required: true + description: A number that represents image's ID + get: + summary: Get random Jokes Bapak2 image by ID + description: Returns consistent image for every call. + tags: + - Jokes + responses: + 200: + description: Image data + content: + "image/jpeg": { } + "image/png": { } + "image/gif": { } + 404: + description: Provided image ID was not found + content: + text/plain: + schema: + type: string + example: Requested ID was not found. + patch: + summary: Update a Joke with certain image ID + description: Returns consistent image for every call. + tags: + - Jokes + responses: + 200: + description: Sucessfully updated an image item + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/response.confirmation" + - $ref: "#/components/schemas/request.joke" + 400: + description: Link provided is not a valid image + content: + application/json: + schema: + $ref: "#/components/schemas/response.error" + 403: + description: Must be authenticated to submit a joke + content: + application/json: + schema: + $ref: "#/components/schemas/response.error" + 406: + description: If the Joke ID does not exists + content: + application/json: + schema: + $ref: "#/components/schemas/response.error" + delete: + summary: Delete a Joke with certain image ID + description: hi + tags: + - Jokes + responses: + 200: + description: Sucessfully deleted an image item + content: + application/json: + schema: + $ref: "#/components/schemas/response.confirmation" + 403: + description: Must be authenticated to submit a joke + content: + application/json: + schema: + $ref: "#/components/schemas/response.error" + 406: + description: If the Joke ID does not exists + content: + application/json: + schema: + $ref: "#/components/schemas/response.error" + /today: + get: + summary: Get the joke of the day + description: A joke a day makes more of a dad out of you. + tags: + - Jokes + responses: + 200: + description: Image data + content: + "image/jpeg": { } + "image/png": { } + "image/gif": { } + /total: + get: + summary: Get total amount of jokes in database + tags: + - Jokes + responses: + 200: + description: Total jokes + content: + application/json: + schema: + $ref: "#/components/schemas/response.confirmation" + example: + message: "154" + /submit: + get: + summary: Get submitted Jokes + tags: + - Submission + parameters: + - name: author + in: query + required: false + description: Author to be queried + schema: + type: string + - name: approved + in: query + required: false + description: Whether query just approved jokes or not + schema: + type: boolean + - name: limit + in: query + required: false + schema: + type: number + - name: page + in: query + required: false + schema: + type: number + responses: + 200: + description: asd + content: + application/json: + schema: + type: object + properties: + count: + type: number + jokes: + type: array + items: + $ref: "#/components/schemas/response.submission" + post: + summary: Submit a joke + description: > + Must be in multipart/form-data format. + Author must be in the format of "Name <email>". + tags: + - Submission + requestBody: + content: + multipart/form-data: + schema: + properties: + link: + description: Image link + type: string + image: + description: Image data + type: string + author: + description: Person who submitted this + type: string + required: + - author + - image + - link + responses: + 201: + description: Joke successfully submitted + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/response.confirmation" + - type: object + properties: + data: + $ref: "#/components/schemas/response.submission" + 400: + description: Invalid data was sent + content: + application/json: + schema: + $ref: "#/components/schemas/response.error" + /health: + get: + summary: Health check + description: Ping the databases to make sure everything's alright + tags: + - Health + responses: + 200: + description: Everything is okay + 403: + description: Something is not okay + content: + application/json: + schema: + $ref: "#/components/schemas/response.error" + +components: + schemas: + request.auth: + type: object + properties: + key: + type: string + token: + type: string + request.joke: + type: object + properties: + link: + type: string + response.confirmation: + type: object + properties: + message: + type: string + response.error: + type: object + properties: + error: + type: string + response.submission: + type: object + properties: + id: + type: number + link: + type: string + created_at: + type: string + author: + type: string + status: + type: number diff --git a/api/go.mod b/api/go.mod index 37ce534..3377185 100644 --- a/api/go.mod +++ b/api/go.mod @@ -1,52 +1,38 @@ module jokes-bapak2-api -go 1.19 +go 1.20 require ( - github.com/aldy505/bob v0.0.4 - github.com/allegro/bigcache/v3 v3.0.1 - github.com/getsentry/sentry-go v0.11.0 - github.com/go-redis/redis/v8 v8.11.4 - github.com/jackc/pgx/v4 v4.13.0 + github.com/allegro/bigcache/v3 v3.1.0 + github.com/getsentry/sentry-go v0.23.0 + github.com/go-redis/redis/v8 v8.11.5 github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 - golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + golang.org/x/sys v0.10.0 // indirect ) require ( - github.com/go-chi/chi/v5 v5.0.7 - github.com/minio/minio-go/v7 v7.0.35 - github.com/rs/cors v1.8.2 + github.com/go-chi/chi/v5 v5.0.10 + github.com/minio/minio-go/v7 v7.0.61 + github.com/rs/cors v1.9.0 ) require ( github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/dustin/go-humanize v1.0.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.10.0 // indirect - github.com/jackc/pgio v1.0.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.1.1 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.8.1 // indirect - github.com/jackc/puddle v1.1.4 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.15.9 // indirect - github.com/klauspost/cpuid/v2 v2.1.0 // indirect - github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect - github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect + github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/minio/md5-simd v1.1.2 // indirect - github.com/minio/sha256-simd v1.0.0 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/rs/xid v1.4.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect - golang.org/x/text v0.3.7 // indirect - gopkg.in/ini.v1 v1.66.6 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + golang.org/x/crypto v0.11.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/text v0.11.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/api/go.sum b/api/go.sum index a3764ab..21a0afc 100644 --- a/api/go.sum +++ b/api/go.sum @@ -1,432 +1,79 @@ -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/aldy505/bob v0.0.4 h1:36lj6JUHxGp7yt672aKcC8gk6rXpIRO/aqclQ9aXDa8= -github.com/aldy505/bob v0.0.4/go.mod h1:uckrZqhg9zmbLA4MpKueIeQfrdriNqbmMalvf0+qPG4= -github.com/allegro/bigcache/v3 v3.0.1 h1:Q4Xl3chywXuJNOw7NV+MeySd3zGQDj4KCpkCg0te8mc= -github.com/allegro/bigcache/v3 v3.0.1/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/allegro/bigcache/v3 v3.1.0 h1:H2Vp8VOvxcrB91o86fUSVJFqeuz8kpyyB02eH3bSzwk= +github.com/allegro/bigcache/v3 v3.1.0/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/sentry-go v0.11.0 h1:qro8uttJGvNAMr5CLcFI9CHR0aDzXl0Vs3Pmw/oTPg8= -github.com/getsentry/sentry-go v0.11.0/go.mod h1:KBQIxiZAetw62Cj8Ri964vAEWVdgfaUCn30Q3bCvANo= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= -github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= +github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk= +github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.10.0 h1:4EYhlDVEMsJ30nNj0mmgwIUXoq7e9sMJrVC2ED6QlCU= -github.com/jackc/pgconn v1.10.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.8.1 h1:9k0IXtdJXHJbyAWQgbWr1lU+MEhPXZz6RIXxfR5oxXs= -github.com/jackc/pgtype v1.8.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.13.0 h1:JCjhT5vmhMAf/YwBHLvrBn4OGdIQBiFG6ym8Zmdx570= -github.com/jackc/pgx/v4 v4.13.0/go.mod h1:9P4X524sErlaxj0XSGZk7s+LD0eOyu1ZDUrrpznYDF0= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.4 h1:5Ey/o5IfV7dYX6Znivq+N9MdK1S18OJI5OJq6EAAADw= -github.com/jackc/puddle v1.1.4/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= -github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= -github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= -github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.35 h1:JuPPxWLdxQmNLSaS8AWZnO5HBadeI1xg6FGrEELQEVU= -github.com/minio/minio-go/v7 v7.0.35/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/minio/minio-go/v7 v7.0.61 h1:87c+x8J3jxQ5VUGimV9oHdpjsAvy3fhneEBKuoKEVUI= +github.com/minio/minio-go/v7 v7.0.61/go.mod h1:BTu8FcrEw+HidY0zd/0eny43QnVNkXRPXrLXFuQBHXg= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= -github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/api/handler/joke/get.go b/api/handler/joke/get.go index fb9edea..29ecf7b 100644 --- a/api/handler/joke/get.go +++ b/api/handler/joke/get.go @@ -1,10 +1,11 @@ package joke import ( - core "jokes-bapak2-api/core/joke" "net/http" "strconv" + core "jokes-bapak2-api/core/joke" + "github.com/go-chi/chi/v5" ) diff --git a/api/handler/joke/total.go b/api/handler/joke/total.go index bc250f5..c6e41ca 100644 --- a/api/handler/joke/total.go +++ b/api/handler/joke/total.go @@ -1,9 +1,10 @@ package joke import ( - core "jokes-bapak2-api/core/joke" "net/http" "strconv" + + core "jokes-bapak2-api/core/joke" ) // TotalJokes provides a HTTP handler for acquiring total jokes diff --git a/api/main.go b/api/main.go index 44167b1..8c7cd19 100644 --- a/api/main.go +++ b/api/main.go @@ -1,182 +1,181 @@ -package main - -import ( - "errors" - "log" - "net" - "net/http" - "os" - "os/signal" - - "context" - "jokes-bapak2-api/core/joke" - "jokes-bapak2-api/routes" - - "github.com/go-redis/redis/v8" - "github.com/minio/minio-go/v7" - "github.com/minio/minio-go/v7/pkg/credentials" - - "time" - - "github.com/allegro/bigcache/v3" - "github.com/getsentry/sentry-go" - "github.com/go-chi/chi/v5" - "github.com/rs/cors" -) - -func main() { - redisURL, ok := os.LookupEnv("REDIS_URL") - if !ok { - redisURL = "redis://@localhost:6379" - } - - minioHost, ok := os.LookupEnv("MINIO_HOST") - if !ok { - minioHost = "localhost:9000" - } - - minioRegion, ok := os.LookupEnv("MINIO_REGION") - if !ok { - minioRegion = "" - } - - minioSecure, ok := os.LookupEnv("MINIO_SECURE") - if !ok { - minioSecure = "false" - } - - minioID, ok := os.LookupEnv("MINIO_ACCESS_ID") - if !ok { - minioID = "minio" - } - - minioSecret, ok := os.LookupEnv("MINIO_SECRET_KEY") - if !ok { - minioSecret = "password" - } - - minioToken, ok := os.LookupEnv("MINIO_TOKEN") - if !ok { - minioToken = "" - } - - sentryDsn, ok := os.LookupEnv("SENTRY_DSN") - if !ok { - sentryDsn = "" - } - - port, ok := os.LookupEnv("PORT") - if !ok { - port = "5000" - } - - hostname, ok := os.LookupEnv("HOSTNAME") - if !ok { - hostname = "127.0.0.1" - } - - environment, ok := os.LookupEnv("ENVIRONMENT") - if !ok { - environment = "development" - } - - // Setup In Memory - memory, err := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute)) - if err != nil { - log.Panicln(err) - } - defer memory.Close() - - // Setup MinIO - minioClient, err := minio.New(minioHost, &minio.Options{ - Creds: credentials.NewStaticV4(minioID, minioSecret, minioToken), - Region: minioRegion, - Secure: minioSecure == "true", - }) - if err != nil { - log.Fatalf("setting up minio client: %s", err.Error()) - return - } - - parsedRedisURL, err := redis.ParseURL(redisURL) - if err != nil { - log.Fatalf("parsing redis url: %s", err.Error()) - return - } - - redisClient := redis.NewClient(parsedRedisURL) - defer func() { - err := redisClient.Close() - if err != nil { - log.Printf("closing redis client: %s", err.Error()) - } - }() - - // Setup Sentry - err = sentry.Init(sentry.ClientOptions{ - Dsn: sentryDsn, - Environment: environment, - AttachStacktrace: true, - // Enable printing of SDK debug messages. - // Useful when getting started or trying to figure something out. - Debug: environment != "production", - }) - if err != nil { - log.Fatalf("setting up sentry: %s", err.Error()) - return - } - defer sentry.Flush(2 * time.Second) - - setupCtx, setupCancel := context.WithDeadline(context.Background(), time.Now().Add(time.Minute*4)) - defer setupCancel() - - _, _, err = joke.GetTodaysJoke(setupCtx, minioClient, redisClient, memory) - if err != nil { - log.Fatalf("getting initial joke data: %s", err.Error()) - return - } - - healthRouter := routes.Health(minioClient, redisClient) - jokeRouter := routes.Joke(minioClient, redisClient, memory) - - router := chi.NewRouter() - - router.Use(cors.New(cors.Options{ - AllowedMethods: []string{http.MethodGet}, - AllowCredentials: false, - MaxAge: int(60 * 60 * 24 * 365), - Debug: false, - }).Handler) - - router.Mount("/health", healthRouter) - router.Mount("/", jokeRouter) - - server := &http.Server{ - Handler: router, - Addr: net.JoinHostPort(hostname, port), - ReadTimeout: time.Minute, - WriteTimeout: time.Minute, - IdleTimeout: time.Second * 30, - ReadHeaderTimeout: time.Minute, - } - - exitSignal := make(chan os.Signal, 1) - signal.Notify(exitSignal, os.Interrupt) - - go func() { - err := server.ListenAndServe() - if err != nil && !errors.Is(err, http.ErrServerClosed) { - log.Fatalf("listening http server: %v", err) - } - }() - - <-exitSignal - - shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), time.Second*30) - defer shutdownCancel() - - err = server.Shutdown(shutdownCtx) - if err != nil { - log.Printf("shutting down http server: %v", err) - } -} +package main + +import ( + "context" + "errors" + "log" + "net" + "net/http" + "os" + "os/signal" + "time" + + "jokes-bapak2-api/core/joke" + "jokes-bapak2-api/routes" + + "github.com/go-redis/redis/v8" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" + + "github.com/allegro/bigcache/v3" + "github.com/getsentry/sentry-go" + "github.com/go-chi/chi/v5" + "github.com/rs/cors" +) + +func main() { + redisURL, ok := os.LookupEnv("REDIS_URL") + if !ok { + redisURL = "redis://@localhost:6379" + } + + minioHost, ok := os.LookupEnv("MINIO_HOST") + if !ok { + minioHost = "localhost:9000" + } + + minioRegion, ok := os.LookupEnv("MINIO_REGION") + if !ok { + minioRegion = "" + } + + minioSecure, ok := os.LookupEnv("MINIO_SECURE") + if !ok { + minioSecure = "false" + } + + minioID, ok := os.LookupEnv("MINIO_ACCESS_ID") + if !ok { + minioID = "minio" + } + + minioSecret, ok := os.LookupEnv("MINIO_SECRET_KEY") + if !ok { + minioSecret = "password" + } + + minioToken, ok := os.LookupEnv("MINIO_TOKEN") + if !ok { + minioToken = "" + } + + sentryDsn, ok := os.LookupEnv("SENTRY_DSN") + if !ok { + sentryDsn = "" + } + + port, ok := os.LookupEnv("PORT") + if !ok { + port = "5000" + } + + hostname, ok := os.LookupEnv("HOSTNAME") + if !ok { + hostname = "127.0.0.1" + } + + environment, ok := os.LookupEnv("ENVIRONMENT") + if !ok { + environment = "development" + } + + // Setup In Memory + memory, err := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute)) + if err != nil { + log.Panicln(err) + } + defer memory.Close() + + // Setup MinIO + minioClient, err := minio.New(minioHost, &minio.Options{ + Creds: credentials.NewStaticV4(minioID, minioSecret, minioToken), + Region: minioRegion, + Secure: minioSecure == "true", + }) + if err != nil { + log.Fatalf("setting up minio client: %s", err.Error()) + return + } + + parsedRedisURL, err := redis.ParseURL(redisURL) + if err != nil { + log.Fatalf("parsing redis url: %s", err.Error()) + return + } + + redisClient := redis.NewClient(parsedRedisURL) + defer func() { + err := redisClient.Close() + if err != nil { + log.Printf("closing redis client: %s", err.Error()) + } + }() + + // Setup Sentry + err = sentry.Init(sentry.ClientOptions{ + Dsn: sentryDsn, + Environment: environment, + AttachStacktrace: true, + // Enable printing of SDK debug messages. + // Useful when getting started or trying to figure something out. + Debug: environment != "production", + }) + if err != nil { + log.Fatalf("setting up sentry: %s", err.Error()) + return + } + defer sentry.Flush(2 * time.Second) + + setupCtx, setupCancel := context.WithDeadline(context.Background(), time.Now().Add(time.Minute*4)) + defer setupCancel() + + _, _, err = joke.GetTodaysJoke(setupCtx, minioClient, redisClient, memory) + if err != nil { + log.Fatalf("getting initial joke data: %s", err.Error()) + return + } + + healthRouter := routes.Health(minioClient, redisClient) + jokeRouter := routes.Joke(minioClient, redisClient, memory) + + router := chi.NewRouter() + + router.Use(cors.New(cors.Options{ + AllowedMethods: []string{http.MethodGet}, + AllowCredentials: false, + MaxAge: int(60 * 60 * 24 * 365), + Debug: false, + }).Handler) + + router.Mount("/health", healthRouter) + router.Mount("/", jokeRouter) + + server := &http.Server{ + Handler: router, + Addr: net.JoinHostPort(hostname, port), + ReadTimeout: time.Minute, + WriteTimeout: time.Minute, + IdleTimeout: time.Second * 30, + ReadHeaderTimeout: time.Minute, + } + + exitSignal := make(chan os.Signal, 1) + signal.Notify(exitSignal, os.Interrupt) + + go func() { + err := server.ListenAndServe() + if err != nil && !errors.Is(err, http.ErrServerClosed) { + log.Fatalf("listening http server: %v", err) + } + }() + + <-exitSignal + + shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), time.Second*30) + defer shutdownCancel() + + err = server.Shutdown(shutdownCtx) + if err != nil { + log.Printf("shutting down http server: %v", err) + } +} diff --git a/api/platform/database/create.go b/api/platform/database/create.go deleted file mode 100644 index 421dd86..0000000 --- a/api/platform/database/create.go +++ /dev/null @@ -1,144 +0,0 @@ -package database - -import ( - "context" - - "github.com/aldy505/bob" - "github.com/jackc/pgx/v4/pgxpool" -) - -// Setup the table connection, create table if not exists -func Populate(db *pgxpool.Pool, ctx context.Context) error { - err := setupAuthTable(db, ctx) - if err != nil { - return err - } - - err = setupJokesTable(db, ctx) - if err != nil { - return err - } - - err = setupSubmissionTable(db, ctx) - if err != nil { - return err - } - - return nil -} - -func setupAuthTable(db *pgxpool.Pool, ctx context.Context) error { - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - // Check if table exists - var tableAuthExists bool - err = conn.QueryRow(ctx, `SELECT EXISTS ( - SELECT FROM information_schema.tables - WHERE table_schema = 'public' - AND table_name = 'administrators' - );`).Scan(&tableAuthExists) - if err != nil { - return err - } - - if !tableAuthExists { - sql, _, err := bob. - CreateTable("administrators"). - AddColumn(bob.ColumnDef{Name: "id", Type: "SERIAL", Extras: []string{"PRIMARY KEY"}}). - StringColumn("key", "NOT NULL", "UNIQUE"). - TextColumn("token"). - StringColumn("last_used"). - ToSql() - if err != nil { - return err - } - - _, err = conn.Exec(ctx, sql) - if err != nil { - return err - } - } - return nil -} - -func setupJokesTable(db *pgxpool.Pool, ctx context.Context) error { - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - // Check if table exists - var tableJokesExists bool - err = conn.QueryRow(ctx, `SELECT EXISTS ( - SELECT FROM information_schema.tables - WHERE table_schema = 'public' - AND table_name = 'jokesbapak2' - );`).Scan(&tableJokesExists) - if err != nil { - return err - } - - if !tableJokesExists { - sql, _, err := bob. - CreateTable("jokesbapak2"). - AddColumn(bob.ColumnDef{Name: "id", Type: "SERIAL", Extras: []string{"PRIMARY KEY"}}). - TextColumn("link", "UNIQUE"). - AddColumn(bob.ColumnDef{Name: "creator", Type: "INT", Extras: []string{"NOT NULL", "REFERENCES \"administrators\" (\"id\")"}}). - ToSql() - if err != nil { - return err - } - - _, err = conn.Exec(ctx, sql) - if err != nil { - return err - } - } - - return nil -} - -func setupSubmissionTable(db *pgxpool.Pool, ctx context.Context) error { - conn, err := db.Acquire(ctx) - if err != nil { - return err - } - defer conn.Release() - - //Check if table exists - var tableSubmissionExists bool - err = conn.QueryRow(ctx, `SELECT EXISTS ( - SELECT FROM information_schema.tables - WHERE table_schema = 'public' - AND table_name = 'submission' - );`).Scan(&tableSubmissionExists) - if err != nil { - return err - } - - if !tableSubmissionExists { - sql, _, err := bob. - CreateTable("submission"). - AddColumn(bob.ColumnDef{Name: "id", Type: "SERIAL", Extras: []string{"PRIMARY KEY"}}). - TextColumn("link", "UNIQUE", "NOT NULL"). - StringColumn("created_at"). - StringColumn("author", "NOT NULL"). - AddColumn(bob.ColumnDef{Name: "status", Type: "SMALLINT", Extras: []string{"DEFAULT 0"}}). - ToSql() - if err != nil { - return err - } - - _, err = conn.Exec(ctx, sql) - if err != nil { - return err - } - } - - return nil -} diff --git a/api/platform/database/placeholder.sql b/api/platform/database/placeholder.sql deleted file mode 100644 index 07866bf..0000000 --- a/api/platform/database/placeholder.sql +++ /dev/null @@ -1,21 +0,0 @@ --- Access the data from your HTTP Request software (Postman or Insomnia) --- with this auth: --- key: test --- token: password - -INSERT INTO "administrators" ("id", "key", "token", "last_used") VALUES -(1, 'test', '$argon2id$v=19$m=65536,t=16,p=4$3a08c79fbf2222467a623df9a9ebf75802c65a4f9be36eb1df2f5d2052d53cb7$ce434bd38f7ba1fc1f2eb773afb8a1f7f2dad49140803ac6cb9d7256ce9826fb3b4afa1e2488da511c852fc6c33a76d5657eba6298a8e49d617b9972645b7106', ''); - --- 10 jokes is enough right? - -INSERT INTO "jokesbapak2" ("link", "creator") VALUES -('https://picsum.photos/id/1000/500/500', 1), -('https://picsum.photos/id/1001/500/500', 1), -('https://picsum.photos/id/1002/500/500', 1), -('https://picsum.photos/id/1003/500/500', 1), -('https://picsum.photos/id/1004/500/500', 1), -('https://picsum.photos/id/1005/500/500', 1), -('https://picsum.photos/id/1006/500/500', 1), -('https://picsum.photos/id/1010/500/500', 1), -('https://picsum.photos/id/1008/500/500', 1), -('https://picsum.photos/id/1009/500/500', 1); \ No newline at end of file diff --git a/api/utils/array_test.go b/api/utils/array_test.go index 74c36af..51b1897 100644 --- a/api/utils/array_test.go +++ b/api/utils/array_test.go @@ -1,8 +1,9 @@ package utils_test import ( - "jokes-bapak2-api/utils" "testing" + + "jokes-bapak2-api/utils" ) func TestIsIn_True(t *testing.T) { diff --git a/api/utils/date_test.go b/api/utils/date_test.go index de59927..86306c2 100644 --- a/api/utils/date_test.go +++ b/api/utils/date_test.go @@ -1,9 +1,10 @@ package utils_test import ( - "jokes-bapak2-api/utils" "testing" "time" + + "jokes-bapak2-api/utils" ) func TestIsToday_Today(t *testing.T) { diff --git a/api/utils/parse_test.go b/api/utils/parse_test.go index 4388182..99191fc 100644 --- a/api/utils/parse_test.go +++ b/api/utils/parse_test.go @@ -1,9 +1,10 @@ package utils_test import ( - "jokes-bapak2-api/utils" "strings" "testing" + + "jokes-bapak2-api/utils" ) func TestParseToJSONBody(t *testing.T) { diff --git a/api/utils/random_test.go b/api/utils/random_test.go index c891510..54fedd8 100644 --- a/api/utils/random_test.go +++ b/api/utils/random_test.go @@ -1,8 +1,9 @@ package utils_test import ( - "jokes-bapak2-api/utils" "testing" + + "jokes-bapak2-api/utils" ) func TestRandomString_Valid(t *testing.T) { diff --git a/api/utils/request_test.go b/api/utils/request_test.go index 95750bb..97a2af5 100644 --- a/api/utils/request_test.go +++ b/api/utils/request_test.go @@ -1,9 +1,10 @@ package utils_test import ( - "jokes-bapak2-api/utils" "net/http" "testing" + + "jokes-bapak2-api/utils" ) func TestRequest_Get(t *testing.T) { diff --git a/benchmark/README.md b/benchmark/README.md index 4b43349..0ad0856 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -14,6 +14,6 @@ $ yarn start ## Used package -| Name | Version | Type | -| --- | --- | --- | +| Name | Version | Type | +|---------------------------------------------------------------|----------|-------------------| | [mcollina/autocannon](https://github.com/mcollina/autocannon) | `v7.4.0` | Benchmarking Tool | \ No newline at end of file diff --git a/client/.eslintrc.cjs b/client/.eslintrc.cjs index fba3861..71afe57 100644 --- a/client/.eslintrc.cjs +++ b/client/.eslintrc.cjs @@ -1,20 +1,30 @@ module.exports = { - root: true, - parser: '@typescript-eslint/parser', - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], - plugins: ['svelte3', '@typescript-eslint'], - ignorePatterns: ['*.cjs'], - overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], - settings: { - 'svelte3/typescript': () => require('typescript') - }, - parserOptions: { - sourceType: 'module', - ecmaVersion: 2019 - }, - env: { - browser: true, - es2017: true, - node: true - } + root: true, + parser: '@typescript-eslint/parser', + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier', 'plugin:svelte/prettier'], + plugins: ['@typescript-eslint'], + ignorePatterns: ['*.cjs'], + settings: { + 'svelte3/typescript': () => require('typescript') + }, + overrides: [ + { + files: ["*.svelte"], + parser: "svelte-eslint-parser", + // Parse the ` - goto('/')} class="hover:cursor-pointer flex-5 font-bold text-2xl">Jokesbapak2 - goto('/why')} class="navigation-item">{$_('navigation.why')} - goto('/guide')} class="navigation-item">{$_('navigation.guide')} - goto('/api')} class="navigation-item">{$_('navigation.api')} + goto('/')}>Jokesbapak2 + goto('/why')}>{$_('navigation.why')} + goto('/guide')}>{$_('navigation.guide')} + goto('/api')}>{$_('navigation.api')} (open = !open)} style="color: {open ? menuColor : burgerColor};" > - + @@ -99,24 +99,30 @@ .navigation-item { @apply hidden 'md:block' text-center 'md:flex-1' duration-300 transition ease-in-out py-2 'md:py-0' 'md:opacity-50' 'hover:cursor-pointer' 'hover:scale-110' 'hover:opacity-100'; } + .top-of-the-world { @apply fixed z-20 -top-4 left-0 right-0 bottom-0; } + svg line { stroke: currentColor; stroke-width: 3; } + .open { @apply z-30 fixed right-12; } + /* rotate the top line */ .open #top { transform: translate(10px, 0px) rotate(45deg); } + /* hide the middle */ .open #mid { opacity: 0; } + /* rotate the bottom line */ .open #bot { transform: translate(-15px, 8px) rotate(-45deg); diff --git a/client/src/components/notice.svelte b/client/src/components/notice.svelte index 7ded7fb..53777e0 100644 --- a/client/src/components/notice.svelte +++ b/client/src/components/notice.svelte @@ -7,6 +7,8 @@ > {emoji} - + + + diff --git a/client/src/lib/locale.ts b/client/src/lib/locale.ts index 719c4d1..6ae974a 100644 --- a/client/src/lib/locale.ts +++ b/client/src/lib/locale.ts @@ -1,4 +1,4 @@ -import { init, getLocaleFromNavigator, addMessages, getLocaleFromQueryString } from 'svelte-i18n'; +import { addMessages, getLocaleFromNavigator, getLocaleFromQueryString, init } from 'svelte-i18n'; import en from '../languages/en.json'; import id from '../languages/id.json'; diff --git a/client/src/routes/+error.svelte b/client/src/routes/+error.svelte index 918b335..63211ad 100644 --- a/client/src/routes/+error.svelte +++ b/client/src/routes/+error.svelte @@ -1,4 +1,4 @@ - @@ -10,7 +10,7 @@ - + {$_('footer.available')} - {$_('footer.github')}. + {$_('footer.github')}. {$_('footer.language')} - {$_('footer.english')} + {$_('footer.english')} | - {$_('footer.indonesian')}. + {$_('footer.indonesian')}. diff --git a/client/src/routes/+page.svelte b/client/src/routes/+page.svelte index 811e7f3..03a7294 100644 --- a/client/src/routes/+page.svelte +++ b/client/src/routes/+page.svelte @@ -12,13 +12,13 @@ {$_('meta.title')} - {$_('meta.tagline')} - - - - - - - + + + + + + + @@ -29,7 +29,7 @@ - + $ curl -XGET 'https://jokesbapak2.reinaldyrafli.com/api/' diff --git a/client/src/routes/api/+page.svelte b/client/src/routes/api/+page.svelte index 0480c01..14ffbfa 100644 --- a/client/src/routes/api/+page.svelte +++ b/client/src/routes/api/+page.svelte @@ -25,13 +25,13 @@ {$_('navigation.api')} - {$_('meta.title')} - - - - - - - + + + + + + + @@ -70,12 +70,14 @@ @apply font-bold; @apply py-4; } + h2 { @apply text-2xl; @apply font-bold; @apply pt-6; @apply pb-1; } + p { @apply text-base; @apply opacity-80; diff --git a/client/src/routes/guide/+page.svelte b/client/src/routes/guide/+page.svelte index 4710b2b..58f5fb8 100644 --- a/client/src/routes/guide/+page.svelte +++ b/client/src/routes/guide/+page.svelte @@ -7,13 +7,13 @@ {$_('navigation.guide')} - {$_('meta.title')} - - - - - - - + + + + + + + @@ -71,6 +71,7 @@ @apply dark\:text-dodger-200; @apply text-dodger-700; } + section { @apply pt-6; } diff --git a/client/src/routes/why/+page.svelte b/client/src/routes/why/+page.svelte index ac16d36..d38411c 100644 --- a/client/src/routes/why/+page.svelte +++ b/client/src/routes/why/+page.svelte @@ -4,13 +4,13 @@ {$_('navigation.why')} - {$_('meta.title')} - - - - - - - + + + + + + + diff --git a/client/static/favicon.svg b/client/static/favicon.svg index a900345..ef0e20e 100644 --- a/client/static/favicon.svg +++ b/client/static/favicon.svg @@ -1,7 +1,8 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - + - - + diff --git a/client/svelte.config.js b/client/svelte.config.js index 29f8fc7..66b11da 100644 --- a/client/svelte.config.js +++ b/client/svelte.config.js @@ -1,4 +1,4 @@ -import preprocess from 'svelte-preprocess'; +import { vitePreprocess } from '@sveltejs/kit/vite'; import adapter from '@sveltejs/adapter-node'; import { windi } from 'svelte-windicss-preprocess'; @@ -11,7 +11,7 @@ const config = { configPath: './windi.config.ts', preflights: false, }), - preprocess({ postcss: false }), + vitePreprocess({ postcss: false }), ], kit: { diff --git a/docker-compose.yml b/docker-compose.yml index e30c71c..37ca48d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -76,7 +76,7 @@ services: condition: service_healthy cache: - image: redis:6.2.7-alpine + image: redis:7.0.12-alpine3.18 ports: - 6379:6379 healthcheck:
{$_('footer.available')} - {$_('footer.github')}. + {$_('footer.github')}.
{$_('footer.language')} - {$_('footer.english')} + {$_('footer.english')} | - {$_('footer.indonesian')}. + {$_('footer.indonesian')}.
diff --git a/client/src/routes/api/+page.svelte b/client/src/routes/api/+page.svelte index 0480c01..14ffbfa 100644 --- a/client/src/routes/api/+page.svelte +++ b/client/src/routes/api/+page.svelte @@ -25,13 +25,13 @@ {$_('navigation.api')} - {$_('meta.title')} - - - - - - - + + + + + + + @@ -70,12 +70,14 @@ @apply font-bold; @apply py-4; } + h2 { @apply text-2xl; @apply font-bold; @apply pt-6; @apply pb-1; } + p { @apply text-base; @apply opacity-80; diff --git a/client/src/routes/guide/+page.svelte b/client/src/routes/guide/+page.svelte index 4710b2b..58f5fb8 100644 --- a/client/src/routes/guide/+page.svelte +++ b/client/src/routes/guide/+page.svelte @@ -7,13 +7,13 @@ {$_('navigation.guide')} - {$_('meta.title')} - - - - - - - + + + + + + + @@ -71,6 +71,7 @@ @apply dark\:text-dodger-200; @apply text-dodger-700; } + section { @apply pt-6; } diff --git a/client/src/routes/why/+page.svelte b/client/src/routes/why/+page.svelte index ac16d36..d38411c 100644 --- a/client/src/routes/why/+page.svelte +++ b/client/src/routes/why/+page.svelte @@ -4,13 +4,13 @@ {$_('navigation.why')} - {$_('meta.title')} - - - - - - - + + + + + + + diff --git a/client/static/favicon.svg b/client/static/favicon.svg index a900345..ef0e20e 100644 --- a/client/static/favicon.svg +++ b/client/static/favicon.svg @@ -1,7 +1,8 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - + - - + diff --git a/client/svelte.config.js b/client/svelte.config.js index 29f8fc7..66b11da 100644 --- a/client/svelte.config.js +++ b/client/svelte.config.js @@ -1,4 +1,4 @@ -import preprocess from 'svelte-preprocess'; +import { vitePreprocess } from '@sveltejs/kit/vite'; import adapter from '@sveltejs/adapter-node'; import { windi } from 'svelte-windicss-preprocess'; @@ -11,7 +11,7 @@ const config = { configPath: './windi.config.ts', preflights: false, }), - preprocess({ postcss: false }), + vitePreprocess({ postcss: false }), ], kit: { diff --git a/docker-compose.yml b/docker-compose.yml index e30c71c..37ca48d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -76,7 +76,7 @@ services: condition: service_healthy cache: - image: redis:6.2.7-alpine + image: redis:7.0.12-alpine3.18 ports: - 6379:6379 healthcheck: