// Path: core/src/main/java/com/monkeyk/os/domain/users/Roles.java
// public class Roles extends AbstractDomain {
//     private static final long serialVersionUID = 8762398291767207066L;
// 
// 
//     private transient UsersRepository usersRepository = BeanProvider.getBean(UsersRepository.class);
// 
//     private int id;
// 
//     private String roleName;
// 
//     public Roles() {
//     }
// 
//     public int id() {
//         return id;
//     }
// 
//     public Roles id(int id) {
//         this.id = id;
//         return this;
//     }
// 
//     public List<String> permissions() {
//         return this.usersRepository.findPermissionsByRoles(this.guid);
//     }
// 
//     public String roleName() {
//         return roleName;
//     }
// 
//     public Roles roleName(String roleName) {
//         this.roleName = roleName;
//         return this;
//     }
// }
// 
// Path: core/src/main/java/com/monkeyk/os/domain/users/Users.java
// public class Users extends AbstractDomain {
//     private static final long serialVersionUID = -3990278799194556012L;
// 
//     private transient UsersRepository usersRepository = BeanProvider.getBean(UsersRepository.class);
// 
//     private String username;
//     private String password;
// 
// 
//     private boolean defaultUser;
//     private Date lastLoginTime;
// 
//     public Users() {
//     }
// 
// 
//     public List<Roles> rolesList() {
//         return usersRepository.findUsersRolesList(this.guid);
//     }
// 
// 
//     public String username() {
//         return username;
//     }
// 
//     public Users username(String username) {
//         this.username = username;
//         return this;
//     }
// 
//     public String password() {
//         return password;
//     }
// 
//     public Users password(String password) {
//         this.password = password;
//         return this;
//     }
// 
//     public boolean defaultUser() {
//         return defaultUser;
//     }
// 
//     public Users defaultUser(boolean defaultUser) {
//         this.defaultUser = defaultUser;
//         return this;
//     }
// 
//     public Date lastLoginTime() {
//         return lastLoginTime;
//     }
// 
//     public Users lastLoginTime(Date lastLoginTime) {
//         this.lastLoginTime = lastLoginTime;
//         return this;
//     }
// }
// 
// Path: authz/src/main/java/com/monkeyk/os/domain/users/UsersAuthzRepository.java
// public interface UsersAuthzRepository extends UsersRepository {
// 
//     List<Users> findUsersByUsername(String username);
// 
//     List<Roles> findAvailableRolesList();
// 
//     Users findByUsername(String username);
// 
//     int saveUsers(Users users);
// 
//     Roles findRolesByGuid(String guid);
// 
//     void insertUserRoles(int userId, int rolesId);
// }


import com.monkeyk.os.domain.users.Roles;
import com.monkeyk.os.domain.users.Users;
import com.monkeyk.os.domain.users.UsersAuthzRepository;
import org.apache.commons.lang.StringUtils;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.stereotype.Repository;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;
    public List<Roles> findAvailableRolesList() {
        String sql = " select r.* from roles r where r.archived = 0 ";
        return this.jdbcTemplate.query(sql, rolesRowMapper);
    }

    @Override
    public Users findByUsername(String username) {
        String sql = " select * from users where username = ? ";
        final List<Users> list = this.jdbcTemplate.query(sql, usersRowMapper, username);
        return list.isEmpty() ? null : list.get(0);
    }

    @Override
    public int saveUsers(final Users users) {
        String sql = " insert into users(guid,create_time, username,password) values (?,?,?,?) ";
        this.jdbcTemplate.update(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps) throws SQLException {
                ps.setString(1, users.guid());
                ps.setTimestamp(2, new Timestamp(users.createTime().getTime()));
                ps.setString(3, users.username());

                ps.setString(4, users.password());
            }
        });

        return this.jdbcTemplate.queryForObject("select id from users where guid = ?", new Object[]{users.guid()}, Integer.class);
    }

    @Override
// Path: core/src/main/java/com/monkeyk/os/domain/users/Roles.java
// public class Roles extends AbstractDomain {
//     private static final long serialVersionUID = 8762398291767207066L;
// 
// 
//     private transient UsersRepository usersRepository = BeanProvider.getBean(UsersRepository.class);
// 
//     private int id;
// 
//     private String roleName;
// 
//     public Roles() {
//     }
// 
//     public int id() {
//         return id;
//     }
// 
//     public Roles id(int id) {
//         this.id = id;
//         return this;
//     }
// 
//     public List<String> permissions() {
//         return this.usersRepository.findPermissionsByRoles(this.guid);
//     }
// 
//     public String roleName() {
//         return roleName;
//     }
// 
//     public Roles roleName(String roleName) {
//         this.roleName = roleName;
//         return this;
//     }
// }
// 
// Path: core/src/main/java/com/monkeyk/os/domain/users/Users.java
// public class Users extends AbstractDomain {
//     private static final long serialVersionUID = -3990278799194556012L;
// 
//     private transient UsersRepository usersRepository = BeanProvider.getBean(UsersRepository.class);
// 
//     private String username;
//     private String password;
// 
// 
//     private boolean defaultUser;
//     private Date lastLoginTime;
// 
//     public Users() {
//     }
// 
// 
//     public List<Roles> rolesList() {
//         return usersRepository.findUsersRolesList(this.guid);
//     }
// 
// 
//     public String username() {
//         return username;
//     }
// 
//     public Users username(String username) {
//         this.username = username;
//         return this;
//     }
// 
//     public String password() {
//         return password;
//     }
// 
//     public Users password(String password) {
//         this.password = password;
//         return this;
//     }
// 
//     public boolean defaultUser() {
//         return defaultUser;
//     }
// 
//     public Users defaultUser(boolean defaultUser) {
//         this.defaultUser = defaultUser;
//         return this;
//     }
// 
//     public Date lastLoginTime() {
//         return lastLoginTime;
//     }
// 
//     public Users lastLoginTime(Date lastLoginTime) {
//         this.lastLoginTime = lastLoginTime;
//         return this;
//     }
// }
// 
// Path: authz/src/main/java/com/monkeyk/os/domain/users/UsersAuthzRepository.java
// public interface UsersAuthzRepository extends UsersRepository {
// 
//     List<Users> findUsersByUsername(String username);
// 
//     List<Roles> findAvailableRolesList();
// 
//     Users findByUsername(String username);
// 
//     int saveUsers(Users users);
// 
//     Roles findRolesByGuid(String guid);
// 
//     void insertUserRoles(int userId, int rolesId);
// }


// Path: authz/src/main/java/com/monkeyk/os/infrastructure/jdbc/UsersJdbcAuthzRepository.java
import com.monkeyk.os.domain.users.Roles;
import com.monkeyk.os.domain.users.Users;
import com.monkeyk.os.domain.users.UsersAuthzRepository;
import org.apache.commons.lang.StringUtils;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.stereotype.Repository;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;

    public List<Roles> findAvailableRolesList() {
        String sql = " select r.* from roles r where r.archived = 0 ";
        return this.jdbcTemplate.query(sql, rolesRowMapper);
    }

    @Override
    public Users findByUsername(String username) {
        String sql = " select * from users where username = ? ";
        final List<Users> list = this.jdbcTemplate.query(sql, usersRowMapper, username);
        return list.isEmpty() ? null : list.get(0);
    }

    @Override
    public int saveUsers(final Users users) {
        String sql = " insert into users(guid,create_time, username,password) values (?,?,?,?) ";
        this.jdbcTemplate.update(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps) throws SQLException {
                ps.setString(1, users.guid());
                ps.setTimestamp(2, new Timestamp(users.createTime().getTime()));
                ps.setString(3, users.username());

                ps.setString(4, users.password());
            }
        });

        return this.jdbcTemplate.queryForObject("select id from users where guid = ?", new Object[]{users.guid()}, Integer.class);
    }

    @Override
    public Roles findRolesByGuid(String guid) {