Skip to content

Commit

Permalink
api: Update project export APIs - issue
Browse files Browse the repository at this point in the history
  • Loading branch information
doortts committed Jun 27, 2017
1 parent fbfbc4e commit 73eb039
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 3 deletions.
15 changes: 14 additions & 1 deletion app/controllers/AttachmentApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,19 @@ public class AttachmentApp extends Controller {
public static final long TEMPORARYFILES_KEEPUP_TIME_MILLIS = Configuration.root()
.getMilliseconds("application.temporaryfiles.keep-up.time", 24 * 60 * 60 * 1000L);

private static User findUploader(Map<String,String[]> formUrlEncoded) {
if(formUrlEncoded == null) {
return UserApp.currentUser();
}
String authorEmail = HttpUtil.getFirstValueFromQuery(formUrlEncoded, "authorEmail");
User found = User.findByEmail(authorEmail);
if(found.isAnonymous()){
String authorLoginId = HttpUtil.getFirstValueFromQuery(formUrlEncoded, "authorLoginId");
return User.findByLoginId(authorLoginId);
}
return found;
}

public static Result uploadFile() throws NoSuchAlgorithmException, IOException {
// Get the file from request.
FilePart filePart =
Expand All @@ -47,7 +60,7 @@ public static Result uploadFile() throws NoSuchAlgorithmException, IOException {
}
File file = filePart.getFile();

User uploader = UserApp.currentUser();
User uploader = findUploader(request().body().asMultipartFormData().asFormUrlEncoded());
if (uploader.isAnonymous()) {
uploader = User.findByUserToken(request().getHeader("Yona-Token"));
}
Expand Down
119 changes: 119 additions & 0 deletions app/controllers/api/IssueApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/**
* Yona, Project Hosting SW
*
* Copyright 2016 the original author or authors.
*/

package controllers.api;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import controllers.AbstractPostingApp;
import controllers.UserApp;
import controllers.annotation.IsAllowed;
import controllers.annotation.IsCreatable;
import models.*;
import models.enumeration.Operation;
import models.enumeration.ResourceType;
import org.joda.time.DateTime;
import play.db.ebean.Transactional;
import play.libs.Json;
import play.mvc.Result;
import utils.JodaDateUtil;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import static play.libs.Json.toJson;

public class IssueApi extends AbstractPostingApp {

@Transactional
public static Result updateIssueLabel(String owner, String projectName, Long number) {
JsonNode json = request().body().asJson();
if(json == null) {
return badRequest("Expecting Json data");
}
Project project = Project.findByOwnerAndProjectName(owner, projectName);
Issue issue = Issue.findByNumber(project, number);
Set<IssueLabel> labels = new HashSet<>();

for(JsonNode node: json){
Long labelId = Long.parseLong(node.asText());
labels.add(IssueLabel.finder.byId(labelId));
}

issue.labels = labels;
issue.save();

ObjectNode result = Json.newObject();
result.put("id", project.owner);
result.put("labels", toJson(issue.labels.size()));
return ok(result);
}

@IsAllowed(value = Operation.READ, resourceType = ResourceType.BOARD_POST)
public static Result getIssue(String owner, String projectName, Long number) {
Project project = Project.findByOwnerAndProjectName(owner, projectName);
Issue issue = Issue.findByNumber(project, number);
JsonNode json = ProjectApi.getResult(issue);
return ok(json);
}

@Transactional
@IsCreatable(ResourceType.BOARD_POST)
public static Result newIssueByJson(String owner, String projectName) {
ObjectNode result = Json.newObject();
System.out.println("-----------" + request().body().asJson().textValue());
JsonNode json = request().body().asJson();
if(json == null) {
return badRequest("Expecting Json data");
}

Project project = Project.findByOwnerAndProjectName(owner, projectName);

JsonNode files = json.findValue("temporaryUploadFiles");

final Issue issue = new Issue();

issue.createdDate = getCreatedDate(json.findValue("createdAt").asLong());
issue.updatedDate = getCreatedDate(json.findValue("updatedAt").asLong());
User user = findAuthor(json.findValue("author"));
issue.setAuthor(user);
issue.project = project;
issue.title = json.findValue("title").asText();
issue.body = json.findValue("body").asText();
if(json.findValue("number") != null && json.findValue("number").asLong() > 0){
issue.saveWithNumber(json.findValue("number").asLong());
} else {
issue.save();
}
attachUploadFilesToPost(files, issue.asResource());

return ok(result);
}

private static User findAuthor(JsonNode authorNode){
if (authorNode != null) {
String email = authorNode.findValue("email").asText();
User originalAuthor = User.findByEmail(email);
if (originalAuthor != null) {
return originalAuthor;
}
}

User user = User.findUserIfTokenExist(UserApp.currentUser());
if (user.isAnonymous()) {
play.Logger.error("Import error caused by unknown user import!");
}
return user;
}

private static Date getCreatedDate(long timestamp){
if(timestamp == 0){
return JodaDateUtil.now();
}
return new DateTime(timestamp).toDate();
}
}
6 changes: 4 additions & 2 deletions app/controllers/api/ProjectApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,15 @@ private static <T> JsonNode composePosts(Project project, Model.Finder<Long, T>
return toJson(result);
}

private static ObjectNode getResult(AbstractPosting posting) {
public static ObjectNode getResult(AbstractPosting posting) {
ObjectNode json = Json.newObject();
json.put("number", posting.getNumber());
json.put("id", posting.id);
json.put("title", posting.title);
json.put("type", posting.asResource().getType().toString());
json.put("author", composeAuthorJson(posting.getAuthor()));
json.put("createdAt", posting.createdDate.getTime());
json.put("updatedAt", posting.updatedDate.getTime());
json.put("body", posting.body);

if(posting.asResource().getType() == ResourceType.ISSUE_POST){
Expand Down Expand Up @@ -104,12 +105,13 @@ private static JsonNode composeAuthorJson(User user) {
ObjectNode authorNode = Json.newObject();
authorNode.put("loginId", user.loginId);
authorNode.put("name", user.name);
authorNode.put("email", user.email);
return authorNode;
}

// It may be looks like weired. But it is intended for future
// which may introduce multiple assignees feature
private static JsonNode composeAssigneeJson(Issue issue) {
public static JsonNode composeAssigneeJson(Issue issue) {
List<ObjectNode> assignees = new ArrayList<>();
Assignee assignee = issue.assignee;

Expand Down
2 changes: 2 additions & 0 deletions conf/routes
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ GET /-_-api/v1/owners/:owner/projects/:projectName/exports
GET /-_-api/v1/owners/:owner/projects/:projectName/posts/$number<[0-9]+>/watchers controllers.api.WatcherApi.getWatchers(owner:String, projectName:String, number:Long)
POST /-_-api/v1/owners/:owner/projects/:projectName/posts controllers.api.BoardApi.newPostByJson(owner:String, projectName:String)
POST /-_-api/v1/owners/:owner/projects/:projectName/postlabel/:number controllers.api.BoardApi.updatePostLabel(owner:String, projectName:String, number:Long)
POST /-_-api/v1/owners/:owner/projects/:projectName/issues controllers.api.IssueApi.newIssueByJson(owner:String, projectName:String)
POST /-_-api/v1/owners/:owner/projects/:projectName/issuelabel/:number controllers.api.IssueApi.updateIssueLabel(owner:String, projectName:String, number:Long)
GET /-_-api/v1/hello controllers.api.GlobalApi.hello()
GET /-_-api/v1/favoriteProjects controllers.api.UserApi.getFoveriteProjects
POST /-_-api/v1/favoriteProjects/:projectId controllers.api.UserApi.toggleFoveriteProject(projectId:String)
Expand Down

0 comments on commit 73eb039

Please sign in to comment.