Example #1
0
  /**
   * {@code posting}에 {@code original} 정보를 채우고 갱신한다.
   *
   * <p>when: 게시물이나 이슈를 수정할 떄 사용한다.
   *
   * @param original
   * @param posting
   * @param postingForm
   * @param redirectTo
   * @param updatePosting
   * @return
   */
  protected static Result editPosting(
      AbstractPosting original,
      AbstractPosting posting,
      Form<? extends AbstractPosting> postingForm,
      Call redirectTo,
      Callback updatePosting) {
    if (postingForm.hasErrors()) {
      return badRequest(postingForm.errors().toString());
    }

    if (!AccessControl.isAllowed(UserApp.currentUser(), original.asResource(), Operation.UPDATE)) {
      return forbidden(views.html.error.forbidden.render(original.project));
    }

    posting.id = original.id;
    posting.createdDate = original.createdDate;
    posting.authorId = original.authorId;
    posting.authorLoginId = original.authorLoginId;
    posting.authorName = original.authorName;
    posting.project = original.project;
    updatePosting.run();
    posting.update();

    // Attach the files in the current user's temporary storage.
    Attachment.moveAll(UserApp.currentUser().asResource(), original.asResource());

    return redirect(redirectTo);
  }
Example #2
0
 /**
  * 현재 사용자가 특정 프로젝트에서 탈퇴
  *
  * @param userName 프로젝트 매니저의 로그인ID
  * @param projectName 프로젝트 이름
  * @return
  */
 @Transactional
 public static Result leave(String userName, String projectName) {
   ProjectApp.deleteMember(userName, projectName, UserApp.currentUser().id);
   return redirect(
       routes.UserApp.userInfo(
           UserApp.currentUser().loginId, DEFAULT_GROUP, DAYS_AGO, DEFAULT_SELECTED_TAB));
 }
Example #3
0
 /**
  * 사용자 정보 수정 폼으로 이동 현재 로그인된 사용자 기준
  *
  * @return
  */
 @With(AnonymousCheckAction.class)
 public static Result editUserInfoForm() {
   User user = UserApp.currentUser();
   Form<User> userForm = new Form<>(User.class);
   userForm = userForm.fill(user);
   return ok(edit.render(userForm, user));
 }
Example #4
0
  /**
   * 사용자 가입 화면 이동
   *
   * @return
   */
  public static Result signupForm() {
    if (!UserApp.currentUser().isAnonymous()) {
      return redirect(routes.Application.index());
    }

    return ok(signup.render("title.signup", form(User.class)));
  }
Example #5
0
  /**
   * 새 게시물 또는 이슈 생성 권한이 있는지 확인하고 {@code content}를 보여준다.
   *
   * <p>when: 게시물이나 이슈 생성할 때 사용한다.
   *
   * @param project
   * @param resourceType
   * @param content
   * @return
   */
  public static Result newPostingForm(Project project, ResourceType resourceType, Content content) {
    if (!AccessControl.isProjectResourceCreatable(UserApp.currentUser(), project, resourceType)) {
      return forbidden(views.html.error.forbidden.render(project));
    }

    return ok(content);
  }
Example #6
0
  /**
   * {@code target}을 삭제하고 {@code redirectTo}로 이동한다.
   *
   * <p>when: 게시물이나 이슈 또는 그곳에 달린 댓글을 삭제할 때 사용한다.
   *
   * @param target
   * @param resource
   * @param redirectTo
   * @return
   */
  protected static Result delete(Model target, Resource resource, Call redirectTo) {
    if (!AccessControl.isAllowed(UserApp.currentUser(), resource, Operation.DELETE)) {
      return forbidden();
    }

    target.delete();

    return redirect(redirectTo);
  }
Example #7
0
  /**
   * 새 댓글 저장 핸들러
   *
   * <p>{@code commentForm}에서 입력값을 꺼내 현재 사용자를 작성자로 설정하고 댓글을 저장한다. 현재 사용자 임시 저장소에 있는 첨부파일을 댓글의 첨부파일로
   * 옮긴다.
   *
   * @param comment
   * @param commentForm
   * @param redirectTo
   * @param containerUpdater
   * @return
   * @throws IOException
   */
  public static Result newComment(
      Comment comment,
      Form<? extends Comment> commentForm,
      Call redirectTo,
      Callback containerUpdater)
      throws IOException {
    if (commentForm.hasErrors()) {
      flash(Constants.WARNING, "board.comment.empty");
      return redirect(redirectTo);
    }

    comment.setAuthor(UserApp.currentUser());
    containerUpdater.run(); // this updates comment.issue or comment.posting;
    comment.save();

    // Attach all of the files in the current user's temporary storage.
    Attachment.moveAll(UserApp.currentUser().asResource(), comment.asResource());

    return redirect(redirectTo);
  }
Example #8
0
  /**
   * 로그인 폼으로 이동
   *
   * @return
   */
  public static Result loginForm() {
    if (!UserApp.currentUser().isAnonymous()) {
      return redirect(routes.Application.index());
    }

    String redirectUrl = request().getQueryString("redirectUrl");
    String loginFormUrl = routes.UserApp.loginForm().url();
    String referer = request().getHeader("Referer");
    if (StringUtils.isEmpty(redirectUrl) && !StringUtils.equals(loginFormUrl, referer)) {
      redirectUrl = request().getHeader("Referer");
    }
    return ok(login.render("title.login", form(User.class), redirectUrl));
  }
Example #9
0
  /**
   * 사용자 정보 수정
   *
   * @return
   */
  @With(AnonymousCheckAction.class)
  @Transactional
  public static Result editUserInfo() {
    Form<User> userForm = new Form<>(User.class).bindFromRequest("name", "email");
    String newEmail = userForm.data().get("email");
    String newName = userForm.data().get("name");
    User user = UserApp.currentUser();

    if (StringUtils.isEmpty(newEmail)) {
      userForm.reject("email", "user.wrongEmail.alert");
    } else {
      if (!StringUtils.equals(user.email, newEmail) && User.isEmailExist(newEmail)) {
        userForm.reject("email", "user.email.duplicate");
      }
    }

    if (userForm.error("email") != null) {
      flash(Constants.WARNING, userForm.error("email").message());
      return badRequest(edit.render(userForm, user));
    }
    user.email = newEmail;
    user.name = newName;

    try {
      Long avatarId = Long.valueOf(userForm.data().get("avatarId"));
      if (avatarId != null) {
        Attachment attachment = Attachment.find.byId(avatarId);
        String primary = attachment.mimeType.split("/")[0].toLowerCase();

        if (attachment.size > AVATAR_FILE_LIMIT_SIZE) {
          userForm.reject("avatarId", "user.avatar.fileSizeAlert");
        }

        if (primary.equals("image")) {
          Attachment.deleteAll(currentUser().avatarAsResource());
          attachment.moveTo(currentUser().avatarAsResource());
        }
      }
    } catch (NumberFormatException ignored) {
    }

    Email.deleteOtherInvalidEmails(user.email);
    user.update();
    return redirect(
        routes.UserApp.userInfo(user.loginId, DEFAULT_GROUP, DAYS_AGO, DEFAULT_SELECTED_TAB));
  }
Example #10
0
 private static void collectDatum(
     List<Project> projects,
     List<Posting> postings,
     List<Issue> issues,
     List<PullRequest> pullRequests,
     List<Milestone> milestones,
     int daysAgo) {
   // collect all postings, issues, pullrequests and milesotnes that are contained in the projects.
   for (Project project : projects) {
     if (AccessControl.isAllowed(UserApp.currentUser(), project.asResource(), Operation.READ)) {
       postings.addAll(Posting.findRecentlyCreatedByDaysAgo(project, daysAgo));
       issues.addAll(Issue.findRecentlyOpendIssuesByDaysAgo(project, daysAgo));
       pullRequests.addAll(PullRequest.findOpendPullRequestsByDaysAgo(project, daysAgo));
       milestones.addAll(Milestone.findOpenMilestones(project.id));
     }
   }
 }
Example #11
0
  /**
   * 현재 사용자가 선호하는 언어를 갱신한다.
   *
   * <p>쿠키나 Accept-Language HTTP 헤더에 선호하는 언어가 설정되어 있는 경우, 그것을 현재 로그인한 사용자가 선호하는 언어로 설정한다.
   */
  public static void updatePreferredLanguage() {
    Http.Request request = Http.Context.current().request();
    User user = UserApp.currentUser();

    if (user.isAnonymous()) {
      return;
    }

    if (request.acceptLanguages().isEmpty() && request.cookie(Play.langCookieName()) == null) {
      return;
    }

    String code = StringUtils.left(Http.Context.current().lang().code(), 255);

    if (!code.equals(user.lang)) {
      user.lang = code;
      user.update();
    }
  }
Example #12
0
  /**
   * 대량의 메일목록을 JSON으로 반환한다.
   *
   * <p>when 사이트 관리자페이지의 대량 메일 발송시 사용
   *
   * <p>{@code currentUser} 가 사이트관리자가 아니면 경고메세지와 함께 fobidden을 반환한다. 요청 content-type이
   * application/json이 아니면 {@link Http.Status#NOT_ACCEPTABLE} 을 반환한다. {@code projects}가 null 이면 비어있는
   * json객체를 반환한다. 모두에게 보내기 요청시에는 모든 사용자 목록을 json으로 반환한다. 대상이 특정 프로젝트 멤버일시에는 해당 프로젝트의 멤버를 json으로
   * 반환한다.
   *
   * @return the result
   */
  public static Result mailList() {
    Set<String> emails = new HashSet<>();
    Map<String, String[]> projects = request().body().asFormUrlEncoded();
    if (!UserApp.currentUser().isSiteManager()) {
      return forbidden(ErrorViews.Forbidden.render("error.auth.unauthorized.waringMessage"));
    }

    if (!request().accepts("application/json")) {
      return status(Http.Status.NOT_ACCEPTABLE);
    }

    if (projects == null) {
      return ok(toJson(new HashSet<String>()));
    }

    if (projects.containsKey("all")) {
      if (projects.get("all")[0].equals("true")) {
        for (User user : User.find.findList()) {
          emails.add(user.email);
        }
      }
    } else {
      for (String[] projectNames : projects.values()) {
        String projectName = projectNames[0];
        String[] parts = projectName.split("/");
        String owner = parts[0];
        String name = parts[1];
        Project project = Project.findByOwnerAndProjectName(owner, name);
        for (ProjectUser projectUser : ProjectUser.findMemberListByProject(project.id)) {
          Logger.debug(projectUser.user.email);
          emails.add(projectUser.user.email);
        }
      }
    }

    return ok(toJson(emails));
  }