package com.stacksync.syncservice.db.postgresql;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.apache.log4j.Logger;
import com.stacksync.commons.models.Item;
import com.stacksync.commons.models.User;
import com.stacksync.commons.models.UserWorkspace;
import com.stacksync.commons.models.Workspace;
import com.stacksync.syncservice.db.DAOError;
import com.stacksync.syncservice.db.DAOUtil;
import com.stacksync.syncservice.db.WorkspaceDAO;
import com.stacksync.syncservice.exceptions.dao.DAOException;
import com.stacksync.syncservice.exceptions.dao.NoResultReturnedDAOException;
public class PostgresqlWorkspaceDAO extends PostgresqlDAO implements WorkspaceDAO {
private static final Logger logger = Logger.getLogger(PostgresqlWorkspaceDAO.class.getName());
public PostgresqlWorkspaceDAO(Connection connection) {
super(connection);
}
@Override
public Workspace getById(UUID workspaceID) throws DAOException {
ResultSet resultSet = null;
Workspace workspace = null;
String query = "SELECT * FROM workspace w INNER JOIN workspace_user wu ON wu.workspace_id = w.id WHERE w.id = ?::uuid";
try {
resultSet = executeQuery(query, new Object[] { workspaceID });
if (resultSet.next()) {
workspace = mapWorkspace(resultSet);
}
} catch (SQLException e) {
logger.error(e);
throw new DAOException(DAOError.INTERNAL_SERVER_ERROR);
}
return workspace;
}
@Override
public List<Workspace> getByUserId(UUID userId) throws DAOException {
Object[] values = { userId };
String query = "SELECT w.*, wu.* FROM workspace w "
+ " INNER JOIN workspace_user wu ON wu.workspace_id = w.id "
+ " WHERE wu.user_id=?::uuid";
ResultSet result = null;
List<Workspace> workspaces = new ArrayList<Workspace>();
try {
result = executeQuery(query, values);
while (result.next()) {
Workspace workspace = mapWorkspace(result);
workspaces.add(workspace);
}
if (workspaces.isEmpty()) {
throw new NoResultReturnedDAOException(DAOError.WORKSPACES_NOT_FOUND);
}
} catch (SQLException e) {
logger.error(e);
throw new DAOException(DAOError.INTERNAL_SERVER_ERROR);
}
return workspaces;
}
@Override
public Workspace getDefaultWorkspaceByUserId(UUID userId) throws DAOException {
Object[] values = { userId };
String query = "SELECT w.*, wu.* FROM workspace w "
+ " INNER JOIN workspace_user wu ON wu.workspace_id = w.id "
+ " WHERE w.owner_id=?::uuid AND w.is_shared = false LIMIT 1";
ResultSet result = null;
Workspace workspace;
try {
result = executeQuery(query, values);
if (result.next()) {
workspace = mapWorkspace(result);
}else {
throw new NoResultReturnedDAOException(DAOError.WORKSPACES_NOT_FOUND);
}
} catch (SQLException e) {
logger.error(e);
throw new DAOException(DAOError.INTERNAL_SERVER_ERROR);
}
return workspace;
}
@Override
public void add(Workspace workspace) throws DAOException {
if (!workspace.isValid()) {
throw new IllegalArgumentException("Workspace attributes not set");
}
Object[] values = { workspace.getLatestRevision(), workspace.getOwner().getId(), workspace.isShared(), workspace.isEncrypted(),
workspace.getSwiftContainer(), workspace.getSwiftUrl() };
String query = "INSERT INTO workspace (latest_revision, owner_id, is_shared, is_encrypted, swift_container, swift_url) VALUES (?, ?, ?, ?, ?, ?)";
UUID id = (UUID)executeUpdate(query, values);
if (id != null) {
workspace.setId(id);
}
}
@Override
public void update(User user, Workspace workspace) throws DAOException {
if (workspace.getId() == null || user.getId() == null) {
throw new IllegalArgumentException("Attributes not set");
}
Long parentItemId = null;
if (workspace.getParentItem() != null) {
parentItemId = workspace.getParentItem().getId();
}
Object[] values = { workspace.getName(), parentItemId, workspace.getId(), user.getId() };
String query = "UPDATE workspace_user " + " SET workspace_name = ?, parent_item_id = ?, modified_at = now() "
+ " WHERE workspace_id = ?::uuid AND user_id = ?::uuid";
executeUpdate(query, values);
}
@Override
public void delete(UUID workspaceID) throws DAOException {
Object[] values = { workspaceID };
String query = "DELETE FROM workspace WHERE id = ?::uuid";
executeUpdate(query, values);
}
private Workspace mapWorkspace(ResultSet result) throws SQLException {
Workspace workspace = new Workspace();
workspace.setId(UUID.fromString(result.getString("id")));
workspace.setLatestRevision(result.getInt("latest_revision"));
workspace.setShared(result.getBoolean("is_shared"));
workspace.setEncrypted(result.getBoolean("is_encrypted"));
workspace.setName(result.getString("workspace_name"));
workspace.setSwiftContainer(result.getString("swift_container"));
workspace.setSwiftUrl(result.getString("swift_url"));
Long parentItemId = result.getLong("parent_item_id");
if (parentItemId == 0L){
parentItemId = null;
}
workspace.setParentItem(new Item(parentItemId));
User owner = new User();
owner.setId(UUID.fromString(result.getString("owner_id")));
workspace.setOwner(owner);
return workspace;
}
@Override
public void addUser(User user, Workspace workspace) throws DAOException {
if (user == null || !user.isValid()) {
throw new IllegalArgumentException("User not valid");
} else if (workspace == null || !workspace.isValid()) {
throw new IllegalArgumentException("Workspace not valid");
}
Long parentItemId = null;
if (workspace.getParentItem() != null) {
parentItemId = workspace.getParentItem().getId();
}
Object[] values = { workspace.getId(), user.getId(), workspace.getName(), parentItemId };
String query = "INSERT INTO workspace_user (workspace_id, user_id, workspace_name, parent_item_id) VALUES (?::uuid, ?::uuid, ?, ?)";
executeUpdate(query, values);
}
@Override
public void deleteUser(User user, Workspace workspace) throws DAOException {
if (user == null || !user.isValid()) {
throw new IllegalArgumentException("User not valid");
} else if (workspace == null || !workspace.isValid()) {
throw new IllegalArgumentException("Workspace not valid");
}
Object[] values = { workspace.getId(), user.getId() };
String query = "DELETE FROM workspace_user WHERE workspace_id=?::uuid AND user_id=?::uuid";
executeUpdate(query, values);
}
@Override
public Workspace getByItemId(Long itemId) throws DAOException {
ResultSet resultSet = null;
Workspace workspace = null;
String query = "SELECT * FROM workspace w " +
" INNER JOIN workspace_user wu ON wu.workspace_id = w.id " +
" INNER JOIN item i ON w.id = i.workspace_id " +
" WHERE i.id = ?";
try {
resultSet = executeQuery(query, new Object[] { itemId });
if (resultSet.next()) {
workspace = mapWorkspace(resultSet);
}
} catch (SQLException e) {
logger.error(e);
throw new DAOException(DAOError.INTERNAL_SERVER_ERROR);
}
return workspace;
}
@Override
public List<UserWorkspace> getMembersById(UUID workspaceId) throws DAOException {
ResultSet resultSet = null;
List<UserWorkspace> users = new ArrayList<UserWorkspace>();
String query = " SELECT u.*, CASE WHEN u.id=w.owner_id THEN True ELSE False END AS is_owner " +
" , wu.created_at AS joined_at, wu.workspace_id " +
" FROM workspace w " +
" INNER JOIN workspace_user wu ON wu.workspace_id = w.id " +
" INNER JOIN user1 u ON wu.user_id = u.id " +
" WHERE w.id = ?::uuid";
try {
resultSet = executeQuery(query, new Object[] { workspaceId });
while (resultSet.next()) {
UserWorkspace userWorkspace = DAOUtil.getUserWorkspaceFromResultSet(resultSet);
users.add(userWorkspace);
}
} catch (SQLException e) {
logger.error(e);
throw new DAOException(DAOError.INTERNAL_SERVER_ERROR);
}
return users;
}
}