
prerna.reactor.insights.save.AddInsightAPIReactor Maven / Gradle / Ivy
The newest version!
package prerna.reactor.insights.save;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Time;
import java.time.LocalDate;
import java.time.ZoneId;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import prerna.auth.User;
import prerna.auth.utils.AbstractSecurityUtils;
import prerna.engine.api.IRDBMSEngine;
import prerna.engine.api.IRawSelectWrapper;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.reactor.AbstractReactor;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Constants;
import prerna.util.Utility;
public class AddInsightAPIReactor extends AbstractReactor {
private static final Logger classLogger = LogManager.getLogger(AddInsightAPIReactor.class);
public AddInsightAPIReactor() {
// the current user
// project id
// insight id
// password - uses project id to convert into hash / api key
// created on - current date and time
// limit
// count
// expires _on - default is 5 days after API
// consumer
// limit - if not set goes to
this.keysToGet = new String[]{
ReactorKeysEnum.PROJECT.getKey(),
ReactorKeysEnum.ID.getKey(),
ReactorKeysEnum.PASSWORD.getKey(),
ReactorKeysEnum.CONSUMER_ID.getKey(),
ReactorKeysEnum.LIMIT.getKey(),
ReactorKeysEnum.EXPIRES_ON.getKey()
};
this.keyRequired = new int[] {
1,
1,
1,
1,
0,
0
};
}
@Override
public NounMetadata execute() {
User user = this.insight.getUser();
String author = null;
String email = user.getAccessToken(user.getPrimaryLogin()).getEmail();
String id = user.getAccessToken(user.getPrimaryLogin()).getId();
if(AbstractSecurityUtils.anonymousUsersEnabled() && user.isAnonymous()) {
throwAnonymousUserError();
}
organizeKeys();
String projectId = keyValue.get(keysToGet[0]);
String insightId = keyValue.get(keysToGet[1]);
String pass = keyValue.get(keysToGet[2]);
// right now we dont validate with list of existing consumer id
// if we want eventually we will validate this to make sure you cannot add random consumers
String consumerId = keyValue.get(keysToGet[3]);
int limit = 100;
if(keyValue.containsValue(keysToGet[4]))
limit = Integer.parseInt(keyValue.get(keysToGet[4]));
LocalDate dt = LocalDate.now();
java.util.Date utilToday = Date.from(dt.atStartOfDay(ZoneId.systemDefault()).toInstant());
Date createdOn = new Date(utilToday.getTime());
Time createdTime = new Time(utilToday.getTime());
int count = 0; // initialized to zero
dt = dt.plusDays(100); // default expiry at 100 days
java.util.Date utilExpire = Date.from(dt.atStartOfDay(ZoneId.systemDefault()).toInstant());
//Date expiresOn = new Date(utilExpire.getTime());
Time expiresTime = new Time(utilExpire.getTime());
String apiKey = null;
try {
// generate the API key
MessageDigest md = MessageDigest.getInstance("SHA-256");
String finalData = projectId + insightId + pass;
byte[] digest = md.digest(finalData.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < digest.length; i++) {
sb.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1));
}
apiKey = sb.toString();
// find if this project insight consumer already exists
// if so throw an error
String existingSQL = "SELECT count(*) from API_KEY where Project_ID = '" + projectId + "\' and INSIGHT_ID = '" + insightId + "' and CONSUMER_ID = '" + consumerId + "'";
IRDBMSEngine secDB = (IRDBMSEngine)Utility.getDatabase(Constants.SECURITY_DB);
IRawSelectWrapper wrapper = WrapperManager.getInstance().getRawWrapper(secDB, existingSQL);
if(wrapper.getNumRecords() > 0)
{
// throw an exception to say you need to use the update insight APi
}
// first field is the database
String [] colNames = new String[] {"API_KEY", "CREATOR_ID", "PROJECT_ID", "INSIGHT_ID", "API_KEY", "CREATED_ON", "API_LIMIT", "COUNT", "EXPIRES_ON","CONSUMER_ID"};
PreparedStatement pst = secDB.bulkInsertPreparedStatement(colNames);
pst.setString(1, id);
pst.setString(2, projectId);
pst.setString(3, insightId);
pst.setString(4, apiKey);
pst.setDate(5, createdOn);
pst.setInt(6, limit);
pst.setInt(7, 0);
pst.setTime(8, expiresTime);
pst.setString(9, consumerId);
pst.execute();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
classLogger.error(Constants.STACKTRACE, e);
} catch (SQLException e) {
// TODO Auto-generated catch block
classLogger.error(Constants.STACKTRACE, e);
} catch (Exception e) {
// TODO Auto-generated catch block
classLogger.error(Constants.STACKTRACE, e);
}
return new NounMetadata("Completeled insight API <<" + apiKey + ">>", PixelDataType.CONST_STRING);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy