Skip to content

Commit

Permalink
Cadastro de categorias v1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
giovnnvm committed Jul 14, 2021
1 parent 11186d7 commit 22d47fb
Show file tree
Hide file tree
Showing 10 changed files with 384 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package br.com.zupacademy.giovannimoratto.ecommerce.new_category;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.transaction.Transactional;
import javax.validation.Valid;

/**
* @Author giovanni.moratto
*/

@RestController
public class CategoryController {

@Autowired
private CategoryRepository repository;

/* Methods */
// POST Request - Register a new Category
@PostMapping("/new_category") // Endpoint
@Transactional
public void addNewCategory(@RequestBody @Valid CategoryRequest request) {
CategoryModel newCategory = request.toModel(repository);
repository.save(newCategory);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package br.com.zupacademy.giovannimoratto.ecommerce.new_category;

import javax.persistence.*;

/**
* @Author giovanni.moratto
*/

@Entity
@Table(name = "tb_categorias")
public class CategoryModel {

/* Attributes */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "NAME", nullable = false)
private String name;
@ManyToOne
@JoinColumn(name = "ID_PARENT_CATEGORY")
private CategoryModel parentCategory;

/* Constructors */
// Default - JPA
@Deprecated
public CategoryModel() {
}

public CategoryModel(String name, CategoryModel parentCategory) {
this.name = name;
this.parentCategory = parentCategory;
}

public CategoryModel(String name) {
this.name = name;
}

// Check if the category exists in CategoryControllerTest
public Long getId() {
return id;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package br.com.zupacademy.giovannimoratto.ecommerce.new_category;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

/**
* @Author giovanni.moratto
*/

@Repository
public interface CategoryRepository extends JpaRepository <CategoryModel, Long> {

Optional <CategoryModel> findByName(String name);

int countByName(String name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package br.com.zupacademy.giovannimoratto.ecommerce.new_category;

import br.com.zupacademy.giovannimoratto.ecommerce.validations.annotations.ExistsId;
import br.com.zupacademy.giovannimoratto.ecommerce.validations.annotations.Unique;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Positive;

/**
* @Author giovanni.moratto
*/

public class CategoryRequest {

/* Attributes */
@NotBlank
@Unique(domainClass = CategoryModel.class, fieldName = "name")
private final String name;
@ExistsId(domainClass = CategoryModel.class)
private final Long idParentCategory;

public CategoryRequest(String name, Long idParentCategory) {
this.name = name;
this.idParentCategory = idParentCategory;
}

/* Methods */
public CategoryModel toModel(CategoryRepository repository) {
if (idParentCategory != null) {
CategoryModel optionalCategory = repository.findById(idParentCategory).orElseThrow();
return new CategoryModel(name, optionalCategory);
}
return new CategoryModel(name);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ public class UserController {
private UserRepository repository;

/* Methods */
// POST Request - Register an author
// POST Request - Register a new User
@PostMapping("/new_user") // Endpoint
@Transactional
public void addNewUser(@RequestBody @Valid UserRequest request) {
UserModel newUser = request.toModel();
repository.save(newUser);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package br.com.zupacademy.giovannimoratto.ecommerce.validations.annotations;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
* @Author giovanni.moratto
*/

@Documented
@Constraint(validatedBy = {ExistsIdValidator.class})
@Target({
ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,
ElementType.PARAMETER, ElementType.TYPE_USE
})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExistsId {

Class <?> domainClass();

String message() default "This ID does not exists!";

Class <?>[] groups() default {};

Class <? extends Payload>[] payload() default {};

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package br.com.zupacademy.giovannimoratto.ecommerce.validations.annotations;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
* @Author giovanni.moratto
*/

public class ExistsIdValidator implements ConstraintValidator <ExistsId, Long> {

@PersistenceContext
private EntityManager em;

/* Attributes */
private String object;

@Override
public void initialize(ExistsId constraintAnnotation) {
object = constraintAnnotation.domainClass().getSimpleName();
}

@Override
public boolean isValid(Long id, ConstraintValidatorContext context) {
if (id == null) {
return true;
}
Query query = em.createQuery("SELECT 1 FROM " + object + " o WHERE o.id = :VALUE");
query.setParameter("VALUE", id);

return !query.getResultList().isEmpty();
}

}
7 changes: 6 additions & 1 deletion src/main/resources/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,9 @@ NotBlank.userRequest.login=Login é obrigatório.
NotBlank.userRequest.password=Senha é obrigatória.
Email.userRequest.login=Login deve ter um formato de e-mail válido.
Unique.userRequest.login=Login já cadastrado!
Size.userRequest.password=Senha deve ter ao menos 6 caracteres.
Size.userRequest.password=Senha deve ter ao menos 6 caracteres.

#New Category
NotBlank.categoryRequest.name=Nome é obrigatório.
Unique.categoryRequest.name=Nome já cadastrado!
ExistsId.categoryRequest.idParentCategory=Essa Categoria não existe.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class EcommerceApplicationTests {

@Test
void contextLoads() {
EcommerceApplication.main(new String[0]);
Assertions.assertTrue(true);
}

Expand Down
Loading

0 comments on commit 22d47fb

Please sign in to comment.