package net.frozenorb.apiv3.models; import lombok.Getter; import net.frozenorb.apiv3.APIv3; import net.frozenorb.apiv3.weirdStuff.ExcludeFromReplies; import org.bson.Document; import org.mongodb.morphia.annotations.Entity; import org.mongodb.morphia.annotations.Id; import java.util.*; @Entity(value = "users", noClassnameStored = true) public final class User { @Getter @Id private UUID id; @Getter private String lastName; @Getter @ExcludeFromReplies private Map aliases; @Getter @ExcludeFromReplies private String otpCode; @Getter @ExcludeFromReplies private String password; @Getter @ExcludeFromReplies private String passwordSalt; @Getter private String email; @Getter private int phoneNumber; @Getter private String lastSeenOn; @Getter private Date lastSeenAt; @Getter private Date firstSeen; public static User byId(String id) { try { return byId(UUID.fromString(id)); } catch (Exception ex) { throw new IllegalArgumentException("Invalid UUID string " + id, ex); } } public static User byId(UUID id) { return APIv3.getDatastore().createQuery(User.class).field("id").equal(id).get(); } // TODO: FIND ALL USAGES OF THIS AND // SEE HOW MANY OF THEM (EX NON GET REQUESTS) // WE CAN DROP public static User byIdOrName(String idOrName) { if (idOrName.length() == 36) { return byId(UUID.fromString(idOrName)); } else { return byName(idOrName); } } @Deprecated public static User byName(String name) { return APIv3.getDatastore().createQuery(User.class).field("lastName").equalIgnoreCase(name).get(); } public static List values() { return APIv3.getDatastore().createQuery(User.class).asList(); } public User() {} // For Morphia public User(UUID id, String lastName) { this.id = id; this.lastName = lastName; this.aliases = new HashMap<>(); this.otpCode = null; this.password = null; this.passwordSalt = null; this.email = null; this.phoneNumber = -1; this.lastSeenOn = null; this.lastSeenAt = new Date(); this.firstSeen = new Date(); aliases.put(lastName, new Date()); } public boolean hasPermissionAnywhere(String permission) { return hasPermissionScoped(permission, null); } public boolean hasPermissionScoped(String permission, ServerGroup scope) { // TODO: BLAH FIX THIS IF WE DONT REMOVE THEN IDK WHAT TO SAY // Also this is 1 > 0 because 'return true;' means all usages of this // get marked as a warning until we change it. return 1 > 0; } public List getGrants() { return APIv3.getDatastore().createQuery(Grant.class).field("target").equal(id).asList(); } public List getGrants(ServerGroup scope) { return APIv3.getDatastore().createQuery(Grant.class).field("target").equal(id).field("scopes").equalIgnoreCase(scope.getId()).asList(); } public List getIPLog() { return APIv3.getDatastore().createQuery(IPLogEntry.class).field("user").equal(id).asList(); } public List getPunishments() { return APIv3.getDatastore().createQuery(Punishment.class).field("target").equal(id).asList(); } public List getPunishments(Punishment.PunishmentType type) { return APIv3.getDatastore().createQuery(Punishment.class).field("target").equal(id).field("type").equal(type).asList(); } public UserMetaEntry getMeta(ServerGroup group) { return APIv3.getDatastore().createQuery(UserMetaEntry.class).field("user").equal(id).field("serverGroup").equalIgnoreCase(group.getId()).get(); } public void saveMeta(ServerGroup group, Document data) { UserMetaEntry entry = getMeta(group); if (entry == null) { APIv3.getDatastore().save(new UserMetaEntry(this, group, data)); } else { entry.setData(data); APIv3.getDatastore().save(entry); } } }