package auth.models;
import auth.GrantType;
import auth.TokenGenerator;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.Model;
import com.avaje.ebean.SqlUpdate;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import play.Configuration;
import service.PoseidonService;
import javax.persistence.*;
import java.util.Date;
import static api.v1.Token.TokenType.BEARER;
import static play.data.validation.Constraints.Required;
@Entity
@Table(name = "POS_TOKEN")
public class Token extends Model {
private static final Logger LOGGER = LoggerFactory.getLogger(Token.class);
@Id
public Long id;
@Required
@Column(name = "access_token", nullable = false)
public String accessToken;
@Column(name = "refresh_token")
public String refreshToken;
@Required
@Column(name = "created")
public Date created;
@Required
@Column(name = "token_type")
public String tokenType;
@Required
@Column(name = "grant_type")
public String grantType;
@Required
@Column(name = "accessExpires", nullable = false)
public Date accessExpires;
@Required
@Column(name = "refreshExpires", nullable = false)
public Date refreshExpires;
@ManyToOne
@JoinColumn(name = "logon_user_id")
public User user;
public Token(User user, GrantType grantType) {
this.accessToken = new TokenGenerator().createToken();
this.refreshToken = new TokenGenerator().createToken();
DateTimeZone tz = PoseidonService.getTimeZone();
this.accessExpires = new DateTime(tz).plusSeconds(Configuration.root().getInt("token.accessExpires")).toDate();
this.refreshExpires = new DateTime(tz).plusSeconds(Configuration.root().getInt("token.refreshExpires")).toDate();
this.created = PoseidonService.getNow().toDate();
this.tokenType = BEARER.getValue();
this.grantType = grantType.getValue();
if (user != null) {
this.user = user;
}
}
public static Finder<Long, Token> find = new Finder<>(Token.class);
public static Token find(Long id) {
Token token = find.byId(id);
LOGGER.debug(token == null ?
"Could not find token by id = {}" :
"Found token by id = {}", id);
return token;
}
public static Token findByTokenValue(String value) {
Token token = find.where().eq("access_token", value).findUnique();
LOGGER.debug(token == null ?
"Could not find token by value = {}" :
"Found token by value = {}", value);
return token;
}
public static Token findByRefreshToken(String refreshToken) {
Token token = find.where().eq("refresh_token", refreshToken).findUnique();
LOGGER.debug(token == null ?
"Could not find refreshtoken by value = {}" :
"Found refreshtoken by value = {}", refreshToken);
return token;
}
public Long getExpiresInSeconds() {
return (long) Math.ceil((accessExpires.getTime() - System.currentTimeMillis()) / 1000.0);
}
public boolean isRefreshTokenActive() {
return new DateTime(refreshExpires, PoseidonService.getTimeZone()).isAfterNow();
}
public boolean isActive() {
return new DateTime(accessExpires, PoseidonService.getTimeZone()).isAfterNow();
}
public static void deleteOldExpiredTokens() {
String sql = "DELETE " +
" FROM pos_token " +
" WHERE refreshExpires = accessExpires" +
" AND accessExpires < :date";
SqlUpdate batchDelete = Ebean.createSqlUpdate(sql);
batchDelete.setParameter("date",new DateTime().minusMonths(1).toDate());
batchDelete.execute();
}
}