// Path: authrite-service/src/main/java/com/lewisd/authrite/resources/model/Player.java
// public class Player {
//     private final UUID gameId;
// 
//     public Player(final UUID gameId) {
// 
//         this.gameId = gameId;
//     }
// 
//     public UUID getGameId() {
//         return gameId;
//     }
// 
//     public static Player fromDB(final DBPlayer player) {
//         return new Player(
//                 player.getGameId()
//         );
//     }
// 
// }
// 
// Path: authrite-service/src/main/java/com/lewisd/authrite/resources/model/User.java
// public class User implements Principal {
// 
//     private final UUID id;
//     @NotEmpty
//     @Email(regexp = ".+@.+\\..+")
//     private final String email;
//     @NotEmpty
//     @Length(min = 3, max = 20)
//     private final String displayName;
// 
//     private final Set<Roles> roles;
// 
//     @JsonCreator
//     public User(@JsonProperty("id") final UUID id,
//                 @JsonProperty("email") final String email,
//                 @JsonProperty("displayName") final String displayName,
//                 @JsonProperty("roles") final Set<Roles> roles) {
//         this.id = id;
//         this.email = email;
//         this.displayName = displayName;
//         this.roles = roles == null ? Collections.emptySet() : new HashSet<>(roles);
//     }
// 
//     public UUID getId() {
//         return id;
//     }
// 
//     public String getEmail() {
//         return email;
//     }
// 
//     public String getDisplayName() {
//         return displayName;
//     }
// 
//     public Set<Roles> getRoles() {
//         return roles;
//     }
// 
//     public static User fromDB(final DBUser user) {
//         return new User(
//                 user.getId(),
//                 user.getEmail(),
//                 user.getDisplayName(),
//                 user.getRoles());
//     }
// 
//     @JsonIgnore
//     @Override
//     public String getName() {
//         return email;
//     }
// 
//     @Override
//     public boolean implies(final Subject subject) {
//         return false;
//     }
// 
//     public boolean canRead(final Class<?> resourceClass, final UUID userId) {
//         for (Roles role : roles) {
//             if (role.canRead(resourceClass, this, userId)) {
//                 return true;
//             }
//         }
//         return false;
//     }
// 
//     public boolean canModify(final Class<?> resourceClass, final UUID userId) {
//         for (Roles role : roles) {
//             if (role.canWrite(resourceClass, this, userId)) {
//                 return true;
//             }
//         }
//         return false;
//     }
// 
//     @JsonIgnore
//     public boolean isAdminForReading() {
//         return roles.contains(Roles.ADMIN) || roles.contains(Roles.RO_ADMIN);
//     }
// }


import com.lewisd.authrite.resources.model.Player;
import com.lewisd.authrite.resources.model.User;
import java.util.UUID;
package com.lewisd.authrite.auth;



public enum Roles {
    PLAYER {
        @Override
        protected boolean canReadUser(final User principal, final UUID userId) {
            return userId.equals(principal.getId());
        }

        @Override
        protected boolean canWriteUser(final User principal, final UUID userId) {
            return userId.equals(principal.getId());
        }
    },
    RO_ADMIN {
        @Override
        protected boolean canReadUser(final User principal, final UUID userId) {
            return true;
        }

        @Override
        protected boolean canWriteUser(final User principal, final UUID userId) {
            return userId.equals(principal.getId());
        }
    },
    ADMIN {
        @Override
        protected boolean canReadUser(final User principal, final UUID userId) {
// Path: authrite-service/src/main/java/com/lewisd/authrite/resources/model/Player.java
// public class Player {
//     private final UUID gameId;
// 
//     public Player(final UUID gameId) {
// 
//         this.gameId = gameId;
//     }
// 
//     public UUID getGameId() {
//         return gameId;
//     }
// 
//     public static Player fromDB(final DBPlayer player) {
//         return new Player(
//                 player.getGameId()
//         );
//     }
// 
// }
// 
// Path: authrite-service/src/main/java/com/lewisd/authrite/resources/model/User.java
// public class User implements Principal {
// 
//     private final UUID id;
//     @NotEmpty
//     @Email(regexp = ".+@.+\\..+")
//     private final String email;
//     @NotEmpty
//     @Length(min = 3, max = 20)
//     private final String displayName;
// 
//     private final Set<Roles> roles;
// 
//     @JsonCreator
//     public User(@JsonProperty("id") final UUID id,
//                 @JsonProperty("email") final String email,
//                 @JsonProperty("displayName") final String displayName,
//                 @JsonProperty("roles") final Set<Roles> roles) {
//         this.id = id;
//         this.email = email;
//         this.displayName = displayName;
//         this.roles = roles == null ? Collections.emptySet() : new HashSet<>(roles);
//     }
// 
//     public UUID getId() {
//         return id;
//     }
// 
//     public String getEmail() {
//         return email;
//     }
// 
//     public String getDisplayName() {
//         return displayName;
//     }
// 
//     public Set<Roles> getRoles() {
//         return roles;
//     }
// 
//     public static User fromDB(final DBUser user) {
//         return new User(
//                 user.getId(),
//                 user.getEmail(),
//                 user.getDisplayName(),
//                 user.getRoles());
//     }
// 
//     @JsonIgnore
//     @Override
//     public String getName() {
//         return email;
//     }
// 
//     @Override
//     public boolean implies(final Subject subject) {
//         return false;
//     }
// 
//     public boolean canRead(final Class<?> resourceClass, final UUID userId) {
//         for (Roles role : roles) {
//             if (role.canRead(resourceClass, this, userId)) {
//                 return true;
//             }
//         }
//         return false;
//     }
// 
//     public boolean canModify(final Class<?> resourceClass, final UUID userId) {
//         for (Roles role : roles) {
//             if (role.canWrite(resourceClass, this, userId)) {
//                 return true;
//             }
//         }
//         return false;
//     }
// 
//     @JsonIgnore
//     public boolean isAdminForReading() {
//         return roles.contains(Roles.ADMIN) || roles.contains(Roles.RO_ADMIN);
//     }
// }


// Path: authrite-service/src/main/java/com/lewisd/authrite/auth/Roles.java
import com.lewisd.authrite.resources.model.Player;
import com.lewisd.authrite.resources.model.User;
import java.util.UUID;

package com.lewisd.authrite.auth;



public enum Roles {
    PLAYER {
        @Override
        protected boolean canReadUser(final User principal, final UUID userId) {
            return userId.equals(principal.getId());
        }

        @Override
        protected boolean canWriteUser(final User principal, final UUID userId) {
            return userId.equals(principal.getId());
        }
    },
    RO_ADMIN {
        @Override
        protected boolean canReadUser(final User principal, final UUID userId) {
            return true;
        }

        @Override
        protected boolean canWriteUser(final User principal, final UUID userId) {
            return userId.equals(principal.getId());
        }
    },
    ADMIN {
        @Override
        protected boolean canReadUser(final User principal, final UUID userId) {
            return true;