in app/src/main/java/com/amazon/aws/partners/saasfactory/pgrls/service/TenantServiceImpl.java [156:194]
protected User insertUser(User user) {
NamedParameterJdbcTemplate jdbc = new NamedParameterJdbcTemplate(jdbc());
GeneratedKeyHolder generated = new GeneratedKeyHolder();
StringBuilder sql = new StringBuilder("INSERT INTO tenant_user (tenant_id, email, given_name, family_name) VALUES (:tenant_id, :email, :given_name, :family_name)");
MapSqlParameterSource params = new MapSqlParameterSource()
.addValue("tenant_id", user.getTenant().getId())
.addValue("email", user.getEmail())
.addValue("given_name", user.getGivenName())
.addValue("family_name", user.getFamilyName());
try {
int update = jdbc.update(sql.toString(), params, generated);
if (update == 1) {
UUID userId = (UUID) generated.getKeys().get("user_id");
user.setId(userId);
user.setTenant(getTenant(user.getTenant().getId()));
}
} catch (BadSqlGrammarException e) {
// Postgres will throw an Access Rule Violation error with condition
// insufficient_privilege if an INSERT fails to satisfy an RLS policy.
// ERROR: 42501: new row violates row-level security policy for table...
if ("42501".equals(e.getSQLException().getSQLState())) {
throw new UnauthorizedException();
} else {
throw e;
}
} catch (DataAccessException e) {
if (e.getRootCause() instanceof SQLException) {
SQLException sqlError = (SQLException) e.getRootCause();
if ("23505".equals(sqlError.getSQLState())) {
throw new UniqueRecordException(user.getEmail() + " already exists", e);
} else {
throw e;
}
} else {
throw e;
}
}
return user;
}