diff --git a/codigos/backend/.editorconfig b/codigos/backend/.editorconfig
new file mode 100644
index 0000000..8ab2e76
--- /dev/null
+++ b/codigos/backend/.editorconfig
@@ -0,0 +1,307 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = false
+max_line_length = 120
+tab_width = 4
+ij_continuation_indent_size = 8
+ij_formatter_off_tag = @formatter:off
+ij_formatter_on_tag = @formatter:on
+ij_formatter_tags_enabled = false
+ij_smart_tabs = false
+ij_wrap_on_typing = false
+
+[*.java]
+ij_java_align_consecutive_assignments = false
+ij_java_align_consecutive_variable_declarations = false
+ij_java_align_group_field_declarations = false
+ij_java_align_multiline_annotation_parameters = false
+ij_java_align_multiline_array_initializer_expression = false
+ij_java_align_multiline_assignment = false
+ij_java_align_multiline_binary_operation = false
+ij_java_align_multiline_chained_methods = false
+ij_java_align_multiline_extends_list = false
+ij_java_align_multiline_for = true
+ij_java_align_multiline_method_parentheses = false
+ij_java_align_multiline_parameters = true
+ij_java_align_multiline_parameters_in_calls = false
+ij_java_align_multiline_parenthesized_expression = false
+ij_java_align_multiline_records = true
+ij_java_align_multiline_resources = true
+ij_java_align_multiline_ternary_operation = false
+ij_java_align_multiline_text_blocks = false
+ij_java_align_multiline_throws_list = false
+ij_java_align_subsequent_simple_methods = false
+ij_java_align_throws_keyword = false
+ij_java_annotation_parameter_wrap = off
+ij_java_array_initializer_new_line_after_left_brace = false
+ij_java_array_initializer_right_brace_on_new_line = false
+ij_java_array_initializer_wrap = off
+ij_java_assert_statement_colon_on_next_line = false
+ij_java_assert_statement_wrap = off
+ij_java_assignment_wrap = off
+ij_java_binary_operation_sign_on_next_line = false
+ij_java_binary_operation_wrap = off
+ij_java_blank_lines_after_anonymous_class_header = 0
+ij_java_blank_lines_after_class_header = 0
+ij_java_blank_lines_after_imports = 1
+ij_java_blank_lines_after_package = 1
+ij_java_blank_lines_around_class = 1
+ij_java_blank_lines_around_field = 0
+ij_java_blank_lines_around_field_in_interface = 0
+ij_java_blank_lines_around_initializer = 1
+ij_java_blank_lines_around_method = 1
+ij_java_blank_lines_around_method_in_interface = 1
+ij_java_blank_lines_before_class_end = 0
+ij_java_blank_lines_before_imports = 1
+ij_java_blank_lines_before_method_body = 0
+ij_java_blank_lines_before_package = 0
+ij_java_block_brace_style = end_of_line
+ij_java_block_comment_at_first_column = true
+ij_java_call_parameters_new_line_after_left_paren = false
+ij_java_call_parameters_right_paren_on_new_line = false
+ij_java_call_parameters_wrap = off
+ij_java_case_statement_on_separate_line = true
+ij_java_catch_on_new_line = false
+ij_java_class_annotation_wrap = split_into_lines
+ij_java_class_brace_style = end_of_line
+ij_java_class_count_to_use_import_on_demand = 5
+ij_java_class_names_in_javadoc = 1
+ij_java_do_not_indent_top_level_class_members = false
+ij_java_do_not_wrap_after_single_annotation = false
+ij_java_do_while_brace_force = never
+ij_java_doc_add_blank_line_after_description = true
+ij_java_doc_add_blank_line_after_param_comments = false
+ij_java_doc_add_blank_line_after_return = false
+ij_java_doc_add_p_tag_on_empty_lines = true
+ij_java_doc_align_exception_comments = true
+ij_java_doc_align_param_comments = true
+ij_java_doc_do_not_wrap_if_one_line = false
+ij_java_doc_enable_formatting = true
+ij_java_doc_enable_leading_asterisks = true
+ij_java_doc_indent_on_continuation = false
+ij_java_doc_keep_empty_lines = true
+ij_java_doc_keep_empty_parameter_tag = true
+ij_java_doc_keep_empty_return_tag = true
+ij_java_doc_keep_empty_throws_tag = true
+ij_java_doc_keep_invalid_tags = true
+ij_java_doc_param_description_on_new_line = false
+ij_java_doc_preserve_line_breaks = false
+ij_java_doc_use_throws_not_exception_tag = true
+ij_java_else_on_new_line = false
+ij_java_enum_constants_wrap = off
+ij_java_extends_keyword_wrap = off
+ij_java_extends_list_wrap = off
+ij_java_field_annotation_wrap = split_into_lines
+ij_java_finally_on_new_line = false
+ij_java_for_brace_force = never
+ij_java_for_statement_new_line_after_left_paren = false
+ij_java_for_statement_right_paren_on_new_line = false
+ij_java_for_statement_wrap = off
+ij_java_generate_final_locals = false
+ij_java_generate_final_parameters = false
+ij_java_if_brace_force = never
+ij_java_imports_layout = *,|,javax.**,java.**,|,$*
+ij_java_indent_case_from_switch = true
+ij_java_insert_inner_class_imports = false
+ij_java_insert_override_annotation = true
+ij_java_keep_blank_lines_before_right_brace = 2
+ij_java_keep_blank_lines_between_package_declaration_and_header = 2
+ij_java_keep_blank_lines_in_code = 2
+ij_java_keep_blank_lines_in_declarations = 2
+ij_java_keep_control_statement_in_one_line = true
+ij_java_keep_first_column_comment = true
+ij_java_keep_indents_on_empty_lines = false
+ij_java_keep_line_breaks = true
+ij_java_keep_multiple_expressions_in_one_line = false
+ij_java_keep_simple_blocks_in_one_line = false
+ij_java_keep_simple_classes_in_one_line = false
+ij_java_keep_simple_lambdas_in_one_line = false
+ij_java_keep_simple_methods_in_one_line = false
+ij_java_label_indent_absolute = false
+ij_java_label_indent_size = 0
+ij_java_lambda_brace_style = end_of_line
+ij_java_layout_static_imports_separately = true
+ij_java_line_comment_add_space = false
+ij_java_line_comment_at_first_column = true
+ij_java_method_annotation_wrap = split_into_lines
+ij_java_method_brace_style = end_of_line
+ij_java_method_call_chain_wrap = off
+ij_java_method_parameters_new_line_after_left_paren = false
+ij_java_method_parameters_right_paren_on_new_line = false
+ij_java_method_parameters_wrap = off
+ij_java_modifier_list_wrap = false
+ij_java_names_count_to_use_import_on_demand = 3
+ij_java_new_line_after_lparen_in_record_header = false
+ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
+ij_java_parameter_annotation_wrap = off
+ij_java_parentheses_expression_new_line_after_left_paren = false
+ij_java_parentheses_expression_right_paren_on_new_line = false
+ij_java_place_assignment_sign_on_next_line = false
+ij_java_prefer_longer_names = true
+ij_java_prefer_parameters_wrap = false
+ij_java_record_components_wrap = normal
+ij_java_repeat_synchronized = true
+ij_java_replace_instanceof_and_cast = false
+ij_java_replace_null_check = true
+ij_java_replace_sum_lambda_with_method_ref = true
+ij_java_resource_list_new_line_after_left_paren = false
+ij_java_resource_list_right_paren_on_new_line = false
+ij_java_resource_list_wrap = off
+ij_java_rparen_on_new_line_in_record_header = false
+ij_java_space_after_closing_angle_bracket_in_type_argument = false
+ij_java_space_after_colon = true
+ij_java_space_after_comma = true
+ij_java_space_after_comma_in_type_arguments = true
+ij_java_space_after_for_semicolon = true
+ij_java_space_after_quest = true
+ij_java_space_after_type_cast = true
+ij_java_space_before_annotation_array_initializer_left_brace = false
+ij_java_space_before_annotation_parameter_list = false
+ij_java_space_before_array_initializer_left_brace = false
+ij_java_space_before_catch_keyword = true
+ij_java_space_before_catch_left_brace = true
+ij_java_space_before_catch_parentheses = true
+ij_java_space_before_class_left_brace = true
+ij_java_space_before_colon = true
+ij_java_space_before_colon_in_foreach = true
+ij_java_space_before_comma = false
+ij_java_space_before_do_left_brace = true
+ij_java_space_before_else_keyword = true
+ij_java_space_before_else_left_brace = true
+ij_java_space_before_finally_keyword = true
+ij_java_space_before_finally_left_brace = true
+ij_java_space_before_for_left_brace = true
+ij_java_space_before_for_parentheses = true
+ij_java_space_before_for_semicolon = false
+ij_java_space_before_if_left_brace = true
+ij_java_space_before_if_parentheses = true
+ij_java_space_before_method_call_parentheses = false
+ij_java_space_before_method_left_brace = true
+ij_java_space_before_method_parentheses = false
+ij_java_space_before_opening_angle_bracket_in_type_parameter = false
+ij_java_space_before_quest = true
+ij_java_space_before_switch_left_brace = true
+ij_java_space_before_switch_parentheses = true
+ij_java_space_before_synchronized_left_brace = true
+ij_java_space_before_synchronized_parentheses = true
+ij_java_space_before_try_left_brace = true
+ij_java_space_before_try_parentheses = true
+ij_java_space_before_type_parameter_list = false
+ij_java_space_before_while_keyword = true
+ij_java_space_before_while_left_brace = true
+ij_java_space_before_while_parentheses = true
+ij_java_space_inside_one_line_enum_braces = false
+ij_java_space_within_empty_array_initializer_braces = false
+ij_java_space_within_empty_method_call_parentheses = false
+ij_java_space_within_empty_method_parentheses = false
+ij_java_spaces_around_additive_operators = true
+ij_java_spaces_around_assignment_operators = true
+ij_java_spaces_around_bitwise_operators = true
+ij_java_spaces_around_equality_operators = true
+ij_java_spaces_around_lambda_arrow = true
+ij_java_spaces_around_logical_operators = true
+ij_java_spaces_around_method_ref_dbl_colon = false
+ij_java_spaces_around_multiplicative_operators = true
+ij_java_spaces_around_relational_operators = true
+ij_java_spaces_around_shift_operators = true
+ij_java_spaces_around_type_bounds_in_type_parameters = true
+ij_java_spaces_around_unary_operator = false
+ij_java_spaces_within_angle_brackets = false
+ij_java_spaces_within_annotation_parentheses = false
+ij_java_spaces_within_array_initializer_braces = false
+ij_java_spaces_within_braces = false
+ij_java_spaces_within_brackets = false
+ij_java_spaces_within_cast_parentheses = false
+ij_java_spaces_within_catch_parentheses = false
+ij_java_spaces_within_for_parentheses = false
+ij_java_spaces_within_if_parentheses = false
+ij_java_spaces_within_method_call_parentheses = false
+ij_java_spaces_within_method_parentheses = false
+ij_java_spaces_within_parentheses = false
+ij_java_spaces_within_switch_parentheses = false
+ij_java_spaces_within_synchronized_parentheses = false
+ij_java_spaces_within_try_parentheses = false
+ij_java_spaces_within_while_parentheses = false
+ij_java_special_else_if_treatment = true
+ij_java_subclass_name_suffix = Impl
+ij_java_ternary_operation_signs_on_next_line = false
+ij_java_ternary_operation_wrap = off
+ij_java_test_name_suffix = Test
+ij_java_throws_keyword_wrap = off
+ij_java_throws_list_wrap = off
+ij_java_use_external_annotations = false
+ij_java_use_fq_class_names = false
+ij_java_use_relative_indents = false
+ij_java_use_single_class_imports = true
+ij_java_variable_annotation_wrap = off
+ij_java_visibility = public
+ij_java_while_brace_force = never
+ij_java_while_on_new_line = false
+ij_java_wrap_comments = false
+ij_java_wrap_first_method_in_call_chain = false
+ij_java_wrap_long_lines = false
+
+[*.properties]
+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
+
+[.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,*.jspx,*.pom,*.rng,*.tagx,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
+ij_xml_align_attributes = true
+ij_xml_align_text = false
+ij_xml_attribute_wrap = normal
+ij_xml_block_comment_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
+
+[{*.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
+
+[{*.har,*.json}]
+indent_size = 2
+ij_json_keep_blank_lines_in_code = 0
+ij_json_keep_indents_on_empty_lines = false
+ij_json_keep_line_breaks = true
+ij_json_space_after_colon = true
+ij_json_space_after_comma = true
+ij_json_space_before_colon = true
+ij_json_space_before_comma = false
+ij_json_spaces_within_braces = false
+ij_json_spaces_within_brackets = false
+ij_json_wrap_long_lines = false
+
+[{*.yaml,*.yml}]
+indent_size = 2
+ij_yaml_keep_indents_on_empty_lines = false
+ij_yaml_keep_line_breaks = true
diff --git a/codigos/backend/.gitignore b/codigos/backend/.gitignore
index a2a3040..d4dfde6 100644
--- a/codigos/backend/.gitignore
+++ b/codigos/backend/.gitignore
@@ -28,4 +28,4 @@ target/
build/
### VS Code ###
-.vscode/
+.vscode/
\ No newline at end of file
diff --git a/codigos/backend/README.md b/codigos/backend/README.md
new file mode 100644
index 0000000..ab90884
--- /dev/null
+++ b/codigos/backend/README.md
@@ -0,0 +1,17 @@
+# Hybrid Recommendation System
+
+## Install (Linux)
+
+```bash
+> chmod +x startConfig.sh
+> ./startConfig.sh
+```
+
+- Create a database in PostgreSQL with name **srh**
+- Insert the content of data.sql on database:
+
+```sql
+INSERT INTO api_user(id, name, login, password, profile) VALUES (1, 'api', 'api', '$2a$10$sFKmbxbG4ryhwPNx/l3pgOJSt.fW1z6YcUnuE2X8APA/Z3NI/oSpq', 'API');
+```
+
+Use the user **api** with password **123456** to generate the token for api
\ No newline at end of file
diff --git a/codigos/backend/docs/diagram.asta b/codigos/backend/docs/diagram.asta
new file mode 100644
index 0000000..0a3205f
Binary files /dev/null and b/codigos/backend/docs/diagram.asta differ
diff --git a/codigos/backend/docs/diagram.jpg b/codigos/backend/docs/diagram.jpg
new file mode 100644
index 0000000..cf6a367
Binary files /dev/null and b/codigos/backend/docs/diagram.jpg differ
diff --git a/codigos/backend/docs/diagram.jpg.bak b/codigos/backend/docs/diagram.jpg.bak
new file mode 100644
index 0000000..ae30bfc
Binary files /dev/null and b/codigos/backend/docs/diagram.jpg.bak differ
diff --git a/codigos/backend/mvnw b/codigos/backend/mvnw
index 61ab2e6..a16b543 100755
--- a/codigos/backend/mvnw
+++ b/codigos/backend/mvnw
@@ -68,7 +68,7 @@ esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
- JAVA_HOME=`java-edu.ifes.ci.si.les.srh.config --jre-home`
+ JAVA_HOME=`java-config --jre-home`
fi
fi
diff --git a/codigos/backend/mvnw.cmd b/codigos/backend/mvnw.cmd
index 4a5fa44..c8d4337 100644
--- a/codigos/backend/mvnw.cmd
+++ b/codigos/backend/mvnw.cmd
@@ -108,10 +108,10 @@ cd "%EXEC_DIR%"
:endDetectBaseDir
-IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.edu.ifes.ci.si.les.srh.config" goto endReadAdditionalConfig
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
-for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.edu.ifes.ci.si.les.srh.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
diff --git a/codigos/backend/pom.xml b/codigos/backend/pom.xml
index badaa75..9023a66 100644
--- a/codigos/backend/pom.xml
+++ b/codigos/backend/pom.xml
@@ -5,51 +5,54 @@
org.springframework.boot
spring-boot-starter-parent
- 2.3.1.RELEASE
+ 2.2.6.RELEASE
- edu.ifes.ci.si.les.srh
- srh
+ com.srh
+ api
0.0.1-SNAPSHOT
- srh
- A Hybrid Recommendation System build with RESTful API
+ Hybrid Recommendation System
+ Hybrid Recommendation System RESTfull API
14
+ 2.2.1
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-cache
-
org.springframework.boot
spring-boot-starter-data-jpa
-
org.springframework.boot
- spring-boot-devtools
- runtime
- true
+ spring-boot-starter-hateoas
- javax.validation
- validation-api
+ org.springframework.boot
+ spring-boot-starter-security
- com.h2database
- h2
- runtime
+ de.codecentric
+ spring-boot-admin-starter-client
+
- org.projectlombok
- lombok
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
true
+ org.postgresql
+ postgresql
+ runtime
+
+
org.springframework.boot
spring-boot-starter-test
test
@@ -61,16 +64,37 @@
- org.postgresql
- postgresql
- runtime
+ org.springframework.security
+ spring-security-test
+ test
+
+ io.jsonwebtoken
+ jjwt
+ 0.9.1
+
+
+ org.projectlombok
+ lombok
+ true
+
- org.hibernate.validator
- hibernate-validator
- 6.0.18.Final
+ com.h2database
+ h2
-
+
+
+
+
+
+ de.codecentric
+ spring-boot-admin-dependencies
+ ${spring-boot-admin.version}
+ pom
+ import
+
+
+
@@ -78,6 +102,14 @@
org.springframework.boot
spring-boot-maven-plugin
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 13
+ 13
+
+
diff --git a/codigos/backend/src/main/java/com/srh/api/Application.java b/codigos/backend/src/main/java/com/srh/api/Application.java
new file mode 100644
index 0000000..02ff5eb
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/Application.java
@@ -0,0 +1,13 @@
+package com.srh.api;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/AdminBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/AdminBuilder.java
new file mode 100644
index 0000000..cf57891
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/AdminBuilder.java
@@ -0,0 +1,70 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.Admin;
+import com.srh.api.model.Project;
+
+import java.util.List;
+
+public final class AdminBuilder {
+ protected String login;
+ protected String password;
+ private List projects;
+ private Integer id;
+ private String oldPassword;
+ private String name;
+ private String email;
+
+ private AdminBuilder() {
+ }
+
+ public static AdminBuilder anAdmin() {
+ return new AdminBuilder();
+ }
+
+ public AdminBuilder withProjects(List projects) {
+ this.projects = projects;
+ return this;
+ }
+
+ public AdminBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public AdminBuilder withLogin(String login) {
+ this.login = login;
+ return this;
+ }
+
+ public AdminBuilder withOldPassword(String oldPassword) {
+ this.oldPassword = oldPassword;
+ return this;
+ }
+
+ public AdminBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public AdminBuilder withEmail(String email) {
+ this.email = email;
+ return this;
+ }
+
+ public AdminBuilder withPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+ public Admin build() {
+ Admin admin = new Admin();
+ admin.setProjects(projects);
+ admin.setId(id);
+ admin.setLogin(login);
+ admin.setOldPassword(oldPassword);
+ admin.setName(name);
+ admin.setEmail(email);
+ admin.setPassword(password);
+ return admin;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/AlgorithmBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/AlgorithmBuilder.java
new file mode 100644
index 0000000..806464c
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/AlgorithmBuilder.java
@@ -0,0 +1,50 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.Algorithm;
+import com.srh.api.model.Recommendation;
+import com.srh.api.model.TypeRecommendation;
+
+import java.util.List;
+
+public final class AlgorithmBuilder {
+ private Integer id;
+ private String name;
+ private TypeRecommendation typeRecommendation;
+ private List recommendations;
+
+ private AlgorithmBuilder() {
+ }
+
+ public static AlgorithmBuilder anAlgorithm() {
+ return new AlgorithmBuilder();
+ }
+
+ public AlgorithmBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public AlgorithmBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public AlgorithmBuilder withTypeRecommendation(TypeRecommendation typeRecommendation) {
+ this.typeRecommendation = typeRecommendation;
+ return this;
+ }
+
+ public AlgorithmBuilder withRecommendations(List recommendations) {
+ this.recommendations = recommendations;
+ return this;
+ }
+
+ public Algorithm build() {
+ Algorithm algorithm = new Algorithm();
+ algorithm.setId(id);
+ algorithm.setName(name);
+ algorithm.setTypeRecommendation(typeRecommendation);
+ algorithm.setRecommendations(recommendations);
+ return algorithm;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/ApiUserBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/ApiUserBuilder.java
new file mode 100644
index 0000000..6266a64
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/ApiUserBuilder.java
@@ -0,0 +1,70 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.ApiUser;
+import com.srh.api.model.Profile;
+
+import java.util.List;
+
+public final class ApiUserBuilder {
+ protected String login;
+ protected String password;
+ private List profiles;
+ private Integer id;
+ private String oldPassword;
+ private String name;
+ private String email;
+
+ private ApiUserBuilder() {
+ }
+
+ public static ApiUserBuilder anApiUser() {
+ return new ApiUserBuilder();
+ }
+
+ public ApiUserBuilder withProfiles(List profiles) {
+ this.profiles = profiles;
+ return this;
+ }
+
+ public ApiUserBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public ApiUserBuilder withLogin(String login) {
+ this.login = login;
+ return this;
+ }
+
+ public ApiUserBuilder withOldPassword(String oldPassword) {
+ this.oldPassword = oldPassword;
+ return this;
+ }
+
+ public ApiUserBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public ApiUserBuilder withEmail(String email) {
+ this.email = email;
+ return this;
+ }
+
+ public ApiUserBuilder withPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+ public ApiUser build() {
+ ApiUser apiUser = new ApiUser();
+ apiUser.setProfiles(profiles);
+ apiUser.setId(id);
+ apiUser.setLogin(login);
+ apiUser.setOldPassword(oldPassword);
+ apiUser.setName(name);
+ apiUser.setEmail(email);
+ apiUser.setPassword(password);
+ return apiUser;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/AttributeBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/AttributeBuilder.java
new file mode 100644
index 0000000..e861bbd
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/AttributeBuilder.java
@@ -0,0 +1,65 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.Attribute;
+import com.srh.api.model.Item;
+import com.srh.api.model.TypeAttribute;
+import com.srh.api.model.TypeItem;
+
+import java.util.List;
+
+public final class AttributeBuilder {
+ private Integer id;
+ private String name;
+ private String value;
+ private TypeAttribute type;
+ private List- itens;
+ private List typeItens;
+
+ private AttributeBuilder() {
+ }
+
+ public static AttributeBuilder anAttribute() {
+ return new AttributeBuilder();
+ }
+
+ public AttributeBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public AttributeBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public AttributeBuilder withValue(String value) {
+ this.value = value;
+ return this;
+ }
+
+ public AttributeBuilder withType(TypeAttribute type) {
+ this.type = type;
+ return this;
+ }
+
+ public AttributeBuilder withItens(List
- itens) {
+ this.itens = itens;
+ return this;
+ }
+
+ public AttributeBuilder withTypeItens(List typeItens) {
+ this.typeItens = typeItens;
+ return this;
+ }
+
+ public Attribute build() {
+ Attribute attribute = new Attribute();
+ attribute.setId(id);
+ attribute.setName(name);
+ attribute.setValue(value);
+ attribute.setType(type);
+ attribute.setItens(itens);
+ attribute.setTypeItens(typeItens);
+ return attribute;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/EvaluatorBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/EvaluatorBuilder.java
new file mode 100644
index 0000000..7198734
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/EvaluatorBuilder.java
@@ -0,0 +1,90 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.*;
+
+import java.util.List;
+
+public final class EvaluatorBuilder {
+ protected String login;
+ protected String password;
+ private List projects;
+ private List recommendations;
+ private List itemRatings;
+ private List recommendationRatings;
+ private Integer id;
+ private String oldPassword;
+ private String name;
+ private String email;
+
+ private EvaluatorBuilder() {
+ }
+
+ public static EvaluatorBuilder anEvaluator() {
+ return new EvaluatorBuilder();
+ }
+
+ public EvaluatorBuilder withProjects(List projects) {
+ this.projects = projects;
+ return this;
+ }
+
+ public EvaluatorBuilder withRecommendations(List recommendations) {
+ this.recommendations = recommendations;
+ return this;
+ }
+
+ public EvaluatorBuilder withItemRatings(List itemRatings) {
+ this.itemRatings = itemRatings;
+ return this;
+ }
+
+ public EvaluatorBuilder withRecommendationRatings(List recommendationRatings) {
+ this.recommendationRatings = recommendationRatings;
+ return this;
+ }
+
+ public EvaluatorBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public EvaluatorBuilder withLogin(String login) {
+ this.login = login;
+ return this;
+ }
+
+ public EvaluatorBuilder withOldPassword(String oldPassword) {
+ this.oldPassword = oldPassword;
+ return this;
+ }
+
+ public EvaluatorBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public EvaluatorBuilder withEmail(String email) {
+ this.email = email;
+ return this;
+ }
+
+ public EvaluatorBuilder withPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+ public Evaluator build() {
+ Evaluator evaluator = new Evaluator();
+ evaluator.setProjects(projects);
+ evaluator.setRecommendations(recommendations);
+ evaluator.setItemRatings(itemRatings);
+ evaluator.setRecommendationRatings(recommendationRatings);
+ evaluator.setId(id);
+ evaluator.setLogin(login);
+ evaluator.setOldPassword(oldPassword);
+ evaluator.setName(name);
+ evaluator.setEmail(email);
+ evaluator.setPassword(password);
+ return evaluator;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/ItemBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/ItemBuilder.java
new file mode 100644
index 0000000..3e92200
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/ItemBuilder.java
@@ -0,0 +1,83 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.*;
+
+import java.util.List;
+
+public final class ItemBuilder {
+ private Integer id;
+ private String name;
+ private String description;
+ private List itemRatings;
+ private List recommendations;
+ private Project project;
+ private TypeItem typeItem;
+ private List tags;
+ private List attributes;
+
+ private ItemBuilder() {
+ }
+
+ public static ItemBuilder anItem() {
+ return new ItemBuilder();
+ }
+
+ public ItemBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public ItemBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public ItemBuilder withDescription(String description) {
+ this.description = description;
+ return this;
+ }
+
+ public ItemBuilder withItemRatings(List itemRatings) {
+ this.itemRatings = itemRatings;
+ return this;
+ }
+
+ public ItemBuilder withRecommendations(List recommendations) {
+ this.recommendations = recommendations;
+ return this;
+ }
+
+ public ItemBuilder withProject(Project project) {
+ this.project = project;
+ return this;
+ }
+
+ public ItemBuilder withTypeItem(TypeItem typeItem) {
+ this.typeItem = typeItem;
+ return this;
+ }
+
+ public ItemBuilder withTags(List tags) {
+ this.tags = tags;
+ return this;
+ }
+
+ public ItemBuilder withAttributes(List attributes) {
+ this.attributes = attributes;
+ return this;
+ }
+
+ public Item build() {
+ Item item = new Item();
+ item.setId(id);
+ item.setName(name);
+ item.setDescription(description);
+ item.setItemRatings(itemRatings);
+ item.setRecommendations(recommendations);
+ item.setProject(project);
+ item.setTypeItem(typeItem);
+ item.setTags(tags);
+ item.setAttributes(attributes);
+ return item;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/ItemRatingBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/ItemRatingBuilder.java
new file mode 100644
index 0000000..d75dc16
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/ItemRatingBuilder.java
@@ -0,0 +1,57 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.Evaluator;
+import com.srh.api.model.Item;
+import com.srh.api.model.ItemRating;
+
+import java.time.LocalDateTime;
+
+public final class ItemRatingBuilder {
+ private Evaluator evaluator;
+ private Item item;
+ private Integer id;
+ private Double score;
+ private LocalDateTime date;
+
+ private ItemRatingBuilder() {
+ }
+
+ public static ItemRatingBuilder anItemRating() {
+ return new ItemRatingBuilder();
+ }
+
+ public ItemRatingBuilder withEvaluator(Evaluator evaluator) {
+ this.evaluator = evaluator;
+ return this;
+ }
+
+ public ItemRatingBuilder withItem(Item item) {
+ this.item = item;
+ return this;
+ }
+
+ public ItemRatingBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public ItemRatingBuilder withScore(Double score) {
+ this.score = score;
+ return this;
+ }
+
+ public ItemRatingBuilder withDate(LocalDateTime date) {
+ this.date = date;
+ return this;
+ }
+
+ public ItemRating build() {
+ ItemRating itemRating = new ItemRating();
+ itemRating.setEvaluator(evaluator);
+ itemRating.setItem(item);
+ itemRating.setId(id);
+ itemRating.setScore(score);
+ itemRating.setDate(date);
+ return itemRating;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/ItemTagBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/ItemTagBuilder.java
new file mode 100644
index 0000000..e2f17be
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/ItemTagBuilder.java
@@ -0,0 +1,31 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.Item;
+import com.srh.api.model.ItemTag;
+import com.srh.api.model.Tag;
+
+public final class ItemTagBuilder {
+ private Item item;
+ private Tag tag;
+
+ private ItemTagBuilder() {
+ }
+
+ public static ItemTagBuilder anItemTag() {
+ return new ItemTagBuilder();
+ }
+
+ public ItemTagBuilder withItem(Item item) {
+ this.item = item;
+ return this;
+ }
+
+ public ItemTagBuilder withTag(Tag tag) {
+ this.tag = tag;
+ return this;
+ }
+
+ public ItemTag build() {
+ return new ItemTag(item, tag);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/LoginFormBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/LoginFormBuilder.java
new file mode 100644
index 0000000..73c58ad
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/LoginFormBuilder.java
@@ -0,0 +1,32 @@
+package com.srh.api.builder;
+
+import com.srh.api.dto.auth.LoginForm;
+
+public final class LoginFormBuilder {
+ private String login;
+ private String password;
+
+ private LoginFormBuilder() {
+ }
+
+ public static LoginFormBuilder aLoginForm() {
+ return new LoginFormBuilder();
+ }
+
+ public LoginFormBuilder withLogin(String login) {
+ this.login = login;
+ return this;
+ }
+
+ public LoginFormBuilder withPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
+ public LoginForm build() {
+ LoginForm loginForm = new LoginForm();
+ loginForm.setLogin(login);
+ loginForm.setPassword(password);
+ return loginForm;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/ProfileBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/ProfileBuilder.java
new file mode 100644
index 0000000..3825c6d
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/ProfileBuilder.java
@@ -0,0 +1,42 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.ApiUser;
+import com.srh.api.model.Profile;
+
+import java.util.List;
+
+public final class ProfileBuilder {
+ private Integer id;
+ private String name;
+ private List apiUsers;
+
+ private ProfileBuilder() {
+ }
+
+ public static ProfileBuilder aProfile() {
+ return new ProfileBuilder();
+ }
+
+ public ProfileBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public ProfileBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public ProfileBuilder withApiUsers(List apiUsers) {
+ this.apiUsers = apiUsers;
+ return this;
+ }
+
+ public Profile build() {
+ Profile profile = new Profile();
+ profile.setId(id);
+ profile.setName(name);
+ profile.setApiUsers(apiUsers);
+ return profile;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/ProjectBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/ProjectBuilder.java
new file mode 100644
index 0000000..4bb271b
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/ProjectBuilder.java
@@ -0,0 +1,84 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.*;
+
+import java.time.LocalDate;
+import java.util.List;
+
+public final class ProjectBuilder {
+ private Integer id;
+ private String name;
+ private String description;
+ private LocalDate date;
+ private Boolean visible;
+ private Situations situation;
+ private Admin admin;
+ private List evaluators;
+ private List
- itens;
+
+ private ProjectBuilder() {
+ }
+
+ public static ProjectBuilder aProject() {
+ return new ProjectBuilder();
+ }
+
+ public ProjectBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public ProjectBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public ProjectBuilder withDescription(String description) {
+ this.description = description;
+ return this;
+ }
+
+ public ProjectBuilder withDate(LocalDate date) {
+ this.date = date;
+ return this;
+ }
+
+ public ProjectBuilder withVisible(Boolean visible) {
+ this.visible = visible;
+ return this;
+ }
+
+ public ProjectBuilder withSituation(Situations situation) {
+ this.situation = situation;
+ return this;
+ }
+
+ public ProjectBuilder withAdmin(Admin admin) {
+ this.admin = admin;
+ return this;
+ }
+
+ public ProjectBuilder withEvaluators(List evaluators) {
+ this.evaluators = evaluators;
+ return this;
+ }
+
+ public ProjectBuilder withItens(List
- itens) {
+ this.itens = itens;
+ return this;
+ }
+
+ public Project build() {
+ Project project = new Project();
+ project.setId(id);
+ project.setName(name);
+ project.setDescription(description);
+ project.setDate(date);
+ project.setVisible(visible);
+ project.setSituation(situation);
+ project.setAdmin(admin);
+ project.setEvaluators(evaluators);
+ project.setItens(itens);
+ return project;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/RecommendationBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/RecommendationBuilder.java
new file mode 100644
index 0000000..9157084
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/RecommendationBuilder.java
@@ -0,0 +1,77 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+public final class RecommendationBuilder {
+ private Integer id;
+ private Double weight;
+ private LocalDateTime date;
+ private Integer runtimeInSeconds;
+ private Algorithm algorithm;
+ private Evaluator evaluator;
+ private Item item;
+ private List recommendationRatings;
+
+ private RecommendationBuilder() {
+ }
+
+ public static RecommendationBuilder aRecommendation() {
+ return new RecommendationBuilder();
+ }
+
+ public RecommendationBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public RecommendationBuilder withWeight(Double weight) {
+ this.weight = weight;
+ return this;
+ }
+
+ public RecommendationBuilder withDate(LocalDateTime date) {
+ this.date = date;
+ return this;
+ }
+
+ public RecommendationBuilder withRuntimeInSeconds(Integer runtimeInSeconds) {
+ this.runtimeInSeconds = runtimeInSeconds;
+ return this;
+ }
+
+ public RecommendationBuilder withAlgorithm(Algorithm algorithm) {
+ this.algorithm = algorithm;
+ return this;
+ }
+
+ public RecommendationBuilder withEvaluator(Evaluator evaluator) {
+ this.evaluator = evaluator;
+ return this;
+ }
+
+ public RecommendationBuilder withItem(Item item) {
+ this.item = item;
+ return this;
+ }
+
+ public RecommendationBuilder withRecommendationRatings(List recommendationRatings) {
+ this.recommendationRatings = recommendationRatings;
+ return this;
+ }
+
+ public Recommendation build() {
+ Recommendation recommendation = new Recommendation();
+ recommendation.setId(id);
+ recommendation.setWeight(weight);
+ recommendation.setDate(date);
+ recommendation.setRuntimeInSeconds(runtimeInSeconds);
+ recommendation.setAlgorithm(algorithm);
+ recommendation.setEvaluator(evaluator);
+ recommendation.setItem(item);
+ recommendation.setRecommendationRatings(recommendationRatings);
+ return recommendation;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/RecommendationRatingBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/RecommendationRatingBuilder.java
new file mode 100644
index 0000000..c34a02a
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/RecommendationRatingBuilder.java
@@ -0,0 +1,57 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.Evaluator;
+import com.srh.api.model.Recommendation;
+import com.srh.api.model.RecommendationRating;
+
+import java.time.LocalDateTime;
+
+public final class RecommendationRatingBuilder {
+ private Recommendation recommendation;
+ private Evaluator evaluator;
+ private Integer id;
+ private Double score;
+ private LocalDateTime date;
+
+ private RecommendationRatingBuilder() {
+ }
+
+ public static RecommendationRatingBuilder aRecommendationRating() {
+ return new RecommendationRatingBuilder();
+ }
+
+ public RecommendationRatingBuilder withRecommendation(Recommendation recommendation) {
+ this.recommendation = recommendation;
+ return this;
+ }
+
+ public RecommendationRatingBuilder withEvaluator(Evaluator evaluator) {
+ this.evaluator = evaluator;
+ return this;
+ }
+
+ public RecommendationRatingBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public RecommendationRatingBuilder withScore(Double score) {
+ this.score = score;
+ return this;
+ }
+
+ public RecommendationRatingBuilder withDate(LocalDateTime date) {
+ this.date = date;
+ return this;
+ }
+
+ public RecommendationRating build() {
+ RecommendationRating recommendationRating = new RecommendationRating();
+ recommendationRating.setRecommendation(recommendation);
+ recommendationRating.setEvaluator(evaluator);
+ recommendationRating.setId(id);
+ recommendationRating.setScore(score);
+ recommendationRating.setDate(date);
+ return recommendationRating;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/TagBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/TagBuilder.java
new file mode 100644
index 0000000..b59debf
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/TagBuilder.java
@@ -0,0 +1,42 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.Item;
+import com.srh.api.model.Tag;
+
+import java.util.List;
+
+public final class TagBuilder {
+ private Integer id;
+ private String name;
+ private List
- itens;
+
+ private TagBuilder() {
+ }
+
+ public static TagBuilder aTag() {
+ return new TagBuilder();
+ }
+
+ public TagBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public TagBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public TagBuilder withItens(List
- itens) {
+ this.itens = itens;
+ return this;
+ }
+
+ public Tag build() {
+ Tag tag = new Tag();
+ tag.setId(id);
+ tag.setName(name);
+ tag.setItens(itens);
+ return tag;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/builder/TypeItemBuilder.java b/codigos/backend/src/main/java/com/srh/api/builder/TypeItemBuilder.java
new file mode 100644
index 0000000..1cb58ef
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/builder/TypeItemBuilder.java
@@ -0,0 +1,50 @@
+package com.srh.api.builder;
+
+import com.srh.api.model.Attribute;
+import com.srh.api.model.Item;
+import com.srh.api.model.TypeItem;
+
+import java.util.List;
+
+public final class TypeItemBuilder {
+ private Integer id;
+ private String name;
+ private List
- itens;
+ private List attributes;
+
+ private TypeItemBuilder() {
+ }
+
+ public static TypeItemBuilder aTypeItem() {
+ return new TypeItemBuilder();
+ }
+
+ public TypeItemBuilder withId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public TypeItemBuilder withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public TypeItemBuilder withItens(List
- itens) {
+ this.itens = itens;
+ return this;
+ }
+
+ public TypeItemBuilder withAttributes(List attributes) {
+ this.attributes = attributes;
+ return this;
+ }
+
+ public TypeItem build() {
+ TypeItem typeItem = new TypeItem();
+ typeItem.setId(id);
+ typeItem.setName(name);
+ typeItem.setItens(itens);
+ typeItem.setAttributes(attributes);
+ return typeItem;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/config/DbSeeder.java b/codigos/backend/src/main/java/com/srh/api/config/DbSeeder.java
new file mode 100644
index 0000000..96e3935
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/config/DbSeeder.java
@@ -0,0 +1,88 @@
+package com.srh.api.config;
+
+import com.srh.api.builder.ApiUserBuilder;
+import com.srh.api.builder.ProfileBuilder;
+import com.srh.api.model.ApiUser;
+import com.srh.api.model.Profile;
+import com.srh.api.repository.ApiUserRepository;
+import com.srh.api.repository.ProfileRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class DbSeeder {
+ @Autowired
+ private ApiUserRepository apiUserRepository;
+
+ @Autowired
+ private ProfileRepository profileRepository;
+
+ private Profile adminProfile;
+ private Profile userProfile;
+
+ public boolean seed() {
+ createProfileAdmin();
+ createProfileUser();
+
+ createApiUserAdmin();
+ createApiUserClient();
+
+ return true;
+ }
+
+ private void createApiUserAdmin() {
+ List profiles = new ArrayList<>();
+ profiles.add(adminProfile);
+ profiles.add(userProfile);
+
+ ApiUser apiUser = ApiUserBuilder.anApiUser()
+ .withId(1)
+ .withEmail("admin@email.com")
+ .withName("admin")
+ .withLogin("admin")
+ .withPassword("$2a$10$sFKmbxbG4ryhwPNx/l3pgOJSt.fW1z6YcUnuE2X8APA/Z3NI/oSpq")
+ .withProfiles(profiles)
+ .build();
+
+ apiUserRepository.save(apiUser);
+ }
+
+ private void createApiUserClient() {
+ List profiles = new ArrayList<>();
+ profiles.add(userProfile);
+
+ ApiUser apiUser = ApiUserBuilder.anApiUser()
+ .withId(2)
+ .withEmail("admin@email.com")
+ .withName("client")
+ .withLogin("client")
+ .withPassword("$2a$10$sFKmbxbG4ryhwPNx/l3pgOJSt.fW1z6YcUnuE2X8APA/Z3NI/oSpq")
+ .withProfiles(profiles)
+ .build();
+
+ apiUserRepository.save(apiUser);
+ }
+
+ private void createProfileAdmin() {
+ Profile profile = ProfileBuilder.aProfile()
+ .withId(1)
+ .withName("ROLE_ADMIN")
+ .build();
+
+ adminProfile = profile;
+ profileRepository.save(profile);
+ }
+
+ private void createProfileUser() {
+ Profile profile = ProfileBuilder.aProfile()
+ .withId(2)
+ .withName("ROLE_USER")
+ .build();
+
+ userProfile = profile;
+ profileRepository.save(profile);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/config/DevProfile.java b/codigos/backend/src/main/java/com/srh/api/config/DevProfile.java
new file mode 100644
index 0000000..9bbe7db
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/config/DevProfile.java
@@ -0,0 +1,26 @@
+package com.srh.api.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+
+@Configuration
+@Profile("dev")
+public class DevProfile {
+ @Autowired
+ private DbSeeder dbSeeder;
+
+ @Value("${spring.jpa.hibernate.ddl-auto}")
+ private String strategy;
+
+ @Bean
+ public boolean initializeDatabase() {
+ if (strategy.equals("create")) {
+ return dbSeeder.seed();
+ }
+
+ return false;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/config/TestProfile.java b/codigos/backend/src/main/java/com/srh/api/config/TestProfile.java
new file mode 100644
index 0000000..0d7aff6
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/config/TestProfile.java
@@ -0,0 +1,18 @@
+package com.srh.api.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+
+@Configuration
+@Profile("test")
+public class TestProfile {
+ @Autowired
+ private DbSeeder dbSeeder;
+
+ @Bean
+ public boolean initializeDatabase() {
+ return dbSeeder.seed();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/AdminController.java b/codigos/backend/src/main/java/com/srh/api/controller/AdminController.java
new file mode 100644
index 0000000..5efaf21
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/AdminController.java
@@ -0,0 +1,76 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.AdminDto;
+import com.srh.api.dto.resource.AdminForm;
+import com.srh.api.hypermedia.AdminModelAssembler;
+import com.srh.api.model.Admin;
+import com.srh.api.service.AdminService;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+import java.net.URI;
+
+import static com.srh.api.dto.resource.AdminDto.convert;
+
+@RestController
+@RequestMapping("/users/admins")
+public class AdminController {
+ @Autowired
+ private AdminService adminService;
+
+ @Autowired
+ private AdminModelAssembler adminModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5) Pageable pageInfo) {
+ Page admins = adminService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(admins));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ Admin admin = adminService.find(id);
+ return adminModelAssembler.toModel(new AdminDto(admin));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid AdminForm adminForm,
+ UriComponentsBuilder uriBuilder) {
+ Admin admin = adminForm.build();
+ adminService.save(admin);
+ URI uri = uriBuilder.path("/users/admins/{id}").buildAndExpand(admin.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(adminModelAssembler.toModel(new AdminDto(admin)));
+ }
+
+ @PutMapping("/{id}")
+ @SneakyThrows
+ @Transactional
+ public EntityModel update(@RequestBody @Valid AdminForm adminForm, @PathVariable Integer id) {
+ Admin admin = adminForm.build();
+ admin.setId(id);
+ admin = adminService.update(admin, adminForm.getOldPassword());
+ return adminModelAssembler.toModel(new AdminDto(admin));
+ }
+
+ @DeleteMapping("/{id}")
+ @Transactional
+ public ResponseEntity delete(@PathVariable Integer id) {
+ adminService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/AlgorithmController.java b/codigos/backend/src/main/java/com/srh/api/controller/AlgorithmController.java
new file mode 100644
index 0000000..ee4b7de
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/AlgorithmController.java
@@ -0,0 +1,76 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.AlgorithmDto;
+import com.srh.api.dto.resource.AlgorithmForm;
+import com.srh.api.hypermedia.AlgorithmModelAssembler;
+import com.srh.api.model.Algorithm;
+import com.srh.api.service.AlgorithmService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+
+import java.net.URI;
+
+import static com.srh.api.dto.resource.AlgorithmDto.convert;
+
+@RestController
+@RequestMapping("/algorithms")
+public class AlgorithmController {
+ @Autowired
+ private AlgorithmService algorithmService;
+
+ @Autowired
+ private AlgorithmModelAssembler algorithmModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5)
+ Pageable pageInfo) {
+ Page algorithms = algorithmService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(algorithms));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ Algorithm algorithm = algorithmService.find(id);
+ return algorithmModelAssembler.toModel(new AlgorithmDto(algorithm));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid AlgorithmForm algorithmForm,
+ UriComponentsBuilder uriBuilder) {
+ Algorithm algorithm = algorithmForm.build();
+ algorithmService.save(algorithm);
+ URI uri = uriBuilder.path("/algorithms/{id}").buildAndExpand(algorithm.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(algorithmModelAssembler.toModel(new AlgorithmDto(algorithm)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ public EntityModel update(@RequestBody @Valid AlgorithmForm algorithmForm,
+ @PathVariable Integer id) {
+ Algorithm algorithm = algorithmForm.build();
+ algorithm.setId(id);
+ algorithm = algorithmService.update(algorithm);
+ return algorithmModelAssembler.toModel(new AlgorithmDto(algorithm));
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ algorithmService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/ApiUsersController.java b/codigos/backend/src/main/java/com/srh/api/controller/ApiUsersController.java
new file mode 100644
index 0000000..baa3cae
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/ApiUsersController.java
@@ -0,0 +1,87 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.ApiUserForm;
+import com.srh.api.dto.resource.ApiUsersDto;
+import com.srh.api.hypermedia.ApiUserModelAssembler;
+import com.srh.api.model.ApiUser;
+import com.srh.api.model.Profile;
+import com.srh.api.service.ApiUserService;
+import com.srh.api.service.ProfileService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+import java.net.URI;
+import java.util.List;
+
+@RestController
+@RequestMapping("/users/apis")
+public class ApiUsersController {
+ @Autowired
+ private ApiUserService apiUserService;
+
+ @Autowired
+ private ProfileService profileService;
+
+ @Autowired
+ private ApiUserModelAssembler apiUserModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5)
+ Pageable pageInfo) {
+ Page users = apiUserService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(ApiUsersDto.convert(users));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ ApiUser apiUser = apiUserService.find(id);
+ return apiUserModelAssembler.toModel(new ApiUsersDto(apiUser));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid ApiUserForm apiUserForm,
+ UriComponentsBuilder uriBuilder) {
+ ApiUser apiUser = apiUserForm.build();
+ List profiles = profileService.getProfilesByAuthority(apiUserForm.getIsAdmin());
+
+ apiUser.setProfiles(profiles);
+ apiUserService.save(apiUser);
+
+ URI uri = uriBuilder.path("/users/apis/{id}").buildAndExpand(apiUser.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(apiUserModelAssembler.toModel(new ApiUsersDto(apiUser)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ public EntityModel update(@RequestBody @Valid ApiUserForm apiUserForm,
+ @PathVariable Integer id) {
+ ApiUser apiUser = apiUserForm.build();
+ List profiles = profileService.getProfilesByAuthority(apiUserForm.getIsAdmin());
+
+ apiUser.setId(id);
+ apiUser.setProfiles(profiles);
+ apiUser = apiUserService.update(apiUser, apiUserForm.getOldPassword());
+ return apiUserModelAssembler.toModel(new ApiUsersDto(apiUser));
+ }
+
+ @DeleteMapping("/{id}")
+ @Transactional
+ public ResponseEntity delete(@PathVariable Integer id) {
+ apiUserService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/AttributeController.java b/codigos/backend/src/main/java/com/srh/api/controller/AttributeController.java
new file mode 100644
index 0000000..ff4f0bd
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/AttributeController.java
@@ -0,0 +1,76 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.AttributeDto;
+import com.srh.api.dto.resource.AttributeForm;
+import com.srh.api.hypermedia.AttributeModelAssembler;
+import com.srh.api.model.Attribute;
+import com.srh.api.service.AttributeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+
+import java.net.URI;
+
+import static com.srh.api.dto.resource.AttributeDto.convert;
+
+@RestController
+@RequestMapping("/attributes")
+public class AttributeController {
+ @Autowired
+ private AttributeService attributeService;
+
+ @Autowired
+ private AttributeModelAssembler attributeModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5)
+ Pageable pageInfo) {
+ Page attributes = attributeService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(attributes));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ Attribute attribute = attributeService.find(id);
+ return attributeModelAssembler.toModel(new AttributeDto(attribute));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid AttributeForm attributeForm,
+ UriComponentsBuilder uriBuilder) {
+ Attribute attribute = attributeForm.build();
+ attributeService.save(attribute);
+ URI uri = uriBuilder.path("/attributes").buildAndExpand(attribute.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(attributeModelAssembler.toModel(new AttributeDto(attribute)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ public EntityModel update(@RequestBody @Valid AttributeForm attributeForm,
+ @PathVariable Integer id) {
+ Attribute attribute = attributeForm.build();
+ attribute.setId(id);
+ attribute = attributeService.update(attribute);
+ return attributeModelAssembler.toModel(new AttributeDto(attribute));
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ attributeService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/AuthController.java b/codigos/backend/src/main/java/com/srh/api/controller/AuthController.java
new file mode 100644
index 0000000..1d51a7a
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/AuthController.java
@@ -0,0 +1,55 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.auth.AuthDto;
+import com.srh.api.dto.auth.LoginForm;
+import com.srh.api.error.exception.InvalidUserInTokenException;
+import com.srh.api.service.JWTService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+import static com.srh.api.security.SecurityConstants.*;
+
+@RestController
+@RequestMapping("/auth")
+public class AuthController {
+ @Autowired
+ private AuthenticationManager authManager;
+
+ @Autowired
+ private JWTService jwtService;
+
+ @PostMapping
+ public ResponseEntity auth(@RequestBody @Valid LoginForm form) {
+ UsernamePasswordAuthenticationToken loginUser = form.convert();
+ String token = generatedTokenForAuthenticatedUser(loginUser);
+ return ResponseEntity.ok()
+ .headers(generateAuthorizationHeader(token))
+ .body(new AuthDto(token, "Bearer"));
+ }
+
+ public String generatedTokenForAuthenticatedUser(UsernamePasswordAuthenticationToken userToken) {
+ try {
+ Authentication authentication = authManager.authenticate(userToken);
+ return jwtService.buildToken(authentication);
+ } catch (AuthenticationException e) {
+ throw new InvalidUserInTokenException(e);
+ }
+ }
+
+ private HttpHeaders generateAuthorizationHeader(String token) {
+ HttpHeaders responseHeaders = new HttpHeaders();
+ responseHeaders.set(HEADER, TOKEN_PREFIX + token);
+ return responseHeaders;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/EvaluatorController.java b/codigos/backend/src/main/java/com/srh/api/controller/EvaluatorController.java
new file mode 100644
index 0000000..228f030
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/EvaluatorController.java
@@ -0,0 +1,75 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.EvaluatorDto;
+import com.srh.api.dto.resource.EvaluatorForm;
+import com.srh.api.hypermedia.EvaluatorModelAssembler;
+import com.srh.api.model.Evaluator;
+import com.srh.api.service.EvaluatorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+import java.net.URI;
+
+import static com.srh.api.dto.resource.EvaluatorDto.convert;
+
+@RestController
+@RequestMapping("/users/evaluators")
+public class EvaluatorController {
+ @Autowired
+ private EvaluatorService evaluatorService;
+
+ @Autowired
+ private EvaluatorModelAssembler evaluatorModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5)
+ Pageable pageInfo) {
+ Page users = evaluatorService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(users));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ Evaluator evaluator = evaluatorService.find(id);
+ return evaluatorModelAssembler.toModel(new EvaluatorDto(evaluator));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid EvaluatorForm evaluatorForm,
+ UriComponentsBuilder uriBuilder) {
+ Evaluator evaluator = evaluatorForm.build();
+ evaluatorService.save(evaluator);
+ URI uri = uriBuilder.path("/users/evaluators/{id}").buildAndExpand(evaluator.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(evaluatorModelAssembler.toModel(new EvaluatorDto(evaluator)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ public EntityModel update(@RequestBody @Valid EvaluatorForm evaluatorForm,
+ @PathVariable Integer id) {
+ Evaluator evaluator = evaluatorForm.build();
+ evaluator.setId(id);
+ evaluator = evaluatorService.update(evaluator, evaluatorForm.getOldPassword());
+ return evaluatorModelAssembler.toModel(new EvaluatorDto(evaluator));
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ evaluatorService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/ItemAttributeController.java b/codigos/backend/src/main/java/com/srh/api/controller/ItemAttributeController.java
new file mode 100644
index 0000000..b019609
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/ItemAttributeController.java
@@ -0,0 +1,85 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.AttributeDto;
+import com.srh.api.dto.resource.ItemAttributeDto;
+import com.srh.api.dto.resource.ItemAttributeForm;
+import com.srh.api.hypermedia.AttributeModelAssembler;
+import com.srh.api.hypermedia.ItemAttributeModelAssembler;
+import com.srh.api.model.Attribute;
+import com.srh.api.model.ItemAttribute;
+import com.srh.api.service.ItemAttributeService;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.validation.Valid;
+import java.net.URI;
+
+@RestController
+@RequestMapping("/itens/{itemId}/attributes")
+public class ItemAttributeController {
+ @Autowired
+ private ItemAttributeService itemAttributeService;
+
+ @Autowired
+ private ItemAttributeModelAssembler itemAttributeModelAssembler;
+
+ @Autowired
+ private AttributeModelAssembler attributeModelAssembler;
+
+ @Autowired
+ PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAttributesByItem(
+ @PathVariable Integer itemId, @PageableDefault(page = 0, size = 5) Pageable pageInfo
+ ) {
+ Page attributes = itemAttributeService.listAttributesByItem(itemId, pageInfo);
+ return pagedResourcesAssembler.toModel(AttributeDto.convert(attributes));
+ }
+
+ @GetMapping("/{attributeId}")
+ public EntityModel findAttributeInItem(@PathVariable Integer itemId,
+ @PathVariable Integer attributeId) {
+ Attribute attribute = itemAttributeService.findAttributeByItem(itemId, attributeId);
+ return attributeModelAssembler.toModel(new AttributeDto(attribute));
+ }
+
+ @PostMapping
+ @SneakyThrows
+ public ResponseEntity> linksAttributesItem(
+ @PathVariable Integer itemId,
+ @RequestBody @Valid ItemAttributeForm itemAttributeForm,
+ UriComponentsBuilder uriBuilder
+ ) {
+ ItemAttribute itemAttribute = itemAttributeService.save(
+ itemAttributeForm.getItemId(),
+ itemAttributeForm.getAttributeId()
+ );
+
+ URI uri = uriBuilder.path("/itens/{itemId}/attributes/{attributeId}")
+ .buildAndExpand(itemId, itemAttributeForm.getAttributeId())
+ .toUri();
+
+ return ResponseEntity.created(uri)
+ .body(itemAttributeModelAssembler.toModel(
+ new ItemAttributeDto(itemAttribute)
+ ));
+ }
+
+ @DeleteMapping("/{attributeId}")
+ @SneakyThrows
+ public ResponseEntity delete(@PathVariable Integer itemId,
+ @PathVariable Integer attributeId) {
+ itemAttributeService.delete(itemId, attributeId);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/ItemController.java b/codigos/backend/src/main/java/com/srh/api/controller/ItemController.java
new file mode 100644
index 0000000..f47fda1
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/ItemController.java
@@ -0,0 +1,91 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.ItemDto;
+import com.srh.api.dto.resource.ItemForm;
+import com.srh.api.dto.resource.RecommendationDto;
+import com.srh.api.hypermedia.ItemModelAssembler;
+import com.srh.api.model.Item;
+import com.srh.api.model.Recommendation;
+import com.srh.api.service.ItemService;
+import com.srh.api.utils.PageUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+import java.net.URI;
+
+import static com.srh.api.dto.resource.ItemDto.convert;
+
+@RestController
+@RequestMapping("/itens")
+public class ItemController {
+ @Autowired
+ private ItemService itemService;
+
+ @Autowired
+ private ItemModelAssembler itemModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler recommendationsPagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5)
+ Pageable pageInfo) {
+ Page
- itens = itemService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(itens));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ Item item = itemService.find(id);
+ return itemModelAssembler.toModel(new ItemDto(item));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid ItemForm itemForm,
+ UriComponentsBuilder uriBuilder) {
+ Item item = itemForm.build();
+ itemService.save(item);
+ URI uri = uriBuilder.path("/itens/{id}").buildAndExpand(item.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(itemModelAssembler.toModel(new ItemDto(item)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ public EntityModel update(@RequestBody @Valid ItemForm itemForm, @PathVariable Integer id) {
+ Item item = itemForm.build();
+ item.setId(id);
+ item = itemService.update(item);
+ return itemModelAssembler.toModel(new ItemDto(item));
+ }
+
+ @DeleteMapping("/{id}")
+ @Transactional
+ public ResponseEntity delete(@PathVariable Integer id) {
+ itemService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+
+ @GetMapping("/{itemId}/recommendations")
+ public PagedModel> listRecommendationsByItem(
+ @PathVariable Integer itemId,
+ @PageableDefault(page = 0, size = 5) Pageable pageInfo
+ ) {
+ Item item = itemService.find(itemId);
+ PageUtil pageUtil = new PageUtil<>(pageInfo, item.getRecommendations());
+ return recommendationsPagedResourcesAssembler.toModel(RecommendationDto.convert(pageUtil.getPage()));
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/ItemRatingController.java b/codigos/backend/src/main/java/com/srh/api/controller/ItemRatingController.java
new file mode 100644
index 0000000..67301e1
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/ItemRatingController.java
@@ -0,0 +1,76 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.ItemRatingDto;
+import com.srh.api.dto.resource.ItemRatingForm;
+import com.srh.api.hypermedia.ItemRatingModelAssembler;
+import com.srh.api.model.ItemRating;
+import com.srh.api.service.ItemRatingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+
+import java.net.URI;
+
+import static com.srh.api.dto.resource.ItemRatingDto.convert;
+
+@RestController
+@RequestMapping("/itemratings")
+public class ItemRatingController {
+ @Autowired
+ private ItemRatingService itemRatingService;
+
+ @Autowired
+ private ItemRatingModelAssembler itemRatingModelAssembler;
+
+ @Autowired
+ PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5)
+ Pageable pageInfo) {
+ Page itemRatings = itemRatingService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(itemRatings));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ ItemRating itemRating = itemRatingService.find(id);
+ return itemRatingModelAssembler.toModel(new ItemRatingDto(itemRating));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid ItemRatingForm itemRatingForm,
+ UriComponentsBuilder uriBuilder) {
+ ItemRating itemRating = itemRatingForm.build();
+ itemRatingService.save(itemRating);
+ URI uri = uriBuilder.path("/itemratings/{id}").buildAndExpand(itemRating.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(itemRatingModelAssembler.toModel(new ItemRatingDto(itemRating)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ public EntityModel update(@RequestBody @Valid ItemRatingForm itemRatingForm,
+ @PathVariable Integer id) {
+ ItemRating itemRating = itemRatingForm.build();
+ itemRating.setId(id);
+ itemRating = itemRatingService.update(itemRating);
+ return itemRatingModelAssembler.toModel(new ItemRatingDto(itemRating));
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ itemRatingService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/ItemTagController.java b/codigos/backend/src/main/java/com/srh/api/controller/ItemTagController.java
new file mode 100644
index 0000000..bc32a96
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/ItemTagController.java
@@ -0,0 +1,85 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.ItemTagDto;
+import com.srh.api.dto.resource.ItemTagForm;
+import com.srh.api.dto.resource.TagDto;
+import com.srh.api.hypermedia.ItemTagModelAssembler;
+import com.srh.api.hypermedia.TagModelAssembler;
+import com.srh.api.model.ItemTag;
+import com.srh.api.model.Tag;
+import com.srh.api.service.ItemTagService;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.validation.Valid;
+import java.net.URI;
+
+@RestController
+@RequestMapping("/itens/{itemId}/tags")
+public class ItemTagController {
+ @Autowired
+ private ItemTagService itemTagService;
+
+ @Autowired
+ private ItemTagModelAssembler itemTagModelAssembler;
+
+ @Autowired
+ private TagModelAssembler tagModelAssembler;
+
+ @Autowired
+ PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listTagsByItem(
+ @PathVariable Integer itemId, @PageableDefault(page = 0, size = 5) Pageable pageInfo
+ ) {
+ Page tags = itemTagService.listTagsByItem(itemId, pageInfo);
+ return pagedResourcesAssembler.toModel(TagDto.convert(tags));
+ }
+
+ @GetMapping("/{tagId}")
+ public EntityModel findTagByItem(@PathVariable Integer itemId,
+ @PathVariable Integer tagId) {
+ Tag tag = itemTagService.findTagByItem(itemId, tagId);
+ return tagModelAssembler.toModel(new TagDto(tag));
+ }
+
+ @PostMapping
+ @SneakyThrows
+ public ResponseEntity> linksTagsItem(
+ @PathVariable Integer itemId,
+ @RequestBody @Valid ItemTagForm itemTagForm,
+ UriComponentsBuilder uriBuilder
+ ) {
+ ItemTag itemTag = itemTagService.save(
+ itemTagForm.getItemId(),
+ itemTagForm.getTagId()
+ );
+
+ URI uri = uriBuilder.path("/itens/{itemId}/tags/{tagId}")
+ .buildAndExpand(itemTag.getItem().getId(), itemTag.getTag().getId())
+ .toUri();
+
+ return ResponseEntity.created(uri)
+ .body(itemTagModelAssembler.toModel(
+ new ItemTagDto(itemTag)
+ ));
+ }
+
+ @DeleteMapping("/{tagId}")
+ @SneakyThrows
+ public ResponseEntity delete(@PathVariable Integer itemId,
+ @PathVariable Integer tagId) {
+ itemTagService.delete(itemId, tagId);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/ProjectController.java b/codigos/backend/src/main/java/com/srh/api/controller/ProjectController.java
new file mode 100644
index 0000000..4d46e31
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/ProjectController.java
@@ -0,0 +1,97 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.ItemDto;
+import com.srh.api.dto.resource.ProjectDto;
+import com.srh.api.dto.resource.ProjectForm;
+import com.srh.api.hypermedia.ItemModelAssembler;
+import com.srh.api.hypermedia.ProjectModelAssembler;
+import com.srh.api.model.Item;
+import com.srh.api.model.Project;
+import com.srh.api.service.ProjectService;
+import com.srh.api.utils.PageUtil;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+import java.net.URI;
+
+import static com.srh.api.dto.resource.ProjectDto.convert;
+
+@RestController
+@RequestMapping("/projects")
+public class ProjectController {
+ @Autowired
+ private ProjectService projectService;
+
+ @Autowired
+ private ProjectModelAssembler projectModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler itemDtoPagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5)
+ Pageable pageInfo) {
+ Page projects = projectService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(projects));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ Project project = projectService.find(id);
+ return projectModelAssembler.toModel(new ProjectDto(project));
+ }
+
+ @PostMapping
+ @SneakyThrows
+ public ResponseEntity> create(@RequestBody @Valid ProjectForm projectForm,
+ UriComponentsBuilder uriBuilder) {
+ Project project = projectForm.build();
+ Project projectPersist = projectService.save(project);
+ URI uri = uriBuilder.path("/projects/{id}").buildAndExpand(project.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(projectModelAssembler.toModel(new ProjectDto(projectPersist)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ @SneakyThrows
+ public EntityModel update(@RequestBody @Valid ProjectForm projectForm,
+ @PathVariable Integer id) {
+ Project project = projectForm.build();
+ project.setId(id);
+ project = projectService.update(project);
+ return projectModelAssembler.toModel(new ProjectDto(project));
+ }
+
+ @DeleteMapping("/{id}")
+ @Transactional
+ public ResponseEntity delete(@PathVariable Integer id) {
+ projectService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+
+ @GetMapping("/{projectId}/itens")
+ public PagedModel> findItensByProject(
+ @PathVariable Integer projectId,
+ @PageableDefault(page = 0, size = 5) Pageable pageInfo
+ ) {
+ Project project = projectService.find(projectId);
+ PageUtil
- pageUtil = new PageUtil<>(pageInfo, project.getItens());
+
+ return itemDtoPagedResourcesAssembler.toModel(ItemDto.convert(pageUtil.getPage()));
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/ProjectEvaluatorController.java b/codigos/backend/src/main/java/com/srh/api/controller/ProjectEvaluatorController.java
new file mode 100644
index 0000000..9982799
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/ProjectEvaluatorController.java
@@ -0,0 +1,85 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.ProjectEvaluatorDto;
+import com.srh.api.dto.resource.ProjectEvaluatorForm;
+import com.srh.api.dto.resource.EvaluatorDto;
+import com.srh.api.hypermedia.ProjectEvaluatorModelAssembler;
+import com.srh.api.hypermedia.EvaluatorModelAssembler;
+import com.srh.api.model.ProjectEvaluator;
+import com.srh.api.model.Evaluator;
+import com.srh.api.service.ProjectEvaluatorService;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.validation.Valid;
+import java.net.URI;
+
+@RestController
+@RequestMapping("/projects/{projectId}/evaluators")
+public class ProjectEvaluatorController {
+ @Autowired
+ private ProjectEvaluatorService projectEvaluatorService;
+
+ @Autowired
+ private ProjectEvaluatorModelAssembler projectEvaluatorModelAssembler;
+
+ @Autowired
+ private EvaluatorModelAssembler evaluatorModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler evaluatorDtoPagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listRecommendersByProject(
+ @PathVariable Integer projectId, @PageableDefault(page = 0, size = 5) Pageable pageInfo) {
+ Page recommendersPage = projectEvaluatorService.
+ listEvaluatorsByProject(projectId, pageInfo);
+ return evaluatorDtoPagedResourcesAssembler.toModel(EvaluatorDto
+ .convert(recommendersPage));
+ }
+
+ @GetMapping("/{evaluatorId}")
+ public EntityModel findEvaluatorInProject(@PathVariable Integer projectId,
+ @PathVariable Integer evaluatorId) {
+ Evaluator evaluator = projectEvaluatorService.findEvaluatorByProject(projectId,
+ evaluatorId);
+ return evaluatorModelAssembler.toModel(new EvaluatorDto(evaluator));
+ }
+
+ @PostMapping
+ @SneakyThrows
+ public ResponseEntity> linkEvaluatorsProject(
+ @PathVariable Integer projectId, @RequestBody @Valid ProjectEvaluatorForm
+ projectRecommenderForm, UriComponentsBuilder uriBuilder) {
+
+ ProjectEvaluator projectEvaluator = projectEvaluatorService.save(
+ projectRecommenderForm.getProjectId(),
+ projectRecommenderForm.getEvaluatorId());
+
+ URI uri = uriBuilder.path("/projects/{projectId}/recommenders/{evaluatorId}")
+ .buildAndExpand(projectId, projectEvaluator.getEvaluator().getId())
+ .toUri();
+
+ return ResponseEntity.created(uri)
+ .body(projectEvaluatorModelAssembler.toModel(
+ new ProjectEvaluatorDto(projectEvaluator)
+ ));
+ }
+
+ @DeleteMapping("/{evaluatorId}")
+ @SneakyThrows
+ public ResponseEntity delete(@PathVariable Integer projectId,
+ @PathVariable Integer evaluatorId) {
+ projectEvaluatorService.delete(projectId, evaluatorId);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/RecommendationController.java b/codigos/backend/src/main/java/com/srh/api/controller/RecommendationController.java
new file mode 100644
index 0000000..b4cba47
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/RecommendationController.java
@@ -0,0 +1,53 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.RecommendationDto;
+import com.srh.api.hypermedia.RecommendationModelAssembler;
+import com.srh.api.model.Recommendation;
+import com.srh.api.service.RecommendationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.transaction.Transactional;
+
+import static com.srh.api.dto.resource.RecommendationDto.convert;
+
+@RestController
+@RequestMapping("/recommendations")
+public class RecommendationController {
+ @Autowired
+ private RecommendationService recommendationService;
+
+ @Autowired
+ private RecommendationModelAssembler recommendationModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5)
+ Pageable pageInfo) {
+ Page recommendations = recommendationService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(recommendations));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ Recommendation recommendation = recommendationService.find(id);
+ return recommendationModelAssembler.toModel(new RecommendationDto(recommendation));
+ }
+
+ @DeleteMapping("/{id}")
+ @Transactional
+ public ResponseEntity delete(@PathVariable Integer id) {
+ recommendationService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/RecommendationRatingController.java b/codigos/backend/src/main/java/com/srh/api/controller/RecommendationRatingController.java
new file mode 100644
index 0000000..9c2b200
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/RecommendationRatingController.java
@@ -0,0 +1,77 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.RecommendationRatingDto;
+import com.srh.api.dto.resource.RecommendationRatingForm;
+import com.srh.api.hypermedia.RecommendationRatingModelAssembler;
+import com.srh.api.model.RecommendationRating;
+import com.srh.api.service.RecommmendationRatingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+
+import java.net.URI;
+
+import static com.srh.api.dto.resource.RecommendationRatingDto.convert;
+
+@RestController
+@RequestMapping("/recommendationratings")
+public class RecommendationRatingController {
+ @Autowired
+ private RecommmendationRatingService recommmendationRatingService;
+
+ @Autowired
+ private RecommendationRatingModelAssembler recommendationRatingModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5)
+ Pageable pageInfo) {
+ Page recommendationRatingDtos = recommmendationRatingService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(recommendationRatingDtos));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ RecommendationRating recommendationRating = recommmendationRatingService.find(id);
+ return recommendationRatingModelAssembler.toModel(new RecommendationRatingDto(recommendationRating));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid
+ RecommendationRatingForm recommendationRatingForm,
+ UriComponentsBuilder uriBuilder) {
+ RecommendationRating recommendationRating = recommendationRatingForm.build();
+ recommmendationRatingService.save(recommendationRating);
+ URI uri = uriBuilder.path("/recommendationratings/{id}").buildAndExpand(recommendationRating.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(recommendationRatingModelAssembler.toModel(new RecommendationRatingDto(recommendationRating)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ public EntityModel update(@RequestBody @Valid RecommendationRatingForm recommendationRatingForm,
+ @PathVariable Integer id) {
+ RecommendationRating recommendationRating = recommendationRatingForm.build();
+ recommendationRating.setId(id);
+ recommendationRating = recommmendationRatingService.update(recommendationRating);
+ return recommendationRatingModelAssembler.toModel(new RecommendationRatingDto(recommendationRating));
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ recommmendationRatingService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+}
\ No newline at end of file
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/TagController.java b/codigos/backend/src/main/java/com/srh/api/controller/TagController.java
new file mode 100644
index 0000000..2304cb1
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/TagController.java
@@ -0,0 +1,74 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.TagDto;
+import com.srh.api.dto.resource.TagForm;
+import com.srh.api.hypermedia.TagModelAssembler;
+import com.srh.api.model.Tag;
+import com.srh.api.service.TagService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+import java.net.URI;
+
+import static com.srh.api.dto.resource.TagDto.*;
+
+@RestController
+@RequestMapping("/tags")
+public class TagController {
+ @Autowired
+ private TagService tagService;
+
+ @Autowired
+ private TagModelAssembler tagModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5) Pageable pageInfo) {
+ Page tags = tagService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(tags));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ Tag tag = tagService.find(id);
+ return tagModelAssembler.toModel(new TagDto(tag));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid TagForm tagForm,
+ UriComponentsBuilder uriBuilder) {
+ Tag tag = tagForm.build();
+ tagService.save(tag);
+ URI uri = uriBuilder.path("/tags/{id}").buildAndExpand(tag.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(tagModelAssembler.toModel(new TagDto(tag)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ public EntityModel update(@RequestBody @Valid TagForm tagForm, @PathVariable Integer id) {
+ Tag tag = tagForm.build();
+ tag.setId(id);
+ tag = tagService.update(tag);
+ return tagModelAssembler.toModel(new TagDto(tag));
+ }
+
+ @DeleteMapping("/{id}")
+ @Transactional
+ public ResponseEntity delete(@PathVariable Integer id) {
+ tagService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/TypeItemAttributeController.java b/codigos/backend/src/main/java/com/srh/api/controller/TypeItemAttributeController.java
new file mode 100644
index 0000000..fdbac7f
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/TypeItemAttributeController.java
@@ -0,0 +1,86 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.AttributeDto;
+import com.srh.api.dto.resource.TypeItemAttributeDto;
+import com.srh.api.dto.resource.TypeItemAttributeForm;
+import com.srh.api.hypermedia.AttributeModelAssembler;
+import com.srh.api.hypermedia.TypeItemAttributeModelAssembler;
+import com.srh.api.model.Attribute;
+import com.srh.api.model.TypeItemAttribute;
+import com.srh.api.service.TypeItemAttributeService;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.validation.Valid;
+import java.net.URI;
+
+@RestController
+@RequestMapping("/typeitens/{typeItemId}/attributes")
+public class TypeItemAttributeController {
+ @Autowired
+ private TypeItemAttributeService typeItemAttributeService;
+
+ @Autowired
+ private TypeItemAttributeModelAssembler typeItemAttributeModelAssembler;
+
+ @Autowired
+ private AttributeModelAssembler attributeModelAssembler;
+
+ @Autowired
+ private PagedResourcesAssembler pagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAttributesByTypeItem(
+ @PathVariable Integer typeItemId, @PageableDefault(page = 0, size = 5) Pageable pageInfo
+ ) {
+ Page attributes = typeItemAttributeService.listAttributesByTypeItem(typeItemId, pageInfo);
+ return pagedResourcesAssembler.toModel(AttributeDto.convert(attributes));
+ }
+
+ @GetMapping("/{attributeId}")
+ public EntityModel findAttributeInTypeItem(@PathVariable Integer typeItemId,
+ @PathVariable Integer attributeId) {
+ Attribute attribute = typeItemAttributeService.findAttributeByTypeItem(typeItemId, attributeId);
+ return attributeModelAssembler.toModel(new AttributeDto(attribute));
+ }
+
+ @PostMapping
+ @SneakyThrows
+ public ResponseEntity> linksAttributesTypeItem(
+ @PathVariable Integer typeItemId,
+ @RequestBody @Valid TypeItemAttributeForm typeItemAttributeForm,
+ UriComponentsBuilder uriBuilder
+ ) {
+
+ TypeItemAttribute typeItemAttribute = typeItemAttributeService.save(
+ typeItemAttributeForm.getTypeItemId(),
+ typeItemAttributeForm.getAttributeId()
+ );
+
+ URI uri = uriBuilder.path("/projects/{projectId}/recommenders/{evaluatorId}")
+ .buildAndExpand(typeItemId, typeItemAttributeForm.getAttributeId())
+ .toUri();
+
+ return ResponseEntity.created(uri)
+ .body(typeItemAttributeModelAssembler.toModel(
+ new TypeItemAttributeDto(typeItemAttribute)
+ ));
+ }
+
+ @DeleteMapping("/{attributeId}")
+ @SneakyThrows
+ public ResponseEntity delete(@PathVariable Integer typeItemId,
+ @PathVariable Integer attributeId) {
+ typeItemAttributeService.delete(typeItemId, attributeId);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/controller/TypeItemController.java b/codigos/backend/src/main/java/com/srh/api/controller/TypeItemController.java
new file mode 100644
index 0000000..470470c
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/controller/TypeItemController.java
@@ -0,0 +1,91 @@
+package com.srh.api.controller;
+
+import com.srh.api.dto.resource.ItemDto;
+import com.srh.api.dto.resource.TypeItemDto;
+import com.srh.api.dto.resource.TypeItemForm;
+import com.srh.api.hypermedia.TypeItemModelAssembler;
+import com.srh.api.model.Item;
+import com.srh.api.model.TypeItem;
+import com.srh.api.service.TypeItemService;
+import com.srh.api.utils.PageUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.data.web.PagedResourcesAssembler;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.transaction.Transactional;
+import javax.validation.Valid;
+
+import java.net.URI;
+
+import static com.srh.api.dto.resource.TypeItemDto.*;
+
+@RestController
+@RequestMapping("/typeitens")
+public class TypeItemController {
+ @Autowired
+ private TypeItemService typeItemService;
+
+ @Autowired
+ private TypeItemModelAssembler typeItemModelAssembler;
+
+ @Autowired
+ PagedResourcesAssembler pagedResourcesAssembler;
+
+ @Autowired
+ PagedResourcesAssembler itemDtoPagedResourcesAssembler;
+
+ @GetMapping
+ public PagedModel> listAll(@PageableDefault(page = 0, size = 5) Pageable pageInfo) {
+ Page typeItems = typeItemService.findAll(pageInfo);
+ return pagedResourcesAssembler.toModel(convert(typeItems));
+ }
+
+ @GetMapping("/{id}")
+ public EntityModel find(@PathVariable Integer id) {
+ TypeItem typeItem = typeItemService.find(id);
+ return typeItemModelAssembler.toModel(new TypeItemDto(typeItem));
+ }
+
+ @PostMapping
+ public ResponseEntity> create(@RequestBody @Valid TypeItemForm typeItemForm,
+ UriComponentsBuilder uriBuilder) {
+ TypeItem typeItem = typeItemForm.build();
+ typeItemService.save(typeItem);
+ URI uri = uriBuilder.path("/typeitems/{id}").buildAndExpand(typeItem.getId()).toUri();
+ return ResponseEntity.created(uri)
+ .body(typeItemModelAssembler.toModel(new TypeItemDto(typeItem)));
+ }
+
+ @PutMapping("/{id}")
+ @Transactional
+ public EntityModel update(@RequestBody @Valid TypeItemForm typeItemForm, @PathVariable Integer id) {
+ TypeItem typeItem = typeItemForm.build();
+ typeItem.setId(id);
+ typeItem = typeItemService.update(typeItem);
+ return typeItemModelAssembler.toModel(new TypeItemDto(typeItem));
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable Integer id) {
+ typeItemService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+
+ @GetMapping("/{typeItemId}/itens")
+ public PagedModel> findItensByTypeItem(
+ @PathVariable Integer typeItemId,
+ @PageableDefault(page = 0, size = 5) Pageable pageInfo
+ ) {
+ TypeItem typeItem = typeItemService.find(typeItemId);
+ PageUtil
- pageUtil = new PageUtil<>(pageInfo, typeItem.getItens());
+ return itemDtoPagedResourcesAssembler.toModel(ItemDto.convert(pageUtil.getPage()));
+ }
+
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/auth/AuthDto.java b/codigos/backend/src/main/java/com/srh/api/dto/auth/AuthDto.java
new file mode 100644
index 0000000..00d0379
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/auth/AuthDto.java
@@ -0,0 +1,11 @@
+package com.srh.api.dto.auth;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class AuthDto {
+ private final String token;
+ private final String type;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/auth/LoginForm.java b/codigos/backend/src/main/java/com/srh/api/dto/auth/LoginForm.java
new file mode 100644
index 0000000..771df14
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/auth/LoginForm.java
@@ -0,0 +1,24 @@
+package com.srh.api.dto.auth;
+
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class LoginForm {
+ @NotNull
+ @NotEmpty
+ private String login;
+
+ @NotNull
+ @NotEmpty
+ @Length(min = 6)
+ private String password;
+
+ public UsernamePasswordAuthenticationToken convert() {
+ return new UsernamePasswordAuthenticationToken(login, password);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/error/DefaultErrorDto.java b/codigos/backend/src/main/java/com/srh/api/dto/error/DefaultErrorDto.java
new file mode 100644
index 0000000..b102ebc
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/error/DefaultErrorDto.java
@@ -0,0 +1,11 @@
+package com.srh.api.dto.error;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class DefaultErrorDto {
+ private final String error;
+ private final String cause;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/error/FormErrorDto.java b/codigos/backend/src/main/java/com/srh/api/dto/error/FormErrorDto.java
new file mode 100644
index 0000000..000f14b
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/error/FormErrorDto.java
@@ -0,0 +1,11 @@
+package com.srh.api.dto.error;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class FormErrorDto {
+ private final String error;
+ private final String field;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/AdminDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/AdminDto.java
new file mode 100644
index 0000000..42c1df1
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/AdminDto.java
@@ -0,0 +1,33 @@
+package com.srh.api.dto.resource;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.srh.api.model.Admin;
+import com.srh.api.model.Project;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+import java.util.List;
+
+@Getter
+@Relation(collectionRelation = "admins")
+public class AdminDto {
+ private final Integer id;
+ private final String name;
+ private final String login;
+ private final String email;
+ @JsonIgnore
+ private final List projects;
+
+ public AdminDto(Admin admin) {
+ this.id = admin.getId();
+ this.name = admin.getName();
+ this.login = admin.getLogin();
+ this.email = admin.getEmail();
+ this.projects = admin.getProjects();
+ }
+
+ public static Page convert(Page admins) {
+ return admins.map(AdminDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/AdminForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/AdminForm.java
new file mode 100644
index 0000000..5b04665
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/AdminForm.java
@@ -0,0 +1,49 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.AdminBuilder;
+import com.srh.api.model.Admin;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class AdminForm {
+ @NotNull
+ @NotEmpty
+ @Length(min = 3)
+ private String name;
+
+ @NotNull
+ @NotEmpty
+ @Length(min = 3)
+ private String login;
+
+ @NotNull
+ @NotEmpty
+ @Length(min = 6)
+ private String password;
+
+ @NotNull
+ @NotEmpty
+ @Email
+ private String email;
+
+ private String oldPassword;
+
+ public Admin build() {
+ return AdminBuilder.anAdmin()
+ .withName(name)
+ .withLogin(login)
+ .withEmail(email)
+ .withPassword(password)
+ .withOldPassword(password)
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/AlgorithmDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/AlgorithmDto.java
new file mode 100644
index 0000000..d13fe87
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/AlgorithmDto.java
@@ -0,0 +1,24 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.Algorithm;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "algorithms")
+public class AlgorithmDto {
+ private final Integer id;
+ private final String name;
+ private final String typeRecommendation;
+
+ public AlgorithmDto(Algorithm algorithm) {
+ this.id = algorithm.getId();
+ this.name = algorithm.getName();
+ this.typeRecommendation = algorithm.getTypeRecommendation().toString();
+ }
+
+ public static Page convert(Page algorithms) {
+ return algorithms.map(AlgorithmDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/AlgorithmForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/AlgorithmForm.java
new file mode 100644
index 0000000..83e3658
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/AlgorithmForm.java
@@ -0,0 +1,31 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.AlgorithmBuilder;
+import com.srh.api.model.Algorithm;
+import com.srh.api.model.TypeRecommendation;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class AlgorithmForm {
+ @NotNull
+ @NotEmpty
+ private String name;
+
+ @NotNull
+ @NotEmpty
+ private String typeRecommendation;
+
+ public Algorithm build() {
+ return AlgorithmBuilder.anAlgorithm()
+ .withName(name)
+ .withTypeRecommendation(TypeRecommendation.valueOf(typeRecommendation))
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ApiUserForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ApiUserForm.java
new file mode 100644
index 0000000..3d86431
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ApiUserForm.java
@@ -0,0 +1,52 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.ApiUserBuilder;
+import com.srh.api.model.ApiUser;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ApiUserForm {
+ @NotEmpty
+ @NotNull
+ @Length(min = 3)
+ private String name;
+
+ @NotEmpty
+ @NotNull
+ @Length(min = 3)
+ private String login;
+
+ @NotEmpty
+ @NotNull
+ @Length(min = 6)
+ private String password;
+
+ @NotNull
+ @NotEmpty
+ @Email
+ private String email;
+
+ private String oldPassword;
+
+ @NotNull
+ private Boolean isAdmin;
+
+ public ApiUser build() {
+ return ApiUserBuilder.anApiUser()
+ .withLogin(login)
+ .withName(name)
+ .withEmail(email)
+ .withPassword(password)
+ .withOldPassword(oldPassword)
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ApiUsersDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ApiUsersDto.java
new file mode 100644
index 0000000..da4c0db
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ApiUsersDto.java
@@ -0,0 +1,34 @@
+package com.srh.api.dto.resource;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.srh.api.model.ApiUser;
+import com.srh.api.model.Profile;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+import java.util.List;
+
+@Getter
+@Relation(collectionRelation = "apiUsers")
+public class ApiUsersDto {
+ private final Integer id;
+ private final String name;
+ private final String login;
+ private final String email;
+
+ @JsonIgnore
+ private final List profiles;
+
+ public ApiUsersDto(ApiUser apiUser) {
+ this.id = apiUser.getId();
+ this.name = apiUser.getName();
+ this.login = apiUser.getLogin();
+ this.profiles = apiUser.getProfiles();
+ this.email = apiUser.getEmail();
+ }
+
+ public static Page convert(Page users) {
+ return users.map(ApiUsersDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/AttributeDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/AttributeDto.java
new file mode 100644
index 0000000..6622030
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/AttributeDto.java
@@ -0,0 +1,26 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.Attribute;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "attributes")
+public class AttributeDto {
+ private final Integer id;
+ private final String name;
+ private final String value;
+ private final String type;
+
+ public AttributeDto(Attribute attribute) {
+ this.id = attribute.getId();
+ this.name = attribute.getName();
+ this.value = attribute.getValue();
+ this.type = attribute.getType().toString();
+ }
+
+ public static Page convert(Page attributes) {
+ return attributes.map(AttributeDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/AttributeForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/AttributeForm.java
new file mode 100644
index 0000000..5eb3827
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/AttributeForm.java
@@ -0,0 +1,36 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.AttributeBuilder;
+import com.srh.api.model.Attribute;
+import com.srh.api.model.TypeAttribute;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class AttributeForm {
+ @NotNull
+ @NotEmpty
+ private String name;
+
+ @NotNull
+ @NotEmpty
+ private String value;
+
+ @NotNull
+ @NotEmpty
+ private String type;
+
+ public Attribute build() {
+ return AttributeBuilder.anAttribute()
+ .withName(name)
+ .withValue(value)
+ .withType(TypeAttribute.valueOf(type))
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/EvaluatorDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/EvaluatorDto.java
new file mode 100644
index 0000000..905ff50
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/EvaluatorDto.java
@@ -0,0 +1,26 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.Evaluator;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "evaluators")
+public class EvaluatorDto {
+ private final Integer id;
+ private final String name;
+ private final String login;
+ private final String email;
+
+ public EvaluatorDto(Evaluator evaluator) {
+ this.id = evaluator.getId();
+ this.name = evaluator.getName();
+ this.login = evaluator.getLogin();
+ this.email = evaluator.getEmail();
+ }
+
+ public static Page convert(Page users) {
+ return users.map(EvaluatorDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/EvaluatorForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/EvaluatorForm.java
new file mode 100644
index 0000000..6d53265
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/EvaluatorForm.java
@@ -0,0 +1,49 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.EvaluatorBuilder;
+import com.srh.api.model.Evaluator;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class EvaluatorForm {
+ @NotNull
+ @NotEmpty
+ @Length(min = 3)
+ private String name;
+
+ @NotNull
+ @NotEmpty
+ @Length(min = 3)
+ private String login;
+
+ @NotNull
+ @NotEmpty
+ @Length(min = 6)
+ private String password;
+
+ @NotNull
+ @NotEmpty
+ @Email
+ private String email;
+
+ private String oldPassword;
+
+ public Evaluator build() {
+ return EvaluatorBuilder.anEvaluator()
+ .withName(name)
+ .withLogin(login)
+ .withPassword(password)
+ .withOldPassword(oldPassword)
+ .withEmail(email)
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemAttributeDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemAttributeDto.java
new file mode 100644
index 0000000..50e2466
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemAttributeDto.java
@@ -0,0 +1,17 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.ItemAttribute;
+import lombok.Getter;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "relationship")
+public class ItemAttributeDto {
+ private final Integer itemId;
+ private final Integer attributeId;
+
+ public ItemAttributeDto(ItemAttribute itemAttribute) {
+ this.itemId = itemAttribute.getItem().getId();
+ this.attributeId = itemAttribute.getAttribute().getId();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemAttributeForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemAttributeForm.java
new file mode 100644
index 0000000..f57b322
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemAttributeForm.java
@@ -0,0 +1,18 @@
+package com.srh.api.dto.resource;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ItemAttributeForm {
+ @NotNull
+ private Integer itemId;
+
+ @NotNull
+ private Integer attributeId;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemDto.java
new file mode 100644
index 0000000..f3703b3
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemDto.java
@@ -0,0 +1,33 @@
+package com.srh.api.dto.resource;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.srh.api.model.Item;
+import com.srh.api.model.Project;
+import com.srh.api.model.TypeItem;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "itens")
+public class ItemDto {
+ private final Integer id;
+ private final String name;
+ private final String description;
+ @JsonIgnore
+ private final Project project;
+ @JsonIgnore
+ private final TypeItem typeItem;
+
+ public ItemDto(Item item) {
+ this.id = item.getId();
+ this.name = item.getName();
+ this.description = item.getDescription();
+ this.project = item.getProject();
+ this.typeItem = item.getTypeItem();
+ }
+
+ public static Page convert(Page
- items) {
+ return items.map(ItemDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemForm.java
new file mode 100644
index 0000000..f0018c9
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemForm.java
@@ -0,0 +1,43 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.ItemBuilder;
+import com.srh.api.builder.ProjectBuilder;
+import com.srh.api.model.Item;
+import com.srh.api.model.Project;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ItemForm {
+ @NotNull
+ @NotEmpty
+ @Length(min = 3)
+ private String name;
+
+ @NotNull
+ @NotEmpty
+ @Length(min = 3)
+ private String description;
+
+ @NotNull
+ private Integer projectId;
+
+ public Item build() {
+ Project project = ProjectBuilder.aProject()
+ .withId(projectId)
+ .build();
+
+ return ItemBuilder.anItem()
+ .withName(name)
+ .withDescription(description)
+ .withProject(project)
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemRatingDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemRatingDto.java
new file mode 100644
index 0000000..88b8b56
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemRatingDto.java
@@ -0,0 +1,28 @@
+package com.srh.api.dto.resource;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.srh.api.model.Evaluator;
+import com.srh.api.model.Item;
+import com.srh.api.model.ItemRating;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "itemRatings")
+public class ItemRatingDto extends RatingDto {
+ @JsonIgnore
+ private final Item item;
+ @JsonIgnore
+ private final Evaluator evaluator;
+
+ public ItemRatingDto(ItemRating itemRating) {
+ super(itemRating);
+ this.item = itemRating.getItem();
+ this.evaluator = itemRating.getEvaluator();
+ }
+
+ public static Page convert(Page itemRatings) {
+ return itemRatings.map(ItemRatingDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemRatingForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemRatingForm.java
new file mode 100644
index 0000000..5860228
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemRatingForm.java
@@ -0,0 +1,43 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.EvaluatorBuilder;
+import com.srh.api.builder.ItemBuilder;
+import com.srh.api.builder.ItemRatingBuilder;
+import com.srh.api.model.Evaluator;
+import com.srh.api.model.Item;
+import com.srh.api.model.ItemRating;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ItemRatingForm {
+ @NotNull
+ private Double score;
+ @NotNull
+ private Integer evaluatorId;
+ @NotNull
+ private Integer itemId;
+
+ public ItemRating build() {
+ Evaluator evaluator = EvaluatorBuilder.anEvaluator()
+ .withId(evaluatorId)
+ .build();
+
+ Item item = ItemBuilder.anItem()
+ .withId(itemId)
+ .build();
+
+ return ItemRatingBuilder.anItemRating()
+ .withScore(score)
+ .withEvaluator(evaluator)
+ .withItem(item)
+ .withDate(LocalDateTime.now())
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemTagDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemTagDto.java
new file mode 100644
index 0000000..56679c2
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemTagDto.java
@@ -0,0 +1,17 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.ItemTag;
+import lombok.Getter;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "relationship")
+public class ItemTagDto {
+ private final Integer itemId;
+ private final Integer tagId;
+
+ public ItemTagDto(ItemTag itemTag) {
+ this.itemId = itemTag.getItem().getId();
+ this.tagId = itemTag.getTag().getId();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemTagForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemTagForm.java
new file mode 100644
index 0000000..3a825f9
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ItemTagForm.java
@@ -0,0 +1,17 @@
+package com.srh.api.dto.resource;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ItemTagForm {
+ @NotNull
+ private Integer itemId;
+ @NotNull
+ private Integer tagId;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectDto.java
new file mode 100644
index 0000000..7bc363b
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectDto.java
@@ -0,0 +1,38 @@
+package com.srh.api.dto.resource;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.srh.api.model.Admin;
+import com.srh.api.model.Project;
+import com.srh.api.model.Situations;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+import java.time.LocalDate;
+
+@Getter
+@Relation(collectionRelation = "projects")
+public class ProjectDto {
+ private final Integer id;
+ private final String name;
+ private final String description;
+ private final Situations situation;
+ private final LocalDate date;
+ private final Boolean visible;
+ @JsonIgnore
+ private final Admin admin;
+
+ public ProjectDto(Project project) {
+ this.id = project.getId();
+ this.name = project.getName();
+ this.description = project.getDescription();
+ this.date = project.getDate();
+ this.situation = project.getSituation();
+ this.visible = project.getVisible();
+ this.admin = project.getAdmin();
+ }
+
+ public static Page convert(Page projects) {
+ return projects.map(ProjectDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectEvaluatorDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectEvaluatorDto.java
new file mode 100644
index 0000000..e38260d
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectEvaluatorDto.java
@@ -0,0 +1,17 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.ProjectEvaluator;
+import lombok.Getter;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "relationship")
+public class ProjectEvaluatorDto {
+ private final Integer projectId;
+ private final Integer evaluatorId;
+
+ public ProjectEvaluatorDto(ProjectEvaluator projectEvaluator) {
+ this.projectId = projectEvaluator.getProject().getId();
+ this.evaluatorId = projectEvaluator.getEvaluator().getId();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectEvaluatorForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectEvaluatorForm.java
new file mode 100644
index 0000000..b34efb9
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectEvaluatorForm.java
@@ -0,0 +1,17 @@
+package com.srh.api.dto.resource;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProjectEvaluatorForm {
+ @NotNull
+ private Integer projectId;
+ @NotNull
+ private Integer evaluatorId;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectForm.java
new file mode 100644
index 0000000..8662e0a
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/ProjectForm.java
@@ -0,0 +1,56 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.AdminBuilder;
+import com.srh.api.builder.ProjectBuilder;
+import com.srh.api.model.Admin;
+import com.srh.api.model.Project;
+import com.srh.api.model.Situations;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProjectForm {
+
+ @NotEmpty
+ @NotNull
+ @Length(min = 3)
+ private String name;
+
+ @NotEmpty
+ @NotNull
+ @Length(min = 3)
+ private String description;
+
+ @NotNull
+ private Integer adminId;
+
+ @NotNull
+ @NotEmpty
+ private String situation;
+
+ @NotNull
+ private Boolean visible;
+
+ public Project build() {
+ Admin admin = AdminBuilder.anAdmin()
+ .withId(adminId)
+ .build();
+
+ return ProjectBuilder.aProject()
+ .withName(name)
+ .withDescription(description)
+ .withAdmin(admin)
+ .withSituation(Situations.valueOf(situation))
+ .withDate(LocalDate.now())
+ .withVisible(visible)
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/RatingDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/RatingDto.java
new file mode 100644
index 0000000..ad4e75c
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/RatingDto.java
@@ -0,0 +1,21 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.ItemRating;
+import com.srh.api.model.Rating;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+
+import java.time.LocalDateTime;
+
+@Getter
+public class RatingDto {
+ private final Integer id;
+ private final Double score;
+ private final LocalDateTime date;
+
+ public RatingDto(Rating rating) {
+ this.id = rating.getId();
+ this.score = rating.getScore();
+ this.date = rating.getDate();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationDto.java
new file mode 100644
index 0000000..55ac67d
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationDto.java
@@ -0,0 +1,28 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.Recommendation;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+import java.time.LocalDateTime;
+
+@Getter
+@Relation(collectionRelation = "recommendations")
+public class RecommendationDto {
+ private final Integer id;
+ private final Double weight;
+ private final LocalDateTime date;
+ private final Integer runtimeInSeconds;
+
+ public RecommendationDto(Recommendation recommendation) {
+ this.id = recommendation.getId();
+ this.weight = recommendation.getWeight();
+ this.date = recommendation.getDate();
+ this.runtimeInSeconds = recommendation.getRuntimeInSeconds();
+ }
+
+ public static Page convert(Page recommendations) {
+ return recommendations.map(RecommendationDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationRatingDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationRatingDto.java
new file mode 100644
index 0000000..53884ab
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationRatingDto.java
@@ -0,0 +1,28 @@
+package com.srh.api.dto.resource;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.srh.api.model.Evaluator;
+import com.srh.api.model.Recommendation;
+import com.srh.api.model.RecommendationRating;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "recommendationRatings")
+public class RecommendationRatingDto extends RatingDto {
+ @JsonIgnore
+ private final Recommendation recommendation;
+ @JsonIgnore
+ private final Evaluator evaluator;
+
+ public RecommendationRatingDto(RecommendationRating recommedationRating) {
+ super(recommedationRating);
+ this.recommendation = recommedationRating.getRecommendation();
+ this.evaluator = recommedationRating.getEvaluator();
+ }
+
+ public static Page convert(Page recommendationRatings) {
+ return recommendationRatings.map(RecommendationRatingDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationRatingForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationRatingForm.java
new file mode 100644
index 0000000..f9413ac
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/RecommendationRatingForm.java
@@ -0,0 +1,44 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.EvaluatorBuilder;
+import com.srh.api.builder.RecommendationBuilder;
+import com.srh.api.builder.RecommendationRatingBuilder;
+import com.srh.api.model.Evaluator;
+import com.srh.api.model.Recommendation;
+import com.srh.api.model.RecommendationRating;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class RecommendationRatingForm {
+ @NotNull
+ private Double score;
+ @NotNull
+ private Integer evaluatorId;
+ @NotNull
+ private Integer recommendationId;
+
+ public RecommendationRating build() {
+ Evaluator evaluator = EvaluatorBuilder.anEvaluator()
+ .withId(evaluatorId)
+ .build();
+
+ Recommendation recommendation = RecommendationBuilder.aRecommendation()
+ .withId(recommendationId)
+ .build();
+
+ return RecommendationRatingBuilder.aRecommendationRating()
+ .withScore(score)
+ .withEvaluator(evaluator)
+ .withRecommendation(recommendation)
+ .withScore(score)
+ .withDate(LocalDateTime.now())
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/TagDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/TagDto.java
new file mode 100644
index 0000000..00ee05b
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/TagDto.java
@@ -0,0 +1,22 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.Tag;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "tags")
+public class TagDto {
+ private final Integer id;
+ private final String name;
+
+ public TagDto(Tag tag) {
+ this.id = tag.getId();
+ this.name = tag.getName();
+ }
+
+ public static Page convert(Page tags) {
+ return tags.map(TagDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/TagForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/TagForm.java
new file mode 100644
index 0000000..28f8080
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/TagForm.java
@@ -0,0 +1,25 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.TagBuilder;
+import com.srh.api.model.Tag;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class TagForm {
+ @NotEmpty
+ @NotNull
+ private String name;
+
+ public Tag build() {
+ return TagBuilder.aTag()
+ .withName(name)
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemAttributeDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemAttributeDto.java
new file mode 100644
index 0000000..207803f
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemAttributeDto.java
@@ -0,0 +1,17 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.TypeItemAttribute;
+import lombok.Getter;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "relationship")
+public class TypeItemAttributeDto {
+ private final Integer typeItemId;
+ private final Integer attributeId;
+
+ public TypeItemAttributeDto(TypeItemAttribute typeItemAttribute) {
+ this.typeItemId = typeItemAttribute.getTypeItem().getId();
+ this.attributeId = typeItemAttribute.getAttribute().getId();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemAttributeForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemAttributeForm.java
new file mode 100644
index 0000000..e820f43
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemAttributeForm.java
@@ -0,0 +1,18 @@
+package com.srh.api.dto.resource;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class TypeItemAttributeForm {
+ @NotNull
+ private Integer typeItemId;
+
+ @NotNull
+ private Integer attributeId;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemDto.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemDto.java
new file mode 100644
index 0000000..f903b5e
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemDto.java
@@ -0,0 +1,22 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.model.TypeItem;
+import lombok.Getter;
+import org.springframework.data.domain.Page;
+import org.springframework.hateoas.server.core.Relation;
+
+@Getter
+@Relation(collectionRelation = "typeitems")
+public class TypeItemDto {
+ private final Integer id;
+ private final String name;
+
+ public TypeItemDto(TypeItem typeItem) {
+ this.id = typeItem.getId();
+ this.name = typeItem.getName();
+ }
+
+ public static Page convert(Page typeItems) {
+ return typeItems.map(TypeItemDto::new);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemForm.java b/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemForm.java
new file mode 100644
index 0000000..ecbb152
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/dto/resource/TypeItemForm.java
@@ -0,0 +1,25 @@
+package com.srh.api.dto.resource;
+
+import com.srh.api.builder.TypeItemBuilder;
+import com.srh.api.model.TypeItem;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class TypeItemForm {
+ @NotNull
+ @NotEmpty
+ private String name;
+
+ public TypeItem build() {
+ return TypeItemBuilder.aTypeItem()
+ .withName(name)
+ .build();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/exception/ChangeRootRelationException.java b/codigos/backend/src/main/java/com/srh/api/error/exception/ChangeRootRelationException.java
new file mode 100644
index 0000000..06d6e11
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/exception/ChangeRootRelationException.java
@@ -0,0 +1,7 @@
+package com.srh.api.error.exception;
+
+public class ChangeRootRelationException extends Exception {
+ public ChangeRootRelationException(String message) {
+ super(message);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/exception/DuplicateValueException.java b/codigos/backend/src/main/java/com/srh/api/error/exception/DuplicateValueException.java
new file mode 100644
index 0000000..7491d53
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/exception/DuplicateValueException.java
@@ -0,0 +1,7 @@
+package com.srh.api.error.exception;
+
+public class DuplicateValueException extends Exception {
+ public DuplicateValueException(String message) {
+ super(message);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/exception/InvalidTokenException.java b/codigos/backend/src/main/java/com/srh/api/error/exception/InvalidTokenException.java
new file mode 100644
index 0000000..3cc5453
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/exception/InvalidTokenException.java
@@ -0,0 +1,7 @@
+package com.srh.api.error.exception;
+
+public class InvalidTokenException extends RuntimeException {
+ public InvalidTokenException(String message) {
+ super(message);
+ }
+}
\ No newline at end of file
diff --git a/codigos/backend/src/main/java/com/srh/api/error/exception/InvalidUserInTokenException.java b/codigos/backend/src/main/java/com/srh/api/error/exception/InvalidUserInTokenException.java
new file mode 100644
index 0000000..7e96f3c
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/exception/InvalidUserInTokenException.java
@@ -0,0 +1,7 @@
+package com.srh.api.error.exception;
+
+public class InvalidUserInTokenException extends RuntimeException{
+ public InvalidUserInTokenException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/exception/NotEqualsPasswordException.java b/codigos/backend/src/main/java/com/srh/api/error/exception/NotEqualsPasswordException.java
new file mode 100644
index 0000000..50647d8
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/exception/NotEqualsPasswordException.java
@@ -0,0 +1,7 @@
+package com.srh.api.error.exception;
+
+public class NotEqualsPasswordException extends Exception {
+ public NotEqualsPasswordException(String message) {
+ super(message);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/exception/OldPasswordNotFoundException.java b/codigos/backend/src/main/java/com/srh/api/error/exception/OldPasswordNotFoundException.java
new file mode 100644
index 0000000..a82de0f
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/exception/OldPasswordNotFoundException.java
@@ -0,0 +1,7 @@
+package com.srh.api.error.exception;
+
+public class OldPasswordNotFoundException extends Exception {
+ public OldPasswordNotFoundException(String message) {
+ super(message);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/exception/ProjectNotOpenedException.java b/codigos/backend/src/main/java/com/srh/api/error/exception/ProjectNotOpenedException.java
new file mode 100644
index 0000000..790beeb
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/exception/ProjectNotOpenedException.java
@@ -0,0 +1,7 @@
+package com.srh.api.error.exception;
+
+public class ProjectNotOpenedException extends Exception {
+ public ProjectNotOpenedException(String message) {
+ super(message);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/exception/RelationshipNotFoundException.java b/codigos/backend/src/main/java/com/srh/api/error/exception/RelationshipNotFoundException.java
new file mode 100644
index 0000000..d901df7
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/exception/RelationshipNotFoundException.java
@@ -0,0 +1,7 @@
+package com.srh.api.error.exception;
+
+public class RelationshipNotFoundException extends Exception{
+ public RelationshipNotFoundException(String message) {
+ super(message);
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/ChangeRootRelationHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/ChangeRootRelationHandler.java
new file mode 100644
index 0000000..d5a3e2e
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/ChangeRootRelationHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import com.srh.api.error.exception.ChangeRootRelationException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class ChangeRootRelationHandler {
+ @ResponseStatus(code = HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(ChangeRootRelationException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "Não é possÃvel alterar a relação entre os recursos",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/ConstraintViolationHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/ConstraintViolationHandler.java
new file mode 100644
index 0000000..f3eef00
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/ConstraintViolationHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import org.hibernate.exception.ConstraintViolationException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class ConstraintViolationHandler {
+ @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+ @ExceptionHandler(ConstraintViolationException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "Dados inválidos tentaram ser inseridos na base de dados",
+ "Veja se campos como login ou outros com validações não possuem problema"
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/DuplicateValueHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/DuplicateValueHandler.java
new file mode 100644
index 0000000..207a64e
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/DuplicateValueHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import com.srh.api.error.exception.DuplicateValueException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class DuplicateValueHandler {
+ @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
+ @ExceptionHandler(DuplicateValueException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "O vÃnculo entre os recursos não existe",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/EntityNotFoundHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/EntityNotFoundHandler.java
new file mode 100644
index 0000000..325ec33
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/EntityNotFoundHandler.java
@@ -0,0 +1,21 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.persistence.EntityNotFoundException;
+
+@RestControllerAdvice
+public class EntityNotFoundHandler {
+ @ResponseStatus(code = HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(EntityNotFoundException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "Um dos dados informados não existe",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/FormHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/FormHandler.java
new file mode 100644
index 0000000..28b206b
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/FormHandler.java
@@ -0,0 +1,37 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.FormErrorDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestControllerAdvice
+public class FormHandler {
+ @Autowired
+ private MessageSource messageSource;
+
+ @ResponseStatus(code = HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(MethodArgumentNotValidException.class)
+ public List handle(MethodArgumentNotValidException exception) {
+ List dtos = new ArrayList<>();
+
+ List fieldErrors = exception.getBindingResult().getFieldErrors();
+
+ fieldErrors.forEach(e -> {
+ String message = messageSource.getMessage(e, LocaleContextHolder.getLocale());
+ FormErrorDto formError = new FormErrorDto(e.getField(), message);
+ dtos.add(formError);
+ });
+
+ return dtos;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/HttpRequestMethodNotSupportedHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/HttpRequestMethodNotSupportedHandler.java
new file mode 100644
index 0000000..0db9f19
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/HttpRequestMethodNotSupportedHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class HttpRequestMethodNotSupportedHandler {
+ @ResponseStatus(code = HttpStatus.NOT_FOUND)
+ @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "O método requisitado não existe",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/IllegalArgumentHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/IllegalArgumentHandler.java
new file mode 100644
index 0000000..cff049d
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/IllegalArgumentHandler.java
@@ -0,0 +1,19 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class IllegalArgumentHandler {
+ @ResponseStatus(code = HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(IllegalArgumentException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "Campos informados com valores inválidos",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/InvalidTokenHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/InvalidTokenHandler.java
new file mode 100644
index 0000000..f828dc6
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/InvalidTokenHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import com.srh.api.error.exception.InvalidTokenException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class InvalidTokenHandler {
+ @ResponseStatus(HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(InvalidTokenException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "O token informado não é válido",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/InvalidUserInTokenHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/InvalidUserInTokenHandler.java
new file mode 100644
index 0000000..c359935
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/InvalidUserInTokenHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import com.srh.api.error.exception.InvalidUserInTokenException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class InvalidUserInTokenHandler {
+ @ResponseStatus(HttpStatus.UNAUTHORIZED)
+ @ExceptionHandler(InvalidUserInTokenException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "O usuário informado não é válido",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/JsonParseExceptionHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/JsonParseExceptionHandler.java
new file mode 100644
index 0000000..466f789
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/JsonParseExceptionHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.srh.api.dto.error.DefaultErrorDto;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class JsonParseExceptionHandler {
+ @ResponseStatus(code = HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(JsonParseException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "Existem erros no corpo de sua requisição",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/NotEqualsPasswordHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/NotEqualsPasswordHandler.java
new file mode 100644
index 0000000..5bdfe60
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/NotEqualsPasswordHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import com.srh.api.error.exception.NotEqualsPasswordException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class NotEqualsPasswordHandler {
+ @ResponseStatus(HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(NotEqualsPasswordException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "As senha informada não confere com a registrada no sistema",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/ObjectNotFoundHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/ObjectNotFoundHandler.java
new file mode 100644
index 0000000..b973480
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/ObjectNotFoundHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import org.hibernate.ObjectNotFoundException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class ObjectNotFoundHandler {
+ @ResponseStatus(HttpStatus.NOT_FOUND)
+ @ExceptionHandler(ObjectNotFoundException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "O recurso não foi encontrado",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/OldPasswordNotFound.java b/codigos/backend/src/main/java/com/srh/api/error/handler/OldPasswordNotFound.java
new file mode 100644
index 0000000..df1de28
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/OldPasswordNotFound.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import com.srh.api.error.exception.OldPasswordNotFoundException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class OldPasswordNotFound {
+ @ResponseStatus(HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(OldPasswordNotFoundException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "A senha antiga não foi informada",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/ProjectNotOpenedHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/ProjectNotOpenedHandler.java
new file mode 100644
index 0000000..12773c2
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/ProjectNotOpenedHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import com.srh.api.error.exception.ProjectNotOpenedException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class ProjectNotOpenedHandler {
+ @ResponseStatus(HttpStatus.BAD_REQUEST)
+ @ExceptionHandler(ProjectNotOpenedException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "O projeto não está disponÃvel para inserções",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/error/handler/RelationshipNotFoundHandler.java b/codigos/backend/src/main/java/com/srh/api/error/handler/RelationshipNotFoundHandler.java
new file mode 100644
index 0000000..d571dd8
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/error/handler/RelationshipNotFoundHandler.java
@@ -0,0 +1,20 @@
+package com.srh.api.error.handler;
+
+import com.srh.api.dto.error.DefaultErrorDto;
+import com.srh.api.error.exception.RelationshipNotFoundException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class RelationshipNotFoundHandler {
+ @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
+ @ExceptionHandler(RelationshipNotFoundException.class)
+ public DefaultErrorDto handle(Exception exception) {
+ return new DefaultErrorDto(
+ "O relacionamento não existe",
+ exception.getMessage()
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/AdminModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/AdminModelAssembler.java
new file mode 100644
index 0000000..b661d4f
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/AdminModelAssembler.java
@@ -0,0 +1,44 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.AdminController;
+import com.srh.api.controller.ProjectController;
+import com.srh.api.dto.resource.AdminDto;
+import com.srh.api.model.Project;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.Link;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+
+@Component
+public class AdminModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(AdminDto adminDto) {
+ EntityModel adminEntityModel = new EntityModel<>(adminDto,
+ linkTo(methodOn(AdminController.class).find(adminDto.getId())).withSelfRel(),
+ linkTo(AdminController.class).withRel("admins")
+ );
+
+ if (adminDto.getProjects() != null) {
+ adminEntityModel.add(buildProjectsLinks(adminDto.getProjects()));
+ }
+
+ return adminEntityModel;
+ }
+
+ private List buildProjectsLinks(List projects) {
+ List links = new ArrayList<>();
+
+ for (Project project : projects) {
+ links.add(linkTo(methodOn(ProjectController.class).find(project.getId())).withRel("projects"));
+ }
+
+ return links;
+ }
+
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/AlgorithmModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/AlgorithmModelAssembler.java
new file mode 100644
index 0000000..f311413
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/AlgorithmModelAssembler.java
@@ -0,0 +1,22 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.AlgorithmController;
+import com.srh.api.dto.resource.AlgorithmDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class AlgorithmModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(AlgorithmDto algorithmDto) {
+ return new EntityModel<>(algorithmDto,
+ linkTo(methodOn(AlgorithmController.class).find(algorithmDto.getId())).withSelfRel(),
+ linkTo(methodOn(AlgorithmController.class).listAll(Pageable.unpaged())).withRel("algoritms")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/ApiUserModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/ApiUserModelAssembler.java
new file mode 100644
index 0000000..94d3276
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/ApiUserModelAssembler.java
@@ -0,0 +1,41 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.ApiUsersController;
+import com.srh.api.dto.resource.ApiUsersDto;
+import com.srh.api.model.Profile;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.Link;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
+
+@Component
+public class ApiUserModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(ApiUsersDto apiUsersDto) {
+ EntityModel apiUsersEntityModel = new EntityModel<>(apiUsersDto,
+ linkTo(methodOn(ApiUsersController.class).find(apiUsersDto.getId())).withSelfRel(),
+ linkTo(ApiUsersController.class).withRel("apis")
+ );
+
+ if (apiUsersDto.getProfiles() != null) {
+ apiUsersEntityModel.add(buildProfilesLinks(apiUsersDto.getProfiles()));
+ }
+
+ return apiUsersEntityModel;
+ }
+
+ private List buildProfilesLinks(List profiles) {
+ List links = new ArrayList<>();
+
+ for (Profile profile : profiles) {
+ links.add(linkTo(methodOn(ApiUsersController.class).find(profile.getId())).withRel("profiles"));
+ }
+
+ return links;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/AttributeModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/AttributeModelAssembler.java
new file mode 100644
index 0000000..5a1a4bf
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/AttributeModelAssembler.java
@@ -0,0 +1,22 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.AttributeController;
+import com.srh.api.dto.resource.AttributeDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class AttributeModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(AttributeDto attributeDto) {
+ return new EntityModel<>(attributeDto,
+ linkTo(methodOn(AttributeController.class).find(attributeDto.getId())).withSelfRel(),
+ linkTo(methodOn(AttributeController.class).listAll(Pageable.unpaged())).withRel("attributes")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/EvaluatorModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/EvaluatorModelAssembler.java
new file mode 100644
index 0000000..44f688e
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/EvaluatorModelAssembler.java
@@ -0,0 +1,21 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.EvaluatorController;
+import com.srh.api.dto.resource.EvaluatorDto;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class EvaluatorModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(EvaluatorDto evaluatorDto) {
+ return new EntityModel<>(evaluatorDto,
+ linkTo(methodOn(EvaluatorController.class).find(evaluatorDto.getId())).withSelfRel(),
+ linkTo(EvaluatorController.class).withRel("evaluators")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemAttributeModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemAttributeModelAssembler.java
new file mode 100644
index 0000000..3082a93
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemAttributeModelAssembler.java
@@ -0,0 +1,35 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.AttributeController;
+import com.srh.api.controller.ItemAttributeController;
+import com.srh.api.controller.ItemController;
+import com.srh.api.dto.resource.ItemAttributeDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class ItemAttributeModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(ItemAttributeDto itemAttributeDto) {
+ return new EntityModel<>(itemAttributeDto,
+ linkTo(methodOn(ItemAttributeController.class).findAttributeInItem(
+ itemAttributeDto.getItemId(),
+ itemAttributeDto.getAttributeId())
+ ).withSelfRel(),
+ linkTo(methodOn(ItemAttributeController.class).listAttributesByItem(
+ itemAttributeDto.getItemId(),
+ Pageable.unpaged()
+ )).withRel("item attributes"),
+ linkTo(methodOn(ItemController.class).find(itemAttributeDto.getItemId()))
+ .withRel("item"),
+ linkTo(methodOn(AttributeController.class).find(itemAttributeDto.getAttributeId()))
+ .withRel("attribute")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemModelAssembler.java
new file mode 100644
index 0000000..ad71fd4
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemModelAssembler.java
@@ -0,0 +1,40 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.*;
+import com.srh.api.dto.resource.ItemDto;
+import com.srh.api.model.TypeItem;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.Link;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class ItemModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(ItemDto itemDto) {
+ EntityModel itemEntityModel = new EntityModel<>(itemDto,
+ linkTo(methodOn(ItemController.class).find(itemDto.getId())).withSelfRel(),
+ linkTo(ItemController.class).withRel("itens"),
+ linkTo(methodOn(ProjectController.class).find(itemDto.getProject().getId())).withRel("project"),
+ linkTo(methodOn(ItemAttributeController.class).listAttributesByItem(itemDto.getId(), Pageable.unpaged()))
+ .withRel("attributes"),
+ linkTo(methodOn(ItemTagController.class).listTagsByItem(itemDto.getId(), Pageable.unpaged())).withRel("tags"),
+ linkTo(methodOn(ItemController.class).listRecommendationsByItem(itemDto.getId(), Pageable.unpaged()))
+ .withRel("recommendations")
+ );
+
+ if (itemDto.getTypeItem() != null) {
+ itemEntityModel.add(buildTypeItemLink(itemDto.getTypeItem()));
+ }
+
+ return itemEntityModel;
+ }
+
+ private Link buildTypeItemLink(TypeItem typeItem) {
+ return linkTo(methodOn(TypeItemController.class).find(typeItem.getId())).withRel("typeitem");
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemRatingModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemRatingModelAssembler.java
new file mode 100644
index 0000000..f8f06de
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemRatingModelAssembler.java
@@ -0,0 +1,26 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.EvaluatorController;
+import com.srh.api.controller.ItemController;
+import com.srh.api.controller.ItemRatingController;
+import com.srh.api.dto.resource.ItemRatingDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class ItemRatingModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(ItemRatingDto itemRatingDto) {
+ return new EntityModel<>(itemRatingDto,
+ linkTo(methodOn(ItemRatingController.class).find(itemRatingDto.getId())).withSelfRel(),
+ linkTo(methodOn(ItemRatingController.class).listAll(Pageable.unpaged())).withRel("item ratings"),
+ linkTo(methodOn(ItemController.class).find(itemRatingDto.getItem().getId())).withRel("item"),
+ linkTo(methodOn(EvaluatorController.class).find(itemRatingDto.getEvaluator().getId())).withRel("evaluator")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemTagModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemTagModelAssembler.java
new file mode 100644
index 0000000..c6c92ef
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/ItemTagModelAssembler.java
@@ -0,0 +1,32 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.ItemController;
+import com.srh.api.controller.ItemTagController;
+import com.srh.api.controller.TagController;
+import com.srh.api.dto.resource.ItemTagDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class ItemTagModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(ItemTagDto itemTagDto) {
+ return new EntityModel<>(itemTagDto,
+ linkTo(methodOn(ItemTagController.class).findTagByItem(
+ itemTagDto.getItemId(), itemTagDto.getTagId()
+ )).withSelfRel(),
+ linkTo(methodOn(ItemTagController.class).listTagsByItem(
+ itemTagDto.getItemId(), Pageable.unpaged()
+ )).withRel("tags in item"),
+ linkTo(methodOn(ItemController.class).find(itemTagDto.getItemId()))
+ .withRel("item"),
+ linkTo(methodOn(TagController.class).find(itemTagDto.getTagId()))
+ .withRel("tag")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/ProjectEvaluatorModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/ProjectEvaluatorModelAssembler.java
new file mode 100644
index 0000000..5e763cf
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/ProjectEvaluatorModelAssembler.java
@@ -0,0 +1,32 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.ProjectController;
+import com.srh.api.controller.ProjectEvaluatorController;
+import com.srh.api.controller.EvaluatorController;
+import com.srh.api.dto.resource.ProjectEvaluatorDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class ProjectEvaluatorModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(ProjectEvaluatorDto projectRecommender) {
+ return new EntityModel<>(projectRecommender,
+ linkTo(methodOn(ProjectEvaluatorController.class).
+ findEvaluatorInProject(projectRecommender.getProjectId(),
+ projectRecommender.getEvaluatorId())).withSelfRel(),
+ linkTo(methodOn(ProjectEvaluatorController.class).
+ listRecommendersByProject(projectRecommender.getProjectId(), Pageable.unpaged()))
+ .withRel("recommenders in project"),
+ linkTo(methodOn(ProjectController.class).find(projectRecommender.getProjectId()))
+ .withRel("project"),
+ linkTo(methodOn(EvaluatorController.class).find(projectRecommender.getEvaluatorId()))
+ .withRel("recommender")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/ProjectModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/ProjectModelAssembler.java
new file mode 100644
index 0000000..bc23a51
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/ProjectModelAssembler.java
@@ -0,0 +1,28 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.AdminController;
+import com.srh.api.controller.ProjectController;
+import com.srh.api.controller.ProjectEvaluatorController;
+import com.srh.api.dto.resource.ProjectDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
+
+@Component
+public class ProjectModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(ProjectDto projectDto) {
+ return new EntityModel<>(projectDto,
+ linkTo(methodOn(ProjectController.class).find(projectDto.getId())).withSelfRel(),
+ linkTo(ProjectController.class).withRel("projects"),
+ linkTo(methodOn(AdminController.class).find(projectDto.getAdmin().getId())).withRel("admin"),
+ linkTo(methodOn(ProjectEvaluatorController.class).listRecommendersByProject(
+ projectDto.getId(), Pageable.unpaged())).withRel("evaluators"),
+ linkTo(methodOn(ProjectController.class).findItensByProject(projectDto.getId(), Pageable.unpaged()))
+ .withRel("itens")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/RecommendationModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/RecommendationModelAssembler.java
new file mode 100644
index 0000000..0b628b0
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/RecommendationModelAssembler.java
@@ -0,0 +1,22 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.RecommendationController;
+import com.srh.api.controller.EvaluatorController;
+import com.srh.api.dto.resource.RecommendationDto;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class RecommendationModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(RecommendationDto recommendationDto) {
+ return new EntityModel<>(recommendationDto,
+ linkTo(methodOn(RecommendationController.class).find(recommendationDto.getId())).withSelfRel(),
+ linkTo(RecommendationController.class).withRel("recommendations")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/RecommendationRatingModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/RecommendationRatingModelAssembler.java
new file mode 100644
index 0000000..d015992
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/RecommendationRatingModelAssembler.java
@@ -0,0 +1,27 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.EvaluatorController;
+import com.srh.api.controller.RecommendationController;
+import com.srh.api.controller.RecommendationRatingController;
+import com.srh.api.dto.resource.RecommendationRatingDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class RecommendationRatingModelAssembler implements
+ RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(RecommendationRatingDto recommendationRatingDto) {
+ return new EntityModel<>(recommendationRatingDto,
+ linkTo(methodOn(RecommendationRatingController.class).find(recommendationRatingDto.getId())).withSelfRel(),
+ linkTo(methodOn(RecommendationRatingController.class).listAll(Pageable.unpaged())).withRel("recommendation ratings"),
+ linkTo(methodOn((RecommendationController.class)).find(recommendationRatingDto.getRecommendation().getId())).withRel("recommendation"),
+ linkTo(methodOn((EvaluatorController.class)).find(recommendationRatingDto.getEvaluator().getId())).withRel("evaluator")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/TagModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/TagModelAssembler.java
new file mode 100644
index 0000000..3b0a0f1
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/TagModelAssembler.java
@@ -0,0 +1,20 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.TagController;
+import com.srh.api.dto.resource.TagDto;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
+
+@Component
+public class TagModelAssembler implements RepresentationModelAssembler> {
+
+ public EntityModel toModel(TagDto tagDto) {
+ return new EntityModel<>(tagDto,
+ linkTo(methodOn(TagController.class).find(tagDto.getId())).withSelfRel(),
+ linkTo(TagController.class).withRel("tags")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/TypeItemAttributeModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/TypeItemAttributeModelAssembler.java
new file mode 100644
index 0000000..0cad14d
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/TypeItemAttributeModelAssembler.java
@@ -0,0 +1,34 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.AttributeController;
+import com.srh.api.controller.TypeItemAttributeController;
+import com.srh.api.controller.TypeItemController;
+import com.srh.api.dto.resource.TypeItemAttributeDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
+
+@Component
+public class TypeItemAttributeModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(TypeItemAttributeDto typeItemAttributeDto) {
+ return new EntityModel<>(typeItemAttributeDto,
+ linkTo(methodOn(TypeItemAttributeController.class).findAttributeInTypeItem(
+ typeItemAttributeDto.getTypeItemId(),
+ typeItemAttributeDto.getAttributeId()
+ )).withSelfRel(),
+ linkTo(methodOn(TypeItemAttributeController.class).listAttributesByTypeItem(
+ typeItemAttributeDto.getTypeItemId(),
+ Pageable.unpaged()
+ )).withRel("attributes in typeItem"),
+ linkTo(methodOn(TypeItemController.class).find(typeItemAttributeDto.getTypeItemId()))
+ .withRel("typeItem"),
+ linkTo(methodOn(AttributeController.class).find(typeItemAttributeDto.getAttributeId()))
+ .withRel("attribute")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/hypermedia/TypeItemModelAssembler.java b/codigos/backend/src/main/java/com/srh/api/hypermedia/TypeItemModelAssembler.java
new file mode 100644
index 0000000..4e91bdb
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/hypermedia/TypeItemModelAssembler.java
@@ -0,0 +1,27 @@
+package com.srh.api.hypermedia;
+
+import com.srh.api.controller.TypeItemAttributeController;
+import com.srh.api.controller.TypeItemController;
+import com.srh.api.dto.resource.TypeItemDto;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.server.RepresentationModelAssembler;
+import org.springframework.stereotype.Component;
+
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
+
+@Component
+public class TypeItemModelAssembler implements RepresentationModelAssembler> {
+ @Override
+ public EntityModel toModel(TypeItemDto typeItemDto) {
+ return new EntityModel<>(
+ typeItemDto,
+ linkTo(methodOn(TypeItemController.class).find(typeItemDto.getId())).withSelfRel(),
+ linkTo(methodOn(TypeItemController.class).listAll(Pageable.unpaged())).withRel("typeitems"),
+ linkTo(methodOn(TypeItemController.class).findItensByTypeItem(typeItemDto.getId(), Pageable.unpaged()))
+ .withRel("itens"),
+ linkTo(methodOn(TypeItemAttributeController.class).listAttributesByTypeItem(typeItemDto.getId(), Pageable.unpaged()))
+ .withRel("attributes")
+ );
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/Admin.java b/codigos/backend/src/main/java/com/srh/api/model/Admin.java
new file mode 100644
index 0000000..d1ce8ef
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/Admin.java
@@ -0,0 +1,17 @@
+package com.srh.api.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import java.util.List;
+
+@Entity
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Admin extends User {
+ @OneToMany(mappedBy = "admin", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List projects;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/Algorithm.java b/codigos/backend/src/main/java/com/srh/api/model/Algorithm.java
new file mode 100644
index 0000000..4fc5096
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/Algorithm.java
@@ -0,0 +1,19 @@
+package com.srh.api.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Data
+public class Algorithm {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+ private String name;
+ private TypeRecommendation typeRecommendation;
+
+ @OneToMany(mappedBy = "algorithm")
+ private List recommendations;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/ApiUser.java b/codigos/backend/src/main/java/com/srh/api/model/ApiUser.java
new file mode 100644
index 0000000..9cdb31e
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/ApiUser.java
@@ -0,0 +1,53 @@
+package com.srh.api.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import javax.persistence.*;
+import java.util.Collection;
+import java.util.List;
+
+@Entity
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ApiUser extends User implements UserDetails {
+ @ManyToMany(fetch = FetchType.EAGER)
+ private List profiles;
+
+ @Override
+ public Collection extends GrantedAuthority> getAuthorities() {
+ return this.profiles;
+ }
+
+ @Override
+ public String getPassword() {
+ return this.password;
+ }
+
+ @Override
+ public String getUsername() {
+ return this.getLogin();
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ return true;
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/ApiUserProfile.java b/codigos/backend/src/main/java/com/srh/api/model/ApiUserProfile.java
new file mode 100644
index 0000000..f2cbb7b
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/ApiUserProfile.java
@@ -0,0 +1,79 @@
+package com.srh.api.model;
+
+import com.srh.api.error.exception.DuplicateValueException;
+import com.srh.api.error.exception.RelationshipNotFoundException;
+import lombok.Data;
+import lombok.SneakyThrows;
+
+import java.util.List;
+
+@Data
+public class ApiUserProfile {
+ private ApiUser apiUser;
+ private Profile profile;
+
+ public ApiUserProfile(ApiUser apiUser, Profile profile) {
+ this.apiUser = apiUser;
+ this.profile = profile;
+ }
+
+ @SneakyThrows
+ public void addEntities() {
+ addApiUserInProfile();
+ addProfileInApiUser();
+ }
+
+ @SneakyThrows
+ public void removeEntities() {
+ removeApiUserInProfile();
+ removeProfileInApiUser();
+ }
+
+ @SneakyThrows
+ private void addApiUserInProfile() {
+ List apiUsersInProfile = getApiUserListInProfile();
+
+ if (apiUsersInProfile.contains(apiUser))
+ throw new DuplicateValueException("ApiUser link already exists");
+
+ apiUsersInProfile.add(apiUser);
+ }
+
+ @SneakyThrows
+ private void addProfileInApiUser() {
+ List profilesInApiUser = getProfileListInApiUser();
+
+ if (profilesInApiUser.contains(profile))
+ throw new DuplicateValueException("Profile link already exists");
+
+ profilesInApiUser.add(profile);
+ }
+
+ @SneakyThrows
+ private void removeApiUserInProfile() {
+ List apiUsersInProfile = profile.getApiUsers();
+
+ if (!apiUsersInProfile.contains(apiUser))
+ throw new RelationshipNotFoundException("ApiUser not exist in Profile");
+
+ apiUsersInProfile.remove(apiUser);
+ }
+
+ @SneakyThrows
+ private void removeProfileInApiUser() {
+ List profilesInApiUser = apiUser.getProfiles();
+
+ if (!profilesInApiUser.contains(profile))
+ throw new RelationshipNotFoundException("Profile not exist in ApiUser");
+
+ profilesInApiUser.remove(profile);
+ }
+
+ private List getApiUserListInProfile() {
+ return profile.getApiUsers();
+ }
+
+ private List getProfileListInApiUser() {
+ return apiUser.getProfiles();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/Attribute.java b/codigos/backend/src/main/java/com/srh/api/model/Attribute.java
new file mode 100644
index 0000000..4c7cf72
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/Attribute.java
@@ -0,0 +1,24 @@
+package com.srh.api.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Data
+public class Attribute {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ private String name;
+ private String value;
+ private TypeAttribute type;
+
+ @ManyToMany
+ private List
- itens;
+
+ @ManyToMany
+ private List typeItens;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/Evaluator.java b/codigos/backend/src/main/java/com/srh/api/model/Evaluator.java
new file mode 100644
index 0000000..bdebaeb
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/Evaluator.java
@@ -0,0 +1,27 @@
+package com.srh.api.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.OneToMany;
+import java.util.List;
+
+@Entity
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Evaluator extends User {
+ @ManyToMany
+ private List projects;
+
+ @OneToMany(mappedBy = "evaluator", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List recommendations;
+
+ @OneToMany(mappedBy = "evaluator", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List itemRatings;
+
+ @OneToMany(mappedBy = "evaluator", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List recommendationRatings;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/Item.java b/codigos/backend/src/main/java/com/srh/api/model/Item.java
new file mode 100644
index 0000000..e572d53
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/Item.java
@@ -0,0 +1,35 @@
+package com.srh.api.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Data
+public class Item {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Integer id;
+
+ private String name;
+ private String description;
+
+ @OneToMany(mappedBy = "item", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List itemRatings;
+
+ @OneToMany(mappedBy = "item", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List recommendations;
+
+ @ManyToOne
+ private Project project;
+
+ @ManyToOne
+ private TypeItem typeItem;
+
+ @ManyToMany(mappedBy = "itens")
+ private List tags;
+
+ @ManyToMany(mappedBy = "itens")
+ private List attributes;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/ItemAttribute.java b/codigos/backend/src/main/java/com/srh/api/model/ItemAttribute.java
new file mode 100644
index 0000000..d13cdc7
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/ItemAttribute.java
@@ -0,0 +1,76 @@
+package com.srh.api.model;
+
+import com.srh.api.error.exception.DuplicateValueException;
+import com.srh.api.error.exception.RelationshipNotFoundException;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.SneakyThrows;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+public class ItemAttribute {
+ private Item item;
+ private Attribute attribute;
+
+ @SneakyThrows
+ public void addEntities() {
+ addItemInAttribute();
+ addAttributeInItem();
+ }
+
+ @SneakyThrows
+ public void removeEntities() {
+ removeItemInAttribute();
+ removeAttributeInItem();
+ }
+
+ @SneakyThrows
+ private void addItemInAttribute() {
+ List
- itensInAttribute = getItensInAttribute();
+
+ if (itensInAttribute.contains(item))
+ throw new DuplicateValueException("Item link already exists");
+
+ itensInAttribute.add(item);
+ }
+
+ @SneakyThrows
+ private void addAttributeInItem() {
+ List attributesInItem = getAttributesInItem();
+
+ if (attributesInItem.contains(attribute))
+ throw new DuplicateValueException("Attribute link already exists");
+
+ attributesInItem.remove(attribute);
+ }
+
+ @SneakyThrows
+ private void removeItemInAttribute() {
+ List
- itensInAttribute = getItensInAttribute();
+
+ if (!itensInAttribute.contains(item))
+ throw new RelationshipNotFoundException("Item not exist in Attribute");
+
+ itensInAttribute.remove(item);
+ }
+
+ @SneakyThrows
+ private void removeAttributeInItem() {
+ List attributesInItem = getAttributesInItem();
+
+ if (!attributesInItem.contains(attribute))
+ throw new RelationshipNotFoundException("Attribute not exist in Item");
+
+ attributesInItem.remove(attribute);
+ }
+
+ private List
- getItensInAttribute() {
+ return attribute.getItens();
+ }
+
+ private List getAttributesInItem() {
+ return item.getAttributes();
+ }
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/ItemRating.java b/codigos/backend/src/main/java/com/srh/api/model/ItemRating.java
new file mode 100644
index 0000000..e8b2e16
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/ItemRating.java
@@ -0,0 +1,17 @@
+package com.srh.api.model;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.*;
+
+@Entity
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ItemRating extends Rating {
+ @ManyToOne
+ private Evaluator evaluator;
+
+ @ManyToOne
+ private Item item;
+}
diff --git a/codigos/backend/src/main/java/com/srh/api/model/ItemTag.java b/codigos/backend/src/main/java/com/srh/api/model/ItemTag.java
new file mode 100644
index 0000000..a3c6707
--- /dev/null
+++ b/codigos/backend/src/main/java/com/srh/api/model/ItemTag.java
@@ -0,0 +1,76 @@
+package com.srh.api.model;
+
+import com.srh.api.error.exception.DuplicateValueException;
+import com.srh.api.error.exception.RelationshipNotFoundException;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.SneakyThrows;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+public class ItemTag {
+ private Item item;
+ private Tag tag;
+
+ @SneakyThrows
+ public void addEntities() {
+ addItemInTag();
+ addTagInItem();
+ }
+
+ @SneakyThrows
+ public void removeEntities() {
+ removeItemInTag();
+ removeTagInItem();
+ }
+
+ @SneakyThrows
+ private void addItemInTag() {
+ List
- itensInTag = getItensListInTag();
+
+ if (itensInTag.contains(item))
+ throw new DuplicateValueException("Item link already exists");
+
+ itensInTag.add(item);
+ }
+
+ @SneakyThrows
+ private void addTagInItem() {
+ List tagsInItem = getTagListInItem();
+
+ if (tagsInItem.contains(tag))
+ throw new DuplicateValueException("Tag link already exists");
+
+ tagsInItem.add(tag);
+ }
+
+ @SneakyThrows
+ private void removeItemInTag() {
+ List
- itensInTag = getItensListInTag();
+
+ if (!itensInTag.contains(item))
+ throw new RelationshipNotFoundException("Item not exist in Evaluator");
+
+ itensInTag.remove(item);
+ }
+
+ @SneakyThrows
+ private void removeTagInItem() {
+ List