// Path: src/main/java/com/lyubenblagoev/postfixrest/entity/User.java
// @Entity
// @Table(name = "users")
// public class User extends BaseEntity {
// 
//     @Column(nullable = false)
//     private String email;
// 
//     @Column(nullable = false)
//     private String password;
// 
//     @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "user")
//     private List<Device> devices = Collections.emptyList();
// 
//     @ManyToMany
//     @JoinTable(
//             name = "users_roles",
//             joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
//             inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")
//     )
//     private List<Role> roles;
// 
//     public User(String email, String password) {
//         super();
//         this.email = email;
//         this.password = password;
//         this.setEnabled(true);
//     }
// 
//     protected User() {
//     }
// 
//     public String getEmail() {
//         return email;
//     }
// 
//     public void setEmail(String email) {
//         this.email = email;
//     }
// 
//     public String getPassword() {
//         return password;
//     }
// 
//     public void setPassword(String password) {
//         this.password = password;
//     }
// 
//     public List<Device> getDevices() {
//         return devices;
//     }
// 
//     public void setDevices(List<Device> devices) {
//         this.devices = devices;
//     }
// 
//     public void addDevice(Device device) {
//         Objects.requireNonNull(device);
//         getDevices().add(device);
//         device.setUser(this);
//     }
// 
//     public void removeDevice(Device device) {
//         Objects.requireNonNull(device);
//         getDevices().remove(device);
//         device.setUser(null);
//     }
// 
//     public List<Role> getRoles() {
//         return roles;
//     }
// 
//     public void setRoles(List<Role> roles) {
//         this.roles = roles;
//     }
// }
// 
// Path: src/main/java/com/lyubenblagoev/postfixrest/service/model/DeviceInformation.java
// public class DeviceInformation {
// 
//     private String ipAddress;
// 
//     private String browser;
// 
//     private String os;
// 
//     public DeviceInformation(String ipAddress, String browser, String os) {
//         this.ipAddress = ipAddress;
//         this.browser = browser;
//         this.os = os;
//     }
// 
//     public String getIpAddress() {
//         return ipAddress;
//     }
// 
//     public String getBrowser() {
//         return browser;
//     }
// 
//     public String getOs() {
//         return os;
//     }
// }
// 
// Path: src/main/java/com/lyubenblagoev/postfixrest/service/model/UserChangeRequest.java
// @PasswordsMatches
// public class UserChangeRequest implements PasswordConfirmable {
// 
//     private Long id;
// 
//     @NotEmpty
//     @Email
//     private String email;
// 
//     private String password;
// 
//     private String passwordConfirmation;
// 
//     @NotBlank
//     private String oldPassword;
// 
//     public UserChangeRequest() {
//     }
// 
//     public UserChangeRequest(@NotEmpty @Email String email,
//                              String password,
//                              String passwordConfirmation) {
//         this.email = email;
//         this.password = password;
//         this.passwordConfirmation = passwordConfirmation;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public String getEmail() {
//         return email;
//     }
// 
//     public void setEmail(String email) {
//         this.email = email;
//     }
// 
//     @Override
//     public String getPassword() {
//         return password;
//     }
// 
//     public void setPassword(String password) {
//         this.password = password;
//     }
// 
//     @Override
//     public String getPasswordConfirmation() {
//         return passwordConfirmation;
//     }
// 
//     public void setPasswordConfirmation(String passwordConfirmation) {
//         this.passwordConfirmation = passwordConfirmation;
//     }
// 
//     public String getOldPassword() {
//         return oldPassword;
//     }
// 
//     public void setOldPassword(String oldPassword) {
//         this.oldPassword = oldPassword;
//     }
// }


import com.lyubenblagoev.postfixrest.entity.User;
import com.lyubenblagoev.postfixrest.service.model.DeviceInformation;
import com.lyubenblagoev.postfixrest.service.model.UserChangeRequest;
import java.util.Date;
import java.util.Optional;
package com.lyubenblagoev.postfixrest.service;



public interface UserService {
    Optional<User> findByEmail(String email);

    Optional<User> findByEmailAndPassword(String email, String password);

// Path: src/main/java/com/lyubenblagoev/postfixrest/entity/User.java
// @Entity
// @Table(name = "users")
// public class User extends BaseEntity {
// 
//     @Column(nullable = false)
//     private String email;
// 
//     @Column(nullable = false)
//     private String password;
// 
//     @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, mappedBy = "user")
//     private List<Device> devices = Collections.emptyList();
// 
//     @ManyToMany
//     @JoinTable(
//             name = "users_roles",
//             joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
//             inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")
//     )
//     private List<Role> roles;
// 
//     public User(String email, String password) {
//         super();
//         this.email = email;
//         this.password = password;
//         this.setEnabled(true);
//     }
// 
//     protected User() {
//     }
// 
//     public String getEmail() {
//         return email;
//     }
// 
//     public void setEmail(String email) {
//         this.email = email;
//     }
// 
//     public String getPassword() {
//         return password;
//     }
// 
//     public void setPassword(String password) {
//         this.password = password;
//     }
// 
//     public List<Device> getDevices() {
//         return devices;
//     }
// 
//     public void setDevices(List<Device> devices) {
//         this.devices = devices;
//     }
// 
//     public void addDevice(Device device) {
//         Objects.requireNonNull(device);
//         getDevices().add(device);
//         device.setUser(this);
//     }
// 
//     public void removeDevice(Device device) {
//         Objects.requireNonNull(device);
//         getDevices().remove(device);
//         device.setUser(null);
//     }
// 
//     public List<Role> getRoles() {
//         return roles;
//     }
// 
//     public void setRoles(List<Role> roles) {
//         this.roles = roles;
//     }
// }
// 
// Path: src/main/java/com/lyubenblagoev/postfixrest/service/model/DeviceInformation.java
// public class DeviceInformation {
// 
//     private String ipAddress;
// 
//     private String browser;
// 
//     private String os;
// 
//     public DeviceInformation(String ipAddress, String browser, String os) {
//         this.ipAddress = ipAddress;
//         this.browser = browser;
//         this.os = os;
//     }
// 
//     public String getIpAddress() {
//         return ipAddress;
//     }
// 
//     public String getBrowser() {
//         return browser;
//     }
// 
//     public String getOs() {
//         return os;
//     }
// }
// 
// Path: src/main/java/com/lyubenblagoev/postfixrest/service/model/UserChangeRequest.java
// @PasswordsMatches
// public class UserChangeRequest implements PasswordConfirmable {
// 
//     private Long id;
// 
//     @NotEmpty
//     @Email
//     private String email;
// 
//     private String password;
// 
//     private String passwordConfirmation;
// 
//     @NotBlank
//     private String oldPassword;
// 
//     public UserChangeRequest() {
//     }
// 
//     public UserChangeRequest(@NotEmpty @Email String email,
//                              String password,
//                              String passwordConfirmation) {
//         this.email = email;
//         this.password = password;
//         this.passwordConfirmation = passwordConfirmation;
//     }
// 
//     public Long getId() {
//         return id;
//     }
// 
//     public void setId(Long id) {
//         this.id = id;
//     }
// 
//     public String getEmail() {
//         return email;
//     }
// 
//     public void setEmail(String email) {
//         this.email = email;
//     }
// 
//     @Override
//     public String getPassword() {
//         return password;
//     }
// 
//     public void setPassword(String password) {
//         this.password = password;
//     }
// 
//     @Override
//     public String getPasswordConfirmation() {
//         return passwordConfirmation;
//     }
// 
//     public void setPasswordConfirmation(String passwordConfirmation) {
//         this.passwordConfirmation = passwordConfirmation;
//     }
// 
//     public String getOldPassword() {
//         return oldPassword;
//     }
// 
//     public void setOldPassword(String oldPassword) {
//         this.oldPassword = oldPassword;
//     }
// }


// Path: src/main/java/com/lyubenblagoev/postfixrest/service/UserService.java
import com.lyubenblagoev.postfixrest.entity.User;
import com.lyubenblagoev.postfixrest.service.model.DeviceInformation;
import com.lyubenblagoev.postfixrest.service.model.UserChangeRequest;
import java.util.Date;
import java.util.Optional;

package com.lyubenblagoev.postfixrest.service;



public interface UserService {
    Optional<User> findByEmail(String email);

    Optional<User> findByEmailAndPassword(String email, String password);

    Optional<User> update(UserChangeRequest userChangeRequest);