// Path: user-service/src/main/java/com/apssouza/entities/Account.java
// @Entity
// public class Account {
// 
//     @Id
//     @GeneratedValue
//     private long id;
// 
//     @NotNull
//     private String password;
// 
//     @NotNull
//     @Size(min = 2, max = 256)
//     private String name;
// 
//     @Email
//     @NotNull
//     @Column(unique = true)
//     private String email;
// 
//     @Version
//     private long version;
// 
//     public Account() {
//     }
// 
//     public Account(String name, String email, String pass) {
//         this.name = name;
//         this.email = email;
//         this.password = pass;
//     }
// 
//     public long getId() {
//         return id;
//     }
// 
//     public void setId(long id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getEmail() {
//         return email;
//     }
// 
//     public void setEmail(String email) {
//         this.email = email;
//     }
// 
//     public String getPassword() {
//         return password;
//     }
// 
//     public void setAuthId(String pass) {
//         this.password = pass;
//     }
// 
//     public long getVersion() {
//         return version;
//     }
// 
//     public void setVersion(long version) {
//         this.version = version;
//     }
// 
// }
// 
// Path: remainder-service/src/main/java/com/apssouza/exceptions/DataNotFoundException.java
// @ResponseStatus(HttpStatus.NOT_FOUND)
// public class DataNotFoundException extends RuntimeException {
// 
//     public DataNotFoundException(String msg) {
//         super(msg);
//     }
// }
// 
// Path: user-service/src/main/java/com/apssouza/services/AccountService.java
// public interface AccountService {
// 
//     Optional<Account> findById(long id);
// 
//     List<Account> all();
// 
//     Account save(Account user);
// 
//     Account update(Long id, Account user) throws DataNotFoundException;
// 
//     Optional<Account> findByEmail(String name);
// 
//     void delete(Account a);
// }


import com.apssouza.entities.Account;
import com.apssouza.exceptions.DataNotFoundException;
import java.net.URI;
import java.util.List;
import java.util.Optional;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import com.apssouza.services.AccountService;
import org.springframework.web.bind.annotation.RequestParam;

    @GetMapping
    public List<Account> all() {
        return userService.all();
    }

    @PostMapping
    public ResponseEntity<?> save(@RequestBody @Valid Account account) {
        Account saved = this.userService.save(account);
        Long id = saved.getId();
        if (id != null) {
            URI location = ServletUriComponentsBuilder
                    .fromCurrentRequest().path("/{id}")
                    .buildAndExpand(id).toUri();
            return ResponseEntity.created(location).build();
        }
        return ResponseEntity.noContent().build();
    }

    @PutMapping("{id}")
    public ResponseEntity<?> update(
            @PathVariable long id,
            @RequestBody @Valid Account user
    ) {
        return ResponseEntity.ok(userService.update(id, user));
    }

    @GetMapping("{id}")
    public ResponseEntity<?> find(@PathVariable long id) {
        Optional<Account> findById = userService.findById(id);
// Path: user-service/src/main/java/com/apssouza/entities/Account.java
// @Entity
// public class Account {
// 
//     @Id
//     @GeneratedValue
//     private long id;
// 
//     @NotNull
//     private String password;
// 
//     @NotNull
//     @Size(min = 2, max = 256)
//     private String name;
// 
//     @Email
//     @NotNull
//     @Column(unique = true)
//     private String email;
// 
//     @Version
//     private long version;
// 
//     public Account() {
//     }
// 
//     public Account(String name, String email, String pass) {
//         this.name = name;
//         this.email = email;
//         this.password = pass;
//     }
// 
//     public long getId() {
//         return id;
//     }
// 
//     public void setId(long id) {
//         this.id = id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getEmail() {
//         return email;
//     }
// 
//     public void setEmail(String email) {
//         this.email = email;
//     }
// 
//     public String getPassword() {
//         return password;
//     }
// 
//     public void setAuthId(String pass) {
//         this.password = pass;
//     }
// 
//     public long getVersion() {
//         return version;
//     }
// 
//     public void setVersion(long version) {
//         this.version = version;
//     }
// 
// }
// 
// Path: remainder-service/src/main/java/com/apssouza/exceptions/DataNotFoundException.java
// @ResponseStatus(HttpStatus.NOT_FOUND)
// public class DataNotFoundException extends RuntimeException {
// 
//     public DataNotFoundException(String msg) {
//         super(msg);
//     }
// }
// 
// Path: user-service/src/main/java/com/apssouza/services/AccountService.java
// public interface AccountService {
// 
//     Optional<Account> findById(long id);
// 
//     List<Account> all();
// 
//     Account save(Account user);
// 
//     Account update(Long id, Account user) throws DataNotFoundException;
// 
//     Optional<Account> findByEmail(String name);
// 
//     void delete(Account a);
// }


// Path: user-service/src/main/java/com/apssouza/controllers/AccountController.java
import com.apssouza.entities.Account;
import com.apssouza.exceptions.DataNotFoundException;
import java.net.URI;
import java.util.List;
import java.util.Optional;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import com.apssouza.services.AccountService;
import org.springframework.web.bind.annotation.RequestParam;


    @GetMapping
    public List<Account> all() {
        return userService.all();
    }

    @PostMapping
    public ResponseEntity<?> save(@RequestBody @Valid Account account) {
        Account saved = this.userService.save(account);
        Long id = saved.getId();
        if (id != null) {
            URI location = ServletUriComponentsBuilder
                    .fromCurrentRequest().path("/{id}")
                    .buildAndExpand(id).toUri();
            return ResponseEntity.created(location).build();
        }
        return ResponseEntity.noContent().build();
    }

    @PutMapping("{id}")
    public ResponseEntity<?> update(
            @PathVariable long id,
            @RequestBody @Valid Account user
    ) {
        return ResponseEntity.ok(userService.update(id, user));
    }

    @GetMapping("{id}")
    public ResponseEntity<?> find(@PathVariable long id) {
        Optional<Account> findById = userService.findById(id);
        return findById.map(todo -> {