/** * {@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); }
/** * 현재 사용자가 특정 프로젝트에서 탈퇴 * * @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)); }
/** * 사용자 정보 수정 폼으로 이동 현재 로그인된 사용자 기준 * * @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)); }
/** * 사용자 가입 화면 이동 * * @return */ public static Result signupForm() { if (!UserApp.currentUser().isAnonymous()) { return redirect(routes.Application.index()); } return ok(signup.render("title.signup", form(User.class))); }
/** * 새 게시물 또는 이슈 생성 권한이 있는지 확인하고 {@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); }
/** * {@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); }
/** * 새 댓글 저장 핸들러 * * <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); }
/** * 로그인 폼으로 이동 * * @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)); }
/** * 사용자 정보 수정 * * @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)); }
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)); } } }
/** * 현재 사용자가 선호하는 언어를 갱신한다. * * <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(); } }
/** * 대량의 메일목록을 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)); }