/*
* Created on 04/09/2006 21:23:22
*/
package net.jforum.api.rest;
import java.util.List;
import freemarker.template.SimpleHash;
import freemarker.template.Template;
import net.jforum.Command;
import net.jforum.JForumExecutionContext;
import net.jforum.context.RequestContext;
import net.jforum.context.ResponseContext;
import net.jforum.dao.DataAccessDriver;
import net.jforum.dao.UserDAO;
import net.jforum.entities.User;
import net.jforum.exceptions.APIException;
import net.jforum.util.I18n;
import net.jforum.util.preferences.ConfigKeys;
import net.jforum.util.preferences.SystemGlobals;
import net.jforum.util.preferences.TemplateKeys;
/**
* @author Rafael Steil
* @version $Id: UserREST.java,v 1.3 2006/10/10 00:49:04 rafaelsteil Exp $
*/
public class UserREST extends Command
{
/**
* List all users
*/
public void list()
{
try {
this.authenticate();
UserDAO dao = DataAccessDriver.getInstance().newUserDAO();
List users = dao.selectAll();
this.setTemplateName(TemplateKeys.API_USER_LIST);
this.context.put("users", users);
}
catch (Exception e) {
this.setTemplateName(TemplateKeys.API_ERROR);
this.context.put("exception", e);
}
}
/**
* Creates a new user.
* Required parameters ara "username", "email" and "password".
*/
public void insert()
{
try {
this.authenticate();
String username = this.requiredRequestParameter("username");
String email = this.requiredRequestParameter("email");
String password = this.requiredRequestParameter("password");
if (username.length() > SystemGlobals.getIntValue(ConfigKeys.USERNAME_MAX_LENGTH)) {
throw new APIException(I18n.getMessage("User.usernameTooBig"));
}
if (username.indexOf('<') > -1 || username.indexOf('>') > -1) {
throw new APIException(I18n.getMessage("User.usernameInvalidChars"));
}
UserDAO dao = DataAccessDriver.getInstance().newUserDAO();
if (dao.isUsernameRegistered(username)) {
throw new APIException(I18n.getMessage("UsernameExists"));
}
if (dao.findByEmail(email) != null) {
throw new APIException(I18n.getMessage("User.emailExists", new Object[] { email }));
}
// Ok, time to insert the user
User user = new User();
user.setUsername(username);
user.setEmail(email);
user.setPassword(password);
int userId = dao.addNew(user);
this.setTemplateName(TemplateKeys.API_USER_INSERT);
this.context.put("userId", new Integer(userId));
}
catch (Exception e) {
this.setTemplateName(TemplateKeys.API_ERROR);
this.context.put("exception", e);
}
}
/**
* Retrieves a parameter from the request and ensures it exists
* @param paramName the parameter name to retrieve its value
* @return the parameter value
* @throws APIException if the parameter is not found or its value is empty
*/
private String requiredRequestParameter(String paramName)
{
String value = this.request.getParameter(paramName);
if (value == null || value.trim().length() == 0) {
throw new APIException("The parameter '" + paramName + "' was not found");
}
return value;
}
/**
* Tries to authenticate the user accessing the API
* @throws APIException if the authentication fails
*/
private void authenticate()
{
String apiKey = this.requiredRequestParameter("api_key");
RESTAuthentication auth = new RESTAuthentication();
if (!auth.validateApiKey(apiKey)) {
throw new APIException("The provided API authentication information is not valid");
}
}
public Template process(RequestContext request, ResponseContext response, SimpleHash context)
{
JForumExecutionContext.setContentType("text/xml");
return super.process(request, response, context);
}
}