APIv3/src/main/java/net/frozenorb/apiv3/model/Grant.java

105 lines
3.1 KiB
Java
Raw Normal View History

2016-02-12 02:40:06 +01:00
package net.frozenorb.apiv3.model;
2016-02-08 02:51:02 +01:00
2016-02-12 01:10:46 +01:00
import com.google.common.collect.ImmutableSet;
import lombok.Getter;
import lombok.ToString;
2016-02-12 06:31:57 +01:00
import net.frozenorb.apiv3.accessor.Grants;
2016-02-12 01:10:46 +01:00
import org.bson.Document;
2016-02-12 01:10:46 +01:00
import java.time.Instant;
import java.util.Collection;
import java.util.Set;
import java.util.UUID;
@ToString
2016-02-12 06:31:57 +01:00
public final class Grant extends BaseModel {
2016-02-08 02:51:02 +01:00
@Getter private String id;
2016-02-12 01:10:46 +01:00
@Getter private UUID target;
@Getter private String reason;
@Getter private Set<String> scopes;
@Getter private String rank;
2016-02-12 06:31:57 +01:00
@Getter private Instant expiresAt;
2016-02-12 01:10:46 +01:00
@Getter private UUID addedBy;
@Getter private Instant addedAt;
@Getter private UUID removedBy;
@Getter private Instant removedAt;
@Getter private String removalReason;
2016-02-12 02:40:06 +01:00
public Grant(Document json) {
2016-02-12 06:31:57 +01:00
super(Grants.COLLECTION_NAME);
2016-02-12 01:10:46 +01:00
this.id = json.getString("_id");
this.target = UUID.fromString(json.getString("target"));
this.reason = json.getString("reason");
this.scopes = ImmutableSet.copyOf((Collection) json.get("scopes")); // This is a safe cast, the collection's type is always String
this.rank = json.getString("rank");
2016-02-12 06:31:57 +01:00
this.expiresAt = (Instant) json.get("expiresAt");
2016-02-12 01:10:46 +01:00
this.addedBy = UUID.fromString(json.getString("addedBy"));
this.addedAt = (Instant) json.get("addedAt");
if (json.containsKey("removedBy")) {
this.removedBy = UUID.fromString(json.getString("removedBy"));
this.removedAt = (Instant) json.get("removedAt");
this.removalReason = json.getString("removalReason");
}
2016-02-12 06:31:57 +01:00
setId(id);
}
public void delete(UUID removedBy, String reason) {
this.removedBy = removedBy;
this.removedAt = Instant.now();
this.removalReason = reason;
Document update = new Document();
update.put("removedBy", removedBy.toString());
update.put("removedAt", removedAt);
update.put("removalReason", removalReason);
super.update(new Document("$set", update), (result, error) -> {});
}
public boolean isActive() {
return !(isExpired() || isRemoved());
}
public boolean isExpired() {
if (expiresAt == null) {
return false; // Never expires
} else {
return expiresAt.isAfter(Instant.now());
}
}
public boolean isRemoved() {
return removedBy != null;
2016-02-12 01:10:46 +01:00
}
2016-02-12 01:10:46 +01:00
public Document toLiteJson() {
Document json = new Document();
json.put("id", id);
json.put("target", target.toString());
json.put("reason", reason);
json.put("scopes", scopes);
json.put("rank", rank);
json.put("addedBy", addedBy.toString());
json.put("addedAt", addedAt.toString());
2016-02-12 06:31:57 +01:00
json.put("active", isActive());
json.put("expired", isExpired());
json.put("removed", isRemoved());
2016-02-12 01:10:46 +01:00
if (removedBy != null) {
json.put("removedBy", removedBy.toString());
json.put("removedAt", removedAt.toString());
json.put("removalReason", removalReason);
}
return json;
}
2016-02-08 02:51:02 +01:00
}