Skip to content

Commit

Permalink
api: Update import APIs - create user
Browse files Browse the repository at this point in the history
  • Loading branch information
doortts committed Jul 2, 2017
1 parent af10593 commit f4bea70
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 4 deletions.
4 changes: 2 additions & 2 deletions app/controllers/UserApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -887,7 +887,7 @@ public static Result editUserInfoByTabForm(String tabId) {
}
}

private static boolean isUsingEmailVerification() {
public static boolean isUsingEmailVerification() {
return usingEmailVerification;
}

Expand Down Expand Up @@ -1206,7 +1206,7 @@ private static void validate(Form<User> newUserForm) {
}
}

private static User createNewUser(User user) {
public static User createNewUser(User user) {
RandomNumberGenerator rng = new SecureRandomNumberGenerator();
user.passwordSalt = rng.nextBytes().toBase64();
user.password = hashedPassword(user.password, user.passwordSalt);
Expand Down
105 changes: 103 additions & 2 deletions app/controllers/api/UserApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,31 @@
**/
package controllers.api;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import controllers.UserApp;
import models.FavoriteOrganization;
import models.FavoriteProject;
import models.User;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import play.db.ebean.Transactional;
import play.i18n.Messages;
import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Result;

import java.util.ArrayList;
import java.util.List;

import static controllers.UserApp.createNewUser;
import static models.NotificationMail.isAllowedEmailDomains;
import static play.libs.Json.toJson;

public class UserApi extends Controller {

@Transactional
public static Result toggleFoveriteProject(String projectId) {
if(projectId == null) {
if (projectId == null) {
return badRequest("Wrong project id");
}
boolean isFavored = UserApp.currentUser().toggleFavoriteProject(Long.valueOf(projectId));
Expand Down Expand Up @@ -55,7 +61,7 @@ public static Result getFoveriteProjects() {

@Transactional
public static Result toggleFoveriteOrganization(String organizationId) {
if(organizationId == null) {
if (organizationId == null) {
return badRequest("Wrong organization id");
}
boolean isFavored = UserApp.currentUser().toggleFavoriteOrganization(Long.valueOf(organizationId));
Expand All @@ -81,4 +87,99 @@ public static Result getFoveriteOrganizations() {
json.put("organizations", toJson(organizations));
return ok(json);
}

@Transactional
public static Result newUser() {
ObjectNode result = Json.newObject();
JsonNode json = request().body().asJson();
if (json == null) {
return badRequest(result.put("message", "Expecting Json data"));
}

if (!UserApp.currentUser().isSiteManager()) {
return badRequest(result.put("message", "User creation with api is allowed by Site admin only."));
}

JsonNode usersNode = json.findValue("users");
if (usersNode == null || !usersNode.isArray()) {
return badRequest(result.put("message", "No users key exists or value must be array!"));
}

List<JsonNode> createdUsers = new ArrayList<>();
for (JsonNode userNode : usersNode) {
createdUsers.add(createUserNode(userNode));
}

return created(toJson(createdUsers));
}

private static JsonNode createUserNode(JsonNode userNode) {
ObjectNode createdUserNode = Json.newObject();

String loginId = userNode.findValue("loginId").asText();
String name = userNode.findValue("name").asText();
String email = userNode.findValue("email").asText();

String message;
if (!isAllowedEmailDomains(email)) {
return notAllowedDomainEmailUser(userNode);
}

User found = User.findByEmail(email);
if (!found.isAnonymous()) {
return alreadyExistedUser(userNode);
}

User user = new User();
user.loginId = loginId;
user.name = name;
user.email = email;
user.password = new SecureRandomNumberGenerator().nextBytes().toBase64();

createdUserNode.put("status", 201);
createdUserNode.put("reason", "Created");
createdUserNode.put("user", successfullyCreatedUserNode(createNewUser(user)));
return createdUserNode;
}

private static JsonNode successfullyCreatedUserNode(User created) {
ObjectNode createdUserNode = Json.newObject();
createdUserNode.put("id", created.id);
createdUserNode.put("loginId", created.loginId);
createdUserNode.put("name", created.name);
createdUserNode.put("email", created.email);
return createdUserNode;
}

private static JsonNode notAllowedDomainEmailUser(JsonNode userNode) {
ObjectNode createdUserNode = Json.newObject();
String message = Messages.get("user.unacceptable.email.domain");
loggingUser(userNode, message);

createdUserNode.put("status", 403);
createdUserNode.put("reason", "Forbidden");
createdUserNode.put("message", message);
createdUserNode.put("user", userNode);
return createdUserNode;
}

private static JsonNode alreadyExistedUser(JsonNode userNode) {
ObjectNode createdUserNode = Json.newObject();
String message = "Already exists!";
loggingUser(userNode, message);

createdUserNode.put("status", 409);
createdUserNode.put("reason", "Conflict");
createdUserNode.put("message", message);
createdUserNode.put("user", userNode);

return createdUserNode;
}

private static void loggingUser(JsonNode userNode, String message) {
String name = userNode.findValue("name").asText();
String email = userNode.findValue("email").asText();
play.Logger.warn(message);
play.Logger.warn("Rejected: " + name + " with " + email);
}
}
1 change: 1 addition & 0 deletions conf/routes
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ POST /-_-api/v1/favoriteProjects/:projectId
GET /-_-api/v1/favoriteOrganizations controllers.api.UserApi.getFoveriteOrganizations
POST /-_-api/v1/favoriteOrganizations/:organizationId controllers.api.UserApi.toggleFoveriteOrganization(organizationId:String)
GET /-_-api/v1/users controllers.UserApp.users(query: String ?= "")
POST /-_-api/v1/users controllers.api.UserApi.newUser()
POST /-_-api/v1/user/defultLoginPage controllers.UserApp.setDefaultLoginPage()


Expand Down

0 comments on commit f4bea70

Please sign in to comment.