package in.partake.controller.api.account;
import in.partake.base.PartakeException;
import in.partake.controller.api.AbstractPartakeAPI;
import in.partake.model.IPartakeDAOs;
import in.partake.model.UserEx;
import in.partake.model.access.DBAccess;
import in.partake.model.dao.DAOException;
import in.partake.model.dao.PartakeConnection;
import in.partake.model.dao.access.IUserAccess;
import in.partake.model.dto.User;
import in.partake.resource.UserErrorCode;
import play.Logger;
import play.mvc.Result;
public class BanAPI extends AbstractPartakeAPI {
public static Result post() throws DAOException, PartakeException {
return new BanAPI().execute();
}
@Override
public Result doExecute() throws DAOException, PartakeException {
ensureValidSessionToken();
UserEx user = ensureAdmin();
String targetUserId = getFormParameter("targetUserId");
boolean state = getBooleanParameter("targetState"); // true if administrator wants to ban
BanAPITransaction transaction = new BanAPITransaction(user.getId(), targetUserId, state);
User bannedUser = transaction.execute();
if (bannedUser == null) {
return renderInvalid(UserErrorCode.INVALID_ARGUMENT);
} else {
// Admin専用APIなのでtoSafeJSONの代わりにtoJSONを呼ぶ
return renderOK(bannedUser.toJSON());
}
}
}
class BanAPITransaction extends DBAccess<User> {
private final String userId;
private final String targetUserId;
private final boolean targetState;
public BanAPITransaction(String userId, String targetUserId, boolean state) {
this.userId = userId;
this.targetUserId = targetUserId;
this.targetState = state;
}
@Override
protected User doExecute(PartakeConnection con, IPartakeDAOs daos) throws DAOException, PartakeException {
IUserAccess access = daos.getUserAccess();
User targetUser = access.find(con, targetUserId);
if (targetUser == null) {
Logger.info("No user has specified ID: " + targetUserId);
return null;
} else if (targetState == targetUser.isBanned()) {
if (targetState) {
Logger.info(String.format(
"No need to ban: specified user (%s) is already banned",
targetUser.getId()));
} else {
Logger.info(String.format(
"No need to recover: specified user (%s) is not banned yet",
targetUser.getId()));
}
return null;
}
targetUser = new User(targetUser);
targetUser.setBanned(targetState);
access.put(con, targetUser);
Logger.info(String.format(
"Administrator (%s) changed state of user (%s) to %s",
userId,
targetUser.getId(),
targetState ? "BANNED" : "NOT BANNED"));
return targetUser;
}
}