[Notice] Announcing the End of Demo Server [Read me]

javadoc: Delete comments written in Korean
Almost done but not perfect.
@3f3ba800ebc0ff0130df617a5b77c15562022297
--- app/Global.java
+++ app/Global.java
... | ... | @@ -159,11 +159,7 @@ |
159 | 159 |
Files.write(path, config.getBytes()); |
160 | 160 |
} |
161 | 161 |
|
162 |
- /* |
|
163 |
- * 사이트 관리자 입력 폼 유효성 체크 |
|
164 |
- */ |
|
165 | 162 |
private boolean hasError(Form<User> newUserForm) { |
166 |
- // loginId가 빈 값이 들어오면 안된다. |
|
167 | 163 |
if (StringUtils.isBlank(newUserForm.field("loginId").value())) { |
168 | 164 |
newUserForm.reject("loginId", "user.wrongloginId.alert"); |
169 | 165 |
} |
... | ... | @@ -172,22 +168,18 @@ |
172 | 168 |
newUserForm.reject("loginId", "user.wrongloginId.alert"); |
173 | 169 |
} |
174 | 170 |
|
175 |
- // password가 빈 값이 들어오면 안된다. |
|
176 | 171 |
if (StringUtils.isBlank(newUserForm.field("password").value())) { |
177 | 172 |
newUserForm.reject("password", "user.wrongPassword.alert"); |
178 | 173 |
} |
179 | 174 |
|
180 |
- // password와 retypedPassword가 일치해야 한다. |
|
181 | 175 |
if (!newUserForm.field("password").value().equals(newUserForm.field("retypedPassword").value())) { |
182 | 176 |
newUserForm.reject("retypedPassword", "user.confirmPassword.alert"); |
183 | 177 |
} |
184 | 178 |
|
185 |
- // email이 빈 값이 들어오면 안된다. |
|
186 | 179 |
if (StringUtils.isBlank(newUserForm.field("email").value())) { |
187 | 180 |
newUserForm.reject("email", "validation.invalidEmail"); |
188 | 181 |
} |
189 | 182 |
|
190 |
- // 중복된 email로 가입할 수 없다. |
|
191 | 183 |
if (User.isEmailExist(newUserForm.field("email").value())) { |
192 | 184 |
newUserForm.reject("email", "user.email.duplicate"); |
193 | 185 |
} |
--- app/actors/PullRequestActor.java
+++ app/actors/PullRequestActor.java
... | ... | @@ -26,17 +26,7 @@ |
26 | 26 |
import models.enumeration.State; |
27 | 27 |
|
28 | 28 |
public abstract class PullRequestActor extends UntypedActor { |
29 |
- /** |
|
30 |
- * PullRequest 병합을 시도하고 병합결과를 저장한다. |
|
31 |
- * |
|
32 |
- * Diff커밋중 신규커밋이 있을경우 커밋이벤트를 등록한다. |
|
33 |
- * Diff커밋이 없을경우 PullRequest 상태를 병합으로 변경하고 알림과 이벤트를 등록한다. |
|
34 |
- * 병합결과가 충돌일 경우 알림과 이벤트를 등록한다. |
|
35 |
- * 병합결과가 충돌해결일 경우 알림과 이벤트를 등록한다. |
|
36 |
- * |
|
37 |
- * @param message |
|
38 |
- * @param pullRequest |
|
39 |
- */ |
|
29 |
+ |
|
40 | 30 |
protected void processPullRequestMerging(PullRequestEventMessage message, PullRequest pullRequest) { |
41 | 31 |
try { |
42 | 32 |
String oldMergeCommitId = pullRequest.mergedCommitIdTo; |
--- app/actors/PullRequestMergingActor.java
+++ app/actors/PullRequestMergingActor.java
... | ... | @@ -24,7 +24,6 @@ |
24 | 24 |
import models.PullRequestEventMessage; |
25 | 25 |
|
26 | 26 |
/** |
27 |
- * message로 전달된 pullRequest에 대해 병합을 시도하고 결과를 저장한다. |
|
28 | 27 |
* @author Wansoon Park |
29 | 28 |
* |
30 | 29 |
*/ |
--- app/actors/RelatedPullRequestMergingActor.java
+++ app/actors/RelatedPullRequestMergingActor.java
... | ... | @@ -25,9 +25,6 @@ |
25 | 25 |
import models.PullRequest; |
26 | 26 |
import models.PullRequestEventMessage; |
27 | 27 |
|
28 |
-/** |
|
29 |
- * 변경된 branch 와 관련있는 모든 pullRequest 에 대해 병합을 시도하고 결과를 저장한다. |
|
30 |
- */ |
|
31 | 28 |
public class RelatedPullRequestMergingActor extends PullRequestActor { |
32 | 29 |
@Override |
33 | 30 |
public void onReceive(Object object) { |
... | ... | @@ -44,10 +41,6 @@ |
44 | 41 |
|
45 | 42 |
} |
46 | 43 |
|
47 |
- /** |
|
48 |
- * project/branch와 연관된 보낸코드들의 상태를 병합중으로 수정한다. |
|
49 |
- * @param pullRequests |
|
50 |
- */ |
|
51 | 44 |
private void changeStateToMerging(List<PullRequest> pullRequests) { |
52 | 45 |
for (PullRequest pullRequest : pullRequests) { |
53 | 46 |
pullRequest.startMerge(); |
--- app/controllers/AbstractPostingApp.java
+++ app/controllers/AbstractPostingApp.java
... | ... | @@ -38,24 +38,15 @@ |
38 | 38 |
|
39 | 39 |
import java.io.IOException; |
40 | 40 |
|
41 |
-/** |
|
42 |
- * {@link BoardApp}과 {@link IssueApp}에서 공통으로 사용하는 기능을 담고 있는 컨트롤러 클래스 |
|
43 |
- */ |
|
44 | 41 |
public class AbstractPostingApp extends Controller { |
45 | 42 |
public static final int ITEMS_PER_PAGE = 15; |
46 | 43 |
|
47 |
- /** |
|
48 |
- * 검색 조건 |
|
49 |
- */ |
|
50 | 44 |
public static class SearchCondition { |
51 | 45 |
public String orderBy; |
52 | 46 |
public String orderDir; |
53 | 47 |
public String filter; |
54 | 48 |
public int pageNum; |
55 | 49 |
|
56 |
- /** |
|
57 |
- * 기본 검색 조건으로 id 역순이며 1페이지를 보여준다. |
|
58 |
- */ |
|
59 | 50 |
public SearchCondition() { |
60 | 51 |
this.orderDir = Direction.DESC.direction(); |
61 | 52 |
this.orderBy = "id"; |
... | ... | @@ -64,20 +55,6 @@ |
64 | 55 |
} |
65 | 56 |
} |
66 | 57 |
|
67 |
- /** |
|
68 |
- * 새 댓글 저장 핸들러 |
|
69 |
- * |
|
70 |
- * {@code commentForm}에서 입력값을 꺼내 현재 사용자를 작성자로 설정하고 댓글을 저장한다. |
|
71 |
- * 현재 사용자 임시 저장소에 있는 첨부파일을 댓글의 첨부파일로 옮긴다. |
|
72 |
- * |
|
73 |
- * |
|
74 |
- * @param comment |
|
75 |
- * @param commentForm |
|
76 |
- * @param toView |
|
77 |
- * @param containerUpdater |
|
78 |
- * @return |
|
79 |
- * @throws IOException |
|
80 |
- */ |
|
81 | 58 |
public static Result saveComment(final Comment comment, Form<? extends Comment> commentForm, final Call toView, Runnable containerUpdater) { |
82 | 59 |
if (commentForm.hasErrors()) { |
83 | 60 |
flash(Constants.WARNING, "post.comment.empty"); |
... | ... | @@ -102,16 +79,6 @@ |
102 | 79 |
} |
103 | 80 |
|
104 | 81 |
|
105 |
- /** |
|
106 |
- * {@code target}을 삭제하고 {@code redirectTo}로 이동한다. |
|
107 |
- * |
|
108 |
- * when: 게시물이나 이슈 또는 그곳에 달린 댓글을 삭제할 때 사용한다. |
|
109 |
- * |
|
110 |
- * @param target |
|
111 |
- * @param resource |
|
112 |
- * @param redirectTo |
|
113 |
- * @return |
|
114 |
- */ |
|
115 | 82 |
protected static Result delete(Model target, Resource resource, Call redirectTo) { |
116 | 83 |
if (!AccessControl.isAllowed(UserApp.currentUser(), resource, Operation.DELETE)) { |
117 | 84 |
return forbidden(ErrorViews.Forbidden.render("error.forbidden", resource.getProject())); |
... | ... | @@ -119,7 +86,6 @@ |
119 | 86 |
|
120 | 87 |
target.delete(); |
121 | 88 |
|
122 |
- // XHR 호출에 의한 경우라면 204 No Content 와 Location 헤더로 응답한다 |
|
123 | 89 |
if(HttpUtil.isRequestedWithXHR(request())){ |
124 | 90 |
response().setHeader("Location", redirectTo.url()); |
125 | 91 |
return status(204); |
... | ... | @@ -128,22 +94,6 @@ |
128 | 94 |
return redirect(redirectTo); |
129 | 95 |
} |
130 | 96 |
|
131 |
- /** |
|
132 |
- * {@code posting}에 {@code original} 정보를 채우고 갱신한다. |
|
133 |
- * |
|
134 |
- * when: 게시물이나 이슈를 수정할 떄 사용한다. |
|
135 |
- * |
|
136 |
- * 게시물이나 이슈가 수정될 때 {@code noti} 객체가 null이 아니면 알림을 발송한다. |
|
137 |
- * |
|
138 |
- * |
|
139 |
- * |
|
140 |
- * @param original |
|
141 |
- * @param posting |
|
142 |
- * @param postingForm |
|
143 |
- * @param redirectTo |
|
144 |
- * @param preUpdateHook |
|
145 |
- * @return |
|
146 |
- */ |
|
147 | 97 |
protected static Result editPosting(AbstractPosting original, AbstractPosting posting, Form<? extends AbstractPosting> postingForm, Call redirectTo, Runnable preUpdateHook) { |
148 | 98 |
if (postingForm.hasErrors()) { |
149 | 99 |
return badRequest(ErrorViews.BadRequest.render("error.validation", original.project)); |
... | ... | @@ -176,16 +126,6 @@ |
176 | 126 |
return redirect(redirectTo); |
177 | 127 |
} |
178 | 128 |
|
179 |
- /** |
|
180 |
- * 특정 리소스(게시글이나 댓글)에 사용자가 이전 폼에서 업로드한 임시파일을 첨부시킨다 |
|
181 |
- * |
|
182 |
- * when: 이슈등록/수정, 게시판에 글 등록/수정, 댓글쓰기 등에서 업로드한 파일을 해당 리소스에 연결할 때 |
|
183 |
- * |
|
184 |
- * {code AttachmentApp.TAG_NAME_FOR_TEMPORARY_UPLOAD_FILES}에 지정된 이름의 input tag에 |
|
185 |
- * 업로드한 임시파일의 file id 값이 ,(comma) separator로 구분되어 들어가 있다. |
|
186 |
- * |
|
187 |
- * @param resource 이슈글,게시판글,댓글 |
|
188 |
- */ |
|
189 | 129 |
public static void attachUploadFilesToPost(Resource resource) { |
190 | 130 |
final String[] temporaryUploadFiles = getTemporaryFileListFromHiddenForm(); |
191 | 131 |
if(isTemporaryFilesExist(temporaryUploadFiles)){ |
--- app/controllers/AttachmentApp.java
+++ app/controllers/AttachmentApp.java
... | ... | @@ -49,30 +49,9 @@ |
49 | 49 |
public class AttachmentApp extends Controller { |
50 | 50 |
|
51 | 51 |
public static final String TAG_NAME_FOR_TEMPORARY_UPLOAD_FILES = "temporaryUploadFiles"; |
52 |
- //사용자 임시 첨부 파일의 서버내 보관시간. 임시파일은 글 작성시 파일은 업로드 한 파일 중 글 작성이 완료 되지 않은 상태의 파일을 말한다. |
|
53 | 52 |
public static final long TEMPORARYFILES_KEEPUP_TIME_MILLIS = Configuration.root() |
54 | 53 |
.getMilliseconds("application.temporaryfiles.keep-up.time", 24 * 60 * 60 * 1000L); |
55 | 54 |
|
56 |
- /** |
|
57 |
- * 사용자 첨부파일로 업로드한다 |
|
58 |
- * |
|
59 |
- * when 이슈나 글, 코멘트등에서 파일을 첨부하기 전에 먼저 업로드 |
|
60 |
- * |
|
61 |
- * 멀티파트 폼데이터로 파일 업로드 요청을 받아서 서버에 파일 저장을 시도하고 |
|
62 |
- * 만약 이미 같은 파일이 서버내에 globally 존재한다면 200OK로 응답 |
|
63 |
- * 존재하지 않는 파일이라면 201 created로 응답 |
|
64 |
- * |
|
65 |
- * 요청에 첨부파일이 없는 것으로 보일때는 400 Bad Request로 응답 |
|
66 |
- * 업로더가 익명 사용자일 경우에는 403 Forbidden 으로 응답 |
|
67 |
- * |
|
68 |
- * 업로드된 파일은 그 파일을 업로드한 사용자에게 첨부된 상태가 된다. 이후 |
|
69 |
- * {@link Attachment#moveAll(models.resource.Resource, models.resource.Resource)} 등의 메소드를 |
|
70 |
- * 사용해서 사용자의 첨부를 이슈 등의 다른 리소스로 옮길 수 있다. |
|
71 |
- * |
|
72 |
- * @return 생성된 파일의 메타데이터를 JSON 타입으로 반환하는 응답 |
|
73 |
- * @throws NoSuchAlgorithmException |
|
74 |
- * @throws IOException |
|
75 |
- */ |
|
76 | 55 |
public static Result uploadFile() throws NoSuchAlgorithmException, IOException { |
77 | 56 |
// Get the file from request. |
78 | 57 |
FilePart filePart = |
... | ... | @@ -135,18 +114,6 @@ |
135 | 114 |
} |
136 | 115 |
} |
137 | 116 |
|
138 |
- /** |
|
139 |
- * {@code id}로 파일을 찾아서 첨부파일로 돌려준다. |
|
140 |
- * |
|
141 |
- * when: 첨부파일을 다운로드 받을 때 |
|
142 |
- * |
|
143 |
- * 주의사항: 파일명이 깨지지 않도록 {@link utils.HttpUtil#encodeContentDisposition)}로 인코딩한다. |
|
144 |
- * |
|
145 |
- * @param id 첨부파일 id |
|
146 |
- * @return 파일이 첨부된 응답 |
|
147 |
- * @throws NoSuchAlgorithmException |
|
148 |
- * @throws IOException |
|
149 |
- */ |
|
150 | 117 |
public static Result getFile(Long id) throws IOException { |
151 | 118 |
Attachment attachment = Attachment.find.byId(id); |
152 | 119 |
String action = HttpUtil.getFirstValueFromQuery(request().queryString(), "action"); |
... | ... | @@ -179,22 +146,6 @@ |
179 | 146 |
return ok(file); |
180 | 147 |
} |
181 | 148 |
|
182 |
- /** |
|
183 |
- * {@code id}에 해당하는 첨부파일을 지운다. |
|
184 |
- * |
|
185 |
- * 게시물, 이슈, 댓글들의 첨부파일을 지울때 사용한다. |
|
186 |
- * |
|
187 |
- * 폼의 필드에 {@code _method}가 존재하고 값이 delete로 지정되어 있지 않으면 Bad Request로 응답한다. |
|
188 |
- * 파일을 못 찾으면 Not Found |
|
189 |
- * 삭제 권한이 없으면 Forbidden |
|
190 |
- * |
|
191 |
- * 첨부내용을 삭제한 후 해당 첨부의 origin 파일 유효검증 |
|
192 |
- * |
|
193 |
- * @param id 첨부파일 id |
|
194 |
- * @return attachment 삭제 결과 (하지만 해당 메시지를 쓰고 있지는 않다. 아까운 네크워크 자원..) |
|
195 |
- * @throws NoSuchAlgorithmException |
|
196 |
- * @throws IOException |
|
197 |
- */ |
|
198 | 149 |
public static Result deleteFile(Long id) { |
199 | 150 |
// _method must be 'delete' |
200 | 151 |
Map<String, String[]> data = |
... | ... | @@ -225,14 +176,6 @@ |
225 | 176 |
} |
226 | 177 |
} |
227 | 178 |
|
228 |
- /** |
|
229 |
- * origin file의 유효성을 검증하고, 유효하지 않다면 로그를 남긴다. |
|
230 |
- * |
|
231 |
- * origin file이 존재하지 않지만 그 파일을 참조하는 첨부가 존재하는 경우엔 에러 로그를 남긴다. |
|
232 |
- * origin file이 존재하지만 그 파일을 참조하는 첨부가 존재하지 않는 경우엔 경고 로그를 남긴다. |
|
233 |
- * |
|
234 |
- * @param hash origin file의 hash |
|
235 |
- */ |
|
236 | 179 |
private static void logIfOriginFileIsNotValid(String hash) { |
237 | 180 |
if (!Attachment.fileExists(hash) && Attachment.exists(hash)) { |
238 | 181 |
Logger.error("The origin file '" + hash + "' cannot be " + |
... | ... | @@ -247,12 +190,6 @@ |
247 | 190 |
} |
248 | 191 |
} |
249 | 192 |
|
250 |
- /** |
|
251 |
- * 첨부파일의 메타데이터를 가져온다. |
|
252 |
- * |
|
253 |
- * @param attach 첨부 |
|
254 |
- * @return 메타데이터를 맵으로 |
|
255 |
- */ |
|
256 | 193 |
private static Map<String, String> extractFileMetaDataFromAttachementAsMap(Attachment attach) { |
257 | 194 |
Map<String, String> metadata = new HashMap<>(); |
258 | 195 |
|
... | ... | @@ -265,19 +202,6 @@ |
265 | 202 |
return metadata; |
266 | 203 |
} |
267 | 204 |
|
268 |
- /** |
|
269 |
- * 파일의 목록을 가져온다. |
|
270 |
- * |
|
271 |
- * 이슈, 게시물, 댓글을 볼 때, 첨부된 파일들의 목록을 보여주기 위해 |
|
272 |
- * 이슈, 게시물, 댓글을 편집할 때, 첨부된 파일들의 목록 및 사용자 파일들의 목록을 보여주기 위해 |
|
273 |
- * |
|
274 |
- * 로그인한 사용자의 파일들의 목록을 {@code tempFiles} 프로퍼티로 넘겨준다. |
|
275 |
- * 첨부 파일들의 목록을 {@code attachments} 프로퍼티로 넘겨준다. |
|
276 |
- * 첨부 파일들 중 로그인한 사용자가 읽기 권한을 갖지 못한 것이 하나라도 있다면 403 Forbidden 으로 응답한다. |
|
277 |
- * |
|
278 |
- * @return json 포맷으로 된 파일 목록을 본문으로 하는 응답. 다음고 같은 형식이다. |
|
279 |
- * {@code {tempFiles: 사용자 파일 목록, attachments: 첨부 파일 목록 }} |
|
280 |
- */ |
|
281 | 205 |
public static Result getFileList() { |
282 | 206 |
Map<String, List<Map<String, String>>> files = |
283 | 207 |
new HashMap<>(); |
--- app/controllers/BoardApp.java
+++ app/controllers/BoardApp.java
... | ... | @@ -71,19 +71,6 @@ |
71 | 71 |
} |
72 | 72 |
} |
73 | 73 |
|
74 |
- /** |
|
75 |
- * 게시물 목록 조회 |
|
76 |
- * |
|
77 |
- * when: 특정 프로젝트의 게시물 목록을 검색 / 조회 할 때 사용 |
|
78 |
- * |
|
79 |
- * 접근 권한을 체크하고 접근 권한이 없다면 forbidden 처리한다. |
|
80 |
- * 검색 조건에 matching 되는 게시물 목록과 공지사항을 가져와서 표시한다. |
|
81 |
- * |
|
82 |
- * @param userName 프로젝트 소유자 |
|
83 |
- * @param projectName 프로젝트 이름 |
|
84 |
- * @param pageNum 페이지 번호 |
|
85 |
- * @return |
|
86 |
- */ |
|
87 | 74 |
@IsAllowed(value = Operation.READ, resourceType = ResourceType.PROJECT) |
88 | 75 |
public static Result posts(String userName, String projectName, int pageNum) { |
89 | 76 |
Project project = Project.findByOwnerAndProjectName(userName, projectName); |
... | ... | @@ -103,17 +90,6 @@ |
103 | 90 |
return ok(list.render("menu.board", project, posts, searchCondition, notices)); |
104 | 91 |
} |
105 | 92 |
|
106 |
- /** |
|
107 |
- * 게시물 등록 폼 |
|
108 |
- * |
|
109 |
- * when: 새로운 게시물을 작성할 때 사용 |
|
110 |
- * |
|
111 |
- * 공지작성 권한이 있다면 등록 폼에서 공지사항 여부 체크 박스를 활성화한다. |
|
112 |
- * |
|
113 |
- * @param userName 프로젝트 소유자 |
|
114 |
- * @param projectName 프로젝트 이름 |
|
115 |
- * @return |
|
116 |
- */ |
|
117 | 93 |
@With(AnonymousCheckAction.class) |
118 | 94 |
@IsCreatable(ResourceType.BOARD_POST) |
119 | 95 |
public static Result newPostForm(String userName, String projectName) { |
... | ... | @@ -125,17 +101,6 @@ |
125 | 101 |
return ok(create.render("post.new", new Form<>(Posting.class), project, isAllowedToNotice)); |
126 | 102 |
} |
127 | 103 |
|
128 |
- /** |
|
129 |
- * 게시물 등록 |
|
130 |
- * |
|
131 |
- * when: 게시물 작성 후 저장시 호출 |
|
132 |
- * |
|
133 |
- * 게시물 등록 권한을 확인하여, 권한이 없다면 forbidden 처리한다. |
|
134 |
- * |
|
135 |
- * @param userName 프로젝트 소유자 |
|
136 |
- * @param projectName 프로젝트 이름 |
|
137 |
- * @return |
|
138 |
- */ |
|
139 | 104 |
@Transactional |
140 | 105 |
@IsCreatable(ResourceType.BOARD_POST) |
141 | 106 |
public static Result newPost(String userName, String projectName) { |
... | ... | @@ -168,21 +133,6 @@ |
168 | 133 |
return redirect(routes.BoardApp.post(project.owner, project.name, post.getNumber())); |
169 | 134 |
} |
170 | 135 |
|
171 |
- /** |
|
172 |
- * 게시물 조회 |
|
173 |
- * |
|
174 |
- * when: 게시물 상세 조회시 호출 |
|
175 |
- * |
|
176 |
- * 접근 권한을 체크하고 접근 권한이 없다면 forbidden 처리한다. |
|
177 |
- * 게시물ID에 해당하는 내용이 없다면, 해당하는 게시물이 없음을 알린다. |
|
178 |
- * |
|
179 |
- * ACCEPT 헤더에 json이 있을 경우, POST 내용을 JSON으로 보낸다. |
|
180 |
- * |
|
181 |
- * @param userName 프로젝트 소유자 |
|
182 |
- * @param projectName 프로젝트 이름 |
|
183 |
- * @param number 게시물number |
|
184 |
- * @return |
|
185 |
- */ |
|
186 | 136 |
@IsAllowed(value = Operation.READ, resourceType = ResourceType.BOARD_POST) |
187 | 137 |
public static Result post(String userName, String projectName, Long number) { |
188 | 138 |
Project project = Project.findByOwnerAndProjectName(userName, projectName); |
... | ... | @@ -201,19 +151,6 @@ |
201 | 151 |
return ok(view.render(post, commentForm, project)); |
202 | 152 |
} |
203 | 153 |
|
204 |
- /** |
|
205 |
- * 게시물 수정 폼 |
|
206 |
- * |
|
207 |
- * when: 게시물 수정할때 호출 |
|
208 |
- * |
|
209 |
- * 수정 권한을 체크하고 접근 권한이 없다면 forbidden 처리한다. |
|
210 |
- * 공지작성 권한이 있다면 등록 폼에서 공지사항 여부 체크 박스를 활성화한다. |
|
211 |
- * |
|
212 |
- * @param owner 프로젝트 소유자 |
|
213 |
- * @param projectName 프로젝트 이름 |
|
214 |
- * @param number 게시물number |
|
215 |
- * @return |
|
216 |
- */ |
|
217 | 154 |
@With(NullProjectCheckAction.class) |
218 | 155 |
public static Result editPostForm(String owner, String projectName, Long number) { |
219 | 156 |
Project project = Project.findByOwnerAndProjectName(owner, projectName); |
... | ... | @@ -230,16 +167,6 @@ |
230 | 167 |
} |
231 | 168 |
|
232 | 169 |
/** |
233 |
- * 게시물 수정 |
|
234 |
- * |
|
235 |
- * when: 게시물 수정 후 저장시 호출 |
|
236 |
- * |
|
237 |
- * 수정된 내용을 반영하고 게시물 목록 첫 페이지로 돌아간다 |
|
238 |
- * |
|
239 |
- * @param userName 프로젝트 소유자 |
|
240 |
- * @param projectName 프로젝트 이름 |
|
241 |
- * @param number 게시물number |
|
242 |
- * @return |
|
243 | 170 |
* @see AbstractPostingApp#editPosting(models.AbstractPosting, models.AbstractPosting, play.data.Form |
244 | 171 |
*/ |
245 | 172 |
@Transactional |
... | ... | @@ -269,16 +196,6 @@ |
269 | 196 |
} |
270 | 197 |
|
271 | 198 |
/** |
272 |
- * 게시물 삭제 |
|
273 |
- * |
|
274 |
- * when: 게시물 삭제시 호출 |
|
275 |
- * |
|
276 |
- * 게시물을 삭제하고 게시물 목록 첫 페이지로 돌아간다 |
|
277 |
- * |
|
278 |
- * @param owner 프로젝트 소유자 |
|
279 |
- * @param projectName 프로젝트 이름 |
|
280 |
- * @param number 게시물number |
|
281 |
- * @return |
|
282 | 199 |
* @see controllers.AbstractPostingApp#delete(play.db.ebean.Model, models.resource.Resource, play.mvc.Call) |
283 | 200 |
*/ |
284 | 201 |
@Transactional |
... | ... | @@ -292,18 +209,6 @@ |
292 | 209 |
} |
293 | 210 |
|
294 | 211 |
/** |
295 |
- * 댓글 작성 |
|
296 |
- * |
|
297 |
- * when: 게시물에 댓글 작성 후 저장시 호출 |
|
298 |
- * |
|
299 |
- * validation check 하여 오류가 있다면 bad request |
|
300 |
- * 작성된 댓글을 저장하고 게시물 상세화면으로 돌아간다 |
|
301 |
- * |
|
302 |
- * @param owner 프로젝트 소유자 |
|
303 |
- * @param projectName 프로젝트 이름 |
|
304 |
- * @param number 게시물number |
|
305 |
- * @return |
|
306 |
- * @throws IOException |
|
307 | 212 |
* @see controllers.AbstractPostingApp#saveComment(models.Comment, play.data.Form, play.mvc.Call, Runnable) |
308 | 213 |
*/ |
309 | 214 |
@Transactional |
... | ... | @@ -344,17 +249,6 @@ |
344 | 249 |
}; |
345 | 250 |
} |
346 | 251 |
/** |
347 |
- * 댓글 삭제 |
|
348 |
- * |
|
349 |
- * when: 댓글 삭제시 호출 |
|
350 |
- * |
|
351 |
- * 댓글을 삭제하고 게시물 상세화면으로 돌아간다 |
|
352 |
- * |
|
353 |
- * @param userName 프로젝트 소유자 |
|
354 |
- * @param projectName 프로젝트 이름 |
|
355 |
- * @param number 게시물number |
|
356 |
- * @param commentId 댓글ID |
|
357 |
- * @return |
|
358 | 252 |
* @see controllers.AbstractPostingApp#delete(play.db.ebean.Model, models.resource.Resource, play.mvc.Call) |
359 | 253 |
*/ |
360 | 254 |
@Transactional |
--- app/controllers/BranchApp.java
+++ app/controllers/BranchApp.java
... | ... | @@ -43,15 +43,6 @@ |
43 | 43 |
@IsOnlyGitAvailable |
44 | 44 |
public class BranchApp extends Controller { |
45 | 45 |
|
46 |
- /** |
|
47 |
- * 저장소에 존재하는 브랜치 목록 표시 |
|
48 |
- * |
|
49 |
- * @param loginId |
|
50 |
- * @param projectName |
|
51 |
- * @return |
|
52 |
- * @throws IOException |
|
53 |
- * @throws GitAPIException |
|
54 |
- */ |
|
55 | 46 |
@IsAllowed(Operation.READ) |
56 | 47 |
public static Result branches(String loginId, String projectName) throws IOException, GitAPIException { |
57 | 48 |
Project project = Project.findByOwnerAndProjectName(loginId, projectName); |
... | ... | @@ -71,17 +62,6 @@ |
71 | 62 |
return ok(branches.render(project, allBranches, headBranch)); |
72 | 63 |
} |
73 | 64 |
|
74 |
- /** |
|
75 |
- * 지정한 브랜치를 삭제한다 |
|
76 |
- * 삭제한 뒤 브랜치 목록으로 돌아간 |
|
77 |
- * |
|
78 |
- * @param loginId |
|
79 |
- * @param projectName |
|
80 |
- * @param branchName |
|
81 |
- * @return |
|
82 |
- * @throws IOException |
|
83 |
- * @throws GitAPIException |
|
84 |
- */ |
|
85 | 65 |
@IsAllowed(Operation.DELETE) |
86 | 66 |
public static Result deleteBranch(String loginId, String projectName, String branchName) throws GitAPIException { |
87 | 67 |
Project project = Project.findByOwnerAndProjectName(loginId, projectName); |
... | ... | @@ -90,14 +70,6 @@ |
90 | 70 |
return redirect(routes.BranchApp.branches(loginId, projectName)); |
91 | 71 |
} |
92 | 72 |
|
93 |
- /** |
|
94 |
- * 지정한 브랜치를 기본 브랜치로 설정한다 |
|
95 |
- * |
|
96 |
- * @param loginId |
|
97 |
- * @param projectName |
|
98 |
- * @param branchName |
|
99 |
- * @return |
|
100 |
- */ |
|
101 | 73 |
@IsAllowed(Operation.UPDATE) |
102 | 74 |
public static Result setAsDefault(String loginId, String projectName, String branchName) throws IOException, GitAPIException { |
103 | 75 |
Project project = Project.findByOwnerAndProjectName(loginId, projectName); |
--- app/controllers/CodeApp.java
+++ app/controllers/CodeApp.java
... | ... | @@ -53,12 +53,6 @@ |
53 | 53 |
public class CodeApp extends Controller { |
54 | 54 |
public static String hostName; |
55 | 55 |
|
56 |
- /** |
|
57 |
- * 기본 코드 브라우저 표시 |
|
58 |
- * |
|
59 |
- * @param userName 프로젝트 소유자 이름 |
|
60 |
- * @param projectName 프로젝트 이름 |
|
61 |
- */ |
|
62 | 56 |
@IsAllowed(Operation.READ) |
63 | 57 |
public static Result codeBrowser(String userName, String projectName) |
64 | 58 |
throws IOException, UnsupportedOperationException, ServletException { |
... | ... | @@ -70,7 +64,6 @@ |
70 | 64 |
|
71 | 65 |
PlayRepository repository = RepositoryService.getRepository(project); |
72 | 66 |
|
73 |
- // GIT 저장소이면서 브랜치가 하나도 없는 경우 NOHEAD 안내문 표시 |
|
74 | 67 |
if(repository.isEmpty()) { |
75 | 68 |
switch (project.vcs) { |
76 | 69 |
case RepositoryService.VCS_GIT: |
... | ... | @@ -90,14 +83,6 @@ |
90 | 83 |
return redirect(routes.CodeApp.codeBrowserWithBranch(userName, projectName, defaultBranch, "")); |
91 | 84 |
} |
92 | 85 |
|
93 |
- /** |
|
94 |
- * 브랜치, 파일 경로를 인자로 받는 코드 브라우저 표시 |
|
95 |
- * |
|
96 |
- * @param userName 프로젝트 소유자 이름 |
|
97 |
- * @param projectName 프로젝트 이름 |
|
98 |
- * @param branch 브랜치 이름 |
|
99 |
- * @param path 파일 경로 |
|
100 |
- */ |
|
101 | 86 |
@With(DefaultProjectCheckAction.class) |
102 | 87 |
public static Result codeBrowserWithBranch(String userName, String projectName, String branch, String path) |
103 | 88 |
throws UnsupportedOperationException, IOException, SVNException, GitAPIException, ServletException { |
... | ... | @@ -117,7 +102,6 @@ |
117 | 102 |
List<ObjectNode> recursiveData = new ArrayList<>(); |
118 | 103 |
List<String> branches = repository.getBranches(); |
119 | 104 |
|
120 |
- /** 해당 경로가 폴더이고 최상위가 아니면, 최상위 경로부터 순서대로 정보를 추가한다 **/ |
|
121 | 105 |
if(fileInfo.get("type").getTextValue().equals("folder") && !path.equals("")){ |
122 | 106 |
recursiveData.addAll(RepositoryService.getMetaDataFromAncestorDirectories(repository, branch, path)); |
123 | 107 |
} |
... | ... | @@ -126,13 +110,6 @@ |
126 | 110 |
return ok(view.render(project, branches, recursiveData, branch, path)); |
127 | 111 |
} |
128 | 112 |
|
129 |
- /** |
|
130 |
- * AJAX 호출로 지정한 프로젝트 지정한 경로의 정보를 얻고자 할 때 사용된다 |
|
131 |
- * |
|
132 |
- * @param userName 프로젝트 소유자 이름 |
|
133 |
- * @param projectName 프로젝트 이름 |
|
134 |
- * @param path 파일 또는 폴더의 경로 |
|
135 |
- */ |
|
136 | 113 |
@With(DefaultProjectCheckAction.class) |
137 | 114 |
public static Result ajaxRequest(String userName, String projectName, String path) throws Exception{ |
138 | 115 |
PlayRepository repository = RepositoryService.getRepository(userName, projectName); |
... | ... | @@ -145,14 +122,6 @@ |
145 | 122 |
} |
146 | 123 |
} |
147 | 124 |
|
148 |
- /** |
|
149 |
- * AJAX 호출로 지정한 프로젝트의 특정 브랜치에서 지정한 경로의 정보를 얻고자 할 때 사용된다 |
|
150 |
- * |
|
151 |
- * @param userName 프로젝트 소유자 이름 |
|
152 |
- * @param projectName 프로젝트 이름 |
|
153 |
- * @param branch 브랜치 이름 |
|
154 |
- * @param path 파일 또는 폴더의 경로 |
|
155 |
- */ |
|
156 | 125 |
@With(DefaultProjectCheckAction.class) |
157 | 126 |
public static Result ajaxRequestWithBranch(String userName, String projectName, String branch, String path) |
158 | 127 |
throws UnsupportedOperationException, IOException, SVNException, GitAPIException, ServletException{ |
... | ... | @@ -167,14 +136,6 @@ |
167 | 136 |
} |
168 | 137 |
} |
169 | 138 |
|
170 |
- /** |
|
171 |
- * 지정한 프로젝트의 지정한 파일의 원본을 보여준다 |
|
172 |
- * |
|
173 |
- * @param userName |
|
174 |
- * @param projectName |
|
175 |
- * @param revision |
|
176 |
- * @param path |
|
177 |
- */ |
|
178 | 139 |
@With(DefaultProjectCheckAction.class) |
179 | 140 |
public static Result showRawFile(String userName, String projectName, String revision, String path) throws Exception{ |
180 | 141 |
byte[] fileAsRaw = RepositoryService.getFileAsRaw(userName, projectName, revision, path); |
... | ... | @@ -193,13 +154,6 @@ |
193 | 154 |
return ok(fileAsRaw).as(mediaTypeString); |
194 | 155 |
} |
195 | 156 |
|
196 |
- /** |
|
197 |
- * 지정판 프로젝트의 지정한 이미지 파일 원본을 보여준다 |
|
198 |
- * |
|
199 |
- * @param userName |
|
200 |
- * @param projectName |
|
201 |
- * @param path |
|
202 |
- */ |
|
203 | 157 |
@With(DefaultProjectCheckAction.class) |
204 | 158 |
public static Result showImageFile(String userName, String projectName, String revision, String path) throws Exception{ |
205 | 159 |
final byte[] fileAsRaw = RepositoryService.getFileAsRaw(userName, projectName, revision, path); |
... | ... | @@ -209,13 +163,6 @@ |
209 | 163 |
|
210 | 164 |
private static Tika tika = new Tika(); |
211 | 165 |
|
212 |
- /** |
|
213 |
- * 프로젝트의 저장소 URL을 반환하는 함수 |
|
214 |
- * 화면에 저장소 URL을 표시하기 위해 사용된다 |
|
215 |
- * |
|
216 |
- * @param ownerName |
|
217 |
- * @param projectName |
|
218 |
- */ |
|
219 | 166 |
public static String getURL(String ownerName, String projectName) { |
220 | 167 |
Project project = Project.findByOwnerAndProjectName(ownerName, projectName); |
221 | 168 |
return getURL(project); |
... | ... | @@ -233,13 +180,6 @@ |
233 | 180 |
} |
234 | 181 |
} |
235 | 182 |
|
236 |
- /** |
|
237 |
- * 현재 로그인 된 사용자 정보가 있으면 |
|
238 |
- * 프로젝트 저장소 URL에 사용자 ID를 포함해서 반환한다 |
|
239 |
- * 예: protocol://user@host.name/path |
|
240 |
- * |
|
241 |
- * @param project |
|
242 |
- */ |
|
243 | 183 |
public static String getURLWithLoginId(Project project) { |
244 | 184 |
String url = getURL(project); |
245 | 185 |
if(url != null) { |
... | ... | @@ -251,13 +191,6 @@ |
251 | 191 |
return url; |
252 | 192 |
} |
253 | 193 |
|
254 |
- /** |
|
255 |
- * 지정한 프로젝트의 지정한 파일을 연다. |
|
256 |
- * |
|
257 |
- * @param userName |
|
258 |
- * @param revision |
|
259 |
- * @param path |
|
260 |
- */ |
|
261 | 194 |
@IsAllowed(Operation.READ) |
262 | 195 |
public static Result openFile(String userName, String projectName, String revision, |
263 | 196 |
String path) throws Exception{ |
--- app/controllers/CodeHistoryApp.java
+++ app/controllers/CodeHistoryApp.java
... | ... | @@ -61,23 +61,6 @@ |
61 | 61 |
private static final int HISTORY_ITEM_LIMIT = 25; |
62 | 62 |
|
63 | 63 |
|
64 |
- /** |
|
65 |
- * 코드 저장소의 커밋 로그 목록 페이지에 대한 요청에 응답한다. |
|
66 |
- * |
|
67 |
- * when: 코드 메뉴의 커밋 탭을 클릭했을 때 |
|
68 |
- * |
|
69 |
- * {@code ownerName}과 {@code projectName}에 대응하는 프로젝트의 코드 저장소에서, HEAD 까지의 커밋 |
|
70 |
- * 목록에 대한 페이지로 응답한다. 브랜치는 선택하지 않은 것으로 간주한다. |
|
71 |
- * |
|
72 |
- * @param ownerName 프로젝트 소유자 |
|
73 |
- * @param projectName 프로젝트 이름 |
|
74 |
- * @return 커밋 로그 목록 HTML 페이지를 담은 응답 |
|
75 |
- * @throws IOException |
|
76 |
- * @throws UnsupportedOperationException |
|
77 |
- * @throws ServletException |
|
78 |
- * @throws GitAPIException |
|
79 |
- * @throws SVNException |
|
80 |
- */ |
|
81 | 64 |
@With(DefaultProjectCheckAction.class) |
82 | 65 |
public static Result historyUntilHead(String ownerName, String projectName) throws IOException, |
83 | 66 |
UnsupportedOperationException, ServletException, GitAPIException, |
... | ... | @@ -85,27 +68,6 @@ |
85 | 68 |
return history(ownerName, projectName, null, null); |
86 | 69 |
} |
87 | 70 |
|
88 |
- /** |
|
89 |
- * 코드 저장소의 특정 {@code branch}에 대한 커밋 로그 목록 페이지에 대한 요청에 응답한다. |
|
90 |
- * |
|
91 |
- * when: 코드 메뉴의 커밋 탭에서 특정 브랜치를 선택했을 때 |
|
92 |
- * |
|
93 |
- * {@code ownerName}과 {@code projectName}에 대응하는 프로젝트의 코드 저장소에서, 지정한 |
|
94 |
- * {@code branch}의 커밋 목록 중, 한 페이지의 크기를 {@link #HISTORY_ITEM_LIMIT}로 했을 때 |
|
95 |
- * {@code page}(요청의 쿼리에서 얻음)번째 페이지를 응답 메시지에 담아 반환한다. |
|
96 |
- * |
|
97 |
- * 만약 HEAD가 존재하지 않는 경우에는, 저장소를 만들어야 한다는 안내 페이지로 응답한다. |
|
98 |
- * |
|
99 |
- * @param ownerName 프로젝트 소유자 |
|
100 |
- * @param projectName 프로젝트 이름 |
|
101 |
- * @param branch 선택한 브랜치 |
|
102 |
- * @return 커밋 로그 목록 HTML 페이지를 담은 응답 |
|
103 |
- * @throws IOException |
|
104 |
- * @throws UnsupportedOperationException |
|
105 |
- * @throws ServletException |
|
106 |
- * @throws GitAPIException |
|
107 |
- * @throws SVNException |
|
108 |
- */ |
|
109 | 71 |
@IsAllowed(Operation.READ) |
110 | 72 |
public static Result history(String ownerName, String projectName, String branch, String path) throws IOException, |
111 | 73 |
UnsupportedOperationException, ServletException, GitAPIException, |
... | ... | @@ -132,24 +94,6 @@ |
132 | 94 |
} |
133 | 95 |
} |
134 | 96 |
|
135 |
- /** |
|
136 |
- * 코드 저장소의 특정 커밋을 보여달라는 요청에 응답한다. |
|
137 |
- * |
|
138 |
- * when: 코드 메뉴의 커밋 탭에서, 커밋의 목록 중 특정 커밋을 클릭했을 때 |
|
139 |
- * |
|
140 |
- * {@code ownerName}과 {@code projectName}에 대응하는 프로젝트의 코드 저장소에서, 지정한 |
|
141 |
- * {@code commitId}에 해당하는 커밋과 그 부모 커밋과의 차이를 HTML 페이지로 렌더링하여 응답한다. |
|
142 |
- * |
|
143 |
- * @param ownerName 프로젝트 소유자 |
|
144 |
- * @param projectName 프로젝트 이름 |
|
145 |
- * @param commitId 커밋 아이디 |
|
146 |
- * @return 특정 커밋을 보여주는 HTML 페이지를 담은 응답 |
|
147 |
- * @throws IOException |
|
148 |
- * @throws UnsupportedOperationException |
|
149 |
- * @throws ServletException |
|
150 |
- * @throws GitAPIException |
|
151 |
- * @throws SVNException |
|
152 |
- */ |
|
153 | 97 |
@IsAllowed(Operation.READ) |
154 | 98 |
public static Result show(String ownerName, String projectName, String commitId) |
155 | 99 |
throws IOException, UnsupportedOperationException, ServletException, GitAPIException, |
--- app/controllers/EnrollProjectApp.java
+++ app/controllers/EnrollProjectApp.java
... | ... | @@ -32,20 +32,9 @@ |
32 | 32 |
import play.mvc.Result; |
33 | 33 |
import play.mvc.With; |
34 | 34 |
|
35 |
-/** |
|
36 |
- * 프로젝트에 멤버로 등록해달라는 요청을 처리하는 컨트롤러 |
|
37 |
- */ |
|
38 | 35 |
@With(AnonymousCheckAction.class) |
39 | 36 |
public class EnrollProjectApp extends Controller { |
40 | 37 |
|
41 |
- /** |
|
42 |
- * {@code loginId}의 {@code proejctName}에 해당하는 프로젝트에 |
|
43 |
- * 멤버 등록 요청을 생성합니다. |
|
44 |
- * |
|
45 |
- * @param loginId |
|
46 |
- * @param projectName |
|
47 |
- * @return |
|
48 |
- */ |
|
49 | 38 |
@Transactional |
50 | 39 |
@With(DefaultProjectCheckAction.class) |
51 | 40 |
public static Result enroll(String loginId, String projectName) { |
... | ... | @@ -64,14 +53,6 @@ |
64 | 53 |
return ok(); |
65 | 54 |
} |
66 | 55 |
|
67 |
- /** |
|
68 |
- * {@code loginId}의 {@code proejctName}에 해당하는 프로젝트에 |
|
69 |
- * 멤버 등록 요청을 취소한다. |
|
70 |
- * |
|
71 |
- * @param loginId |
|
72 |
- * @param proejctName |
|
73 |
- * @return |
|
74 |
- */ |
|
75 | 56 |
@Transactional |
76 | 57 |
@With(DefaultProjectCheckAction.class) |
77 | 58 |
public static Result cancelEnroll(String loginId, String proejctName) { |
--- app/controllers/GitApp.java
+++ app/controllers/GitApp.java
... | ... | @@ -37,37 +37,11 @@ |
37 | 37 |
|
38 | 38 |
public class GitApp extends Controller { |
39 | 39 |
|
40 |
- /** |
|
41 |
- * 주어진 {@code service}가 지원되는지의 여부를 반환한다. |
|
42 |
- * |
|
43 |
- * when: Git 클라이언트가 Git 서버에 서비스 요청을 했을 때 |
|
44 |
- * |
|
45 |
- * "git-upload-pack"과 "git-receive-pack" 서비스만을 지원한다. |
|
46 |
- * |
|
47 |
- * @param service 지원되는지 물어볼 서비스 |
|
48 |
- * @return {@code service}가 지원되는지의 여부 |
|
49 |
- */ |
|
50 | 40 |
public static boolean isSupportedService(String service) { |
51 | 41 |
return service != null |
52 | 42 |
&& (service.equals("git-upload-pack") || service.equals("git-receive-pack")); |
53 | 43 |
} |
54 | 44 |
|
55 |
- /** |
|
56 |
- * {@code project}의 Git 저장소에 대해 현재 사용자가 {@code service}를 요청할 권한이 있는지의 여부를 |
|
57 |
- * 반환한다. |
|
58 |
- * |
|
59 |
- * when: Git 클라이언트가 Git 서버에 서비스 요청을 했을 때 |
|
60 |
- * |
|
61 |
- * "git-upload-pack" 서비스의 경우, 저장소에 읽기({@link Operation#READ}) 권한이 있는지, 그 외의 |
|
62 |
- * 서비스의 경우, 저장소에 갱신({@link Operation#UPDATE} 권한이 있는지 검사한다. |
|
63 |
- * |
|
64 |
- * @param project Git 저장소가 속한 프로젝트 |
|
65 |
- * @param service 수행할 권한이 있는지 물어볼 서비스 |
|
66 |
- * @return 권한이 있는지의 여부 |
|
67 |
- * @throws UnsupportedOperationException |
|
68 |
- * @throws IOException |
|
69 |
- * @throws ServletException |
|
70 |
- */ |
|
71 | 45 |
private static boolean isAllowed(Project project, String service) throws |
72 | 46 |
UnsupportedOperationException, IOException, ServletException { |
73 | 47 |
Operation operation = Operation.UPDATE; |
... | ... | @@ -81,23 +55,6 @@ |
81 | 55 |
|
82 | 56 |
} |
83 | 57 |
|
84 |
- /** |
|
85 |
- * Git 서버에 대한 {@code service} 요청을 처리한다. |
|
86 |
- * |
|
87 |
- * when: Git 클라이언트가 Git 서버에 서비스 요청을 했을 때 |
|
88 |
- * |
|
89 |
- * {@code ownerName}과 {@code projectName}에 대응하는 프로젝트의 코드 저장소에 대해, |
|
90 |
- * {@code service} 요청을 수행하고 그 결과를 응답으로 돌려준다. |
|
91 |
- * |
|
92 |
- * @param ownerName 프로젝트 소유자 이름 |
|
93 |
- * @param projectName 프로젝트 이름 |
|
94 |
- * @param service 요청하는 서비스 |
|
95 |
- * @param isAdvertise advertise에 대한 요청인지의 여부 |
|
96 |
- * @return 요청에 대한 응답 |
|
97 |
- * @throws IOException |
|
98 |
- * @throws UnsupportedOperationException |
|
99 |
- * @throws ServletException |
|
100 |
- */ |
|
101 | 58 |
public static Result service(String ownerName, String projectName, String service, |
102 | 59 |
boolean isAdvertise) throws IOException, UnsupportedOperationException, |
103 | 60 |
ServletException { |
... | ... | @@ -142,25 +99,6 @@ |
142 | 99 |
} |
143 | 100 |
} |
144 | 101 |
|
145 |
- /** |
|
146 |
- * Git 서버에 대한 advertise 요청을 처리한다. |
|
147 |
- * |
|
148 |
- * when: Git 클라이언트가 Git 서버에 advertise 요청을 했을 때 |
|
149 |
- * |
|
150 |
- * 요청을 처리하기 전에, {@link BasicAuthAction}으로 사용자를 인증한다. |
|
151 |
- * |
|
152 |
- * {@code service}가 주어지지 않은 경우에는 본래 getanyfile 서비스를 수행해야 하나, 현재 지원하지 |
|
153 |
- * 않으므로 403 Forbidden 으로 응답한다. 이는 Git의 {@code http-backend.c}가 동작하는 방식을 그대로 |
|
154 |
- * 따른 것이다. |
|
155 |
- * |
|
156 |
- * @param ownerName 프로젝트 소유자 이름 |
|
157 |
- * @param projectName 프로젝트 이름 |
|
158 |
- * @param service 요청하는 서비스 |
|
159 |
- * @return 요청에 대한 응답 |
|
160 |
- * @throws UnsupportedOperationException |
|
161 |
- * @throws IOException |
|
162 |
- * @throws ServletException |
|
163 |
- */ |
|
164 | 102 |
@With(BasicAuthAction.class) |
165 | 103 |
public static Result advertise(String ownerName, String projectName, String service) |
166 | 104 |
throws UnsupportedOperationException, IOException, ServletException { |
... | ... | @@ -172,23 +110,6 @@ |
172 | 110 |
return GitApp.service(ownerName, projectName, service, true); |
173 | 111 |
} |
174 | 112 |
|
175 |
- /** |
|
176 |
- * Git 서버에 대한 RPC 요청을 처리한다. |
|
177 |
- * |
|
178 |
- * when: Git 클라이언트가 Git 서버에 RPC 요청을 했을 때 |
|
179 |
- * |
|
180 |
- * RPC 요청시의 {@code service}는 "git-upload-pack"과 "git-receive-pack" 뿐이며, 이외의 경우는 없다. |
|
181 |
- * |
|
182 |
- * 요청을 처리하기 전에, {@link BasicAuthAction}으로 사용자를 인증한다. |
|
183 |
- * |
|
184 |
- * @param ownerName 프로젝트 소유자 이름 |
|
185 |
- * @param projectName 프로젝트 이름 |
|
186 |
- * @param service 요청하는 서비스 |
|
187 |
- * @return 요청에 대한 응답 |
|
188 |
- * @throws UnsupportedOperationException |
|
189 |
- * @throws IOException |
|
190 |
- * @throws ServletException |
|
191 |
- */ |
|
192 | 113 |
@With(BasicAuthAction.class) |
193 | 114 |
public static Result serviceRpc(String ownerName, String projectName, String service) |
194 | 115 |
throws UnsupportedOperationException, IOException, ServletException { |
--- app/controllers/ImportApp.java
+++ app/controllers/ImportApp.java
... | ... | @@ -52,23 +52,12 @@ |
52 | 52 |
|
53 | 53 |
public class ImportApp extends Controller { |
54 | 54 |
|
55 |
- /** |
|
56 |
- * Git repository에서 코드를 가져와서 프로젝트를 만드는 폼을 보여준다. |
|
57 |
- * |
|
58 |
- * @return |
|
59 |
- */ |
|
60 | 55 |
@With(AnonymousCheckAction.class) |
61 | 56 |
public static Result importForm() { |
62 | 57 |
List<OrganizationUser> orgUserList = OrganizationUser.findByAdmin(UserApp.currentUser().id); |
63 | 58 |
return ok(importing.render("title.newProject", form(Project.class), orgUserList)); |
64 | 59 |
} |
65 | 60 |
|
66 |
- /** |
|
67 |
- * 새 프로젝트 시작 폼에 추가로 Git 저장소 URL을 추가로 입력받고 |
|
68 |
- * 해당 저장소를 clone하여 프로젝트의 Git 저장소를 생성한다. |
|
69 |
- * |
|
70 |
- * @return |
|
71 |
- */ |
|
72 | 61 |
@Transactional |
73 | 62 |
public static Result newProject() throws GitAPIException, IOException { |
74 | 63 |
if( !AccessControl.isGlobalResourceCreatable(UserApp.currentUser()) ){ |
--- app/controllers/IssueApp.java
+++ app/controllers/IssueApp.java
... | ... | @@ -57,20 +57,6 @@ |
57 | 57 |
private static final String EXCEL_EXT = "xls"; |
58 | 58 |
private static final Integer ITEMS_PER_PAGE_MAX = 45; |
59 | 59 |
|
60 |
- /** |
|
61 |
- * 내 이슈 목록 조회 |
|
62 |
- * |
|
63 |
- * <p>when: 자신의 이슈만 검색하고 싶을때</p> |
|
64 |
- * |
|
65 |
- * 입력된 검색 조건이 있다면 적용하고 페이징 처리된 목록을 보여준다. |
|
66 |
- * |
|
67 |
- * @param state 이슈 상태 (해결 / 미해결) |
|
68 |
- * @param format 요청 형식 |
|
69 |
- * @param pageNum 페이지 번호 |
|
70 |
- * @return |
|
71 |
- * @throws WriteException |
|
72 |
- * @throws IOException |
|
73 |
- */ |
|
74 | 60 |
@With(AnonymousCheckAction.class) |
75 | 61 |
public static Result userIssues(String state, String format, int pageNum) throws WriteException, IOException { |
76 | 62 |
Project project = null; |
... | ... | @@ -111,24 +97,6 @@ |
111 | 97 |
return searchCondition.assigneeId == null && searchCondition.authorId == null && searchCondition.mentionId == null; |
112 | 98 |
} |
113 | 99 |
|
114 |
- /** |
|
115 |
- * 이슈 목록 조회 |
|
116 |
- * |
|
117 |
- * <p>when: 프로젝트의 이슈 목록 진입, 이슈 검색</p> |
|
118 |
- * |
|
119 |
- * 현재 사용자가 프로젝트에 권한이 없다면 Forbidden 으로 응답한다. |
|
120 |
- * 입력된 검색 조건이 있다면 적용하고 페이징 처리된 목록을 보여준다. |
|
121 |
- * 요청 형식({@code format})이 엑셀(xls)일 경우 목록을 엑셀로 다운로드한다. |
|
122 |
- * |
|
123 |
- * @param ownerName 프로젝트 소유자 이름 |
|
124 |
- * @param projectName 프로젝트 이름 |
|
125 |
- * @param state 이슈 상태 (해결 / 미해결) |
|
126 |
- * @param format 요청 형식 |
|
127 |
- * @param pageNum 페이지 번호 |
|
128 |
- * @return |
|
129 |
- * @throws WriteException |
|
130 |
- * @throws IOException |
|
131 |
- */ |
|
132 | 100 |
@IsAllowed(Operation.READ) |
133 | 101 |
public static Result issues(String ownerName, String projectName, String state, String format, int pageNum) throws WriteException, IOException { |
134 | 102 |
Project project = Project.findByOwnerAndProjectName(ownerName, projectName); |
... | ... | @@ -164,13 +132,6 @@ |
164 | 132 |
} |
165 | 133 |
} |
166 | 134 |
|
167 |
- /** |
|
168 |
- * 한 페이지에 표시할 항목의 갯수를 반환한다 |
|
169 |
- * GET 쿼리로 itemsPerPage 가 있으면 그것을 활용하고, |
|
170 |
- * 기본값은 ITEMS_PER_PAGE 상수를 사용한다 |
|
171 |
- * 최대값인 ITEMS_PER_PAGE_MAX 를 넘을수는 없다 |
|
172 |
- * @return |
|
173 |
- */ |
|
174 | 135 |
private static Integer getItemsPerPage(){ |
175 | 136 |
Integer itemsPerPage = ITEMS_PER_PAGE; |
176 | 137 |
String amountStr = request().getQueryString("itemsPerPage"); |
... | ... | @@ -184,15 +145,6 @@ |
184 | 145 |
return Math.min(itemsPerPage, ITEMS_PER_PAGE_MAX); |
185 | 146 |
} |
186 | 147 |
|
187 |
- /** |
|
188 |
- * 이슈 목록을 HTML 페이지로 반환 |
|
189 |
- * issues() 에서 기본값으로 호출된다 |
|
190 |
- * |
|
191 |
- * @param project 프로젝트 |
|
192 |
- * @param issues 이슈 목록 페이지 |
|
193 |
- * @param searchCondition 검색 조건 |
|
194 |
- * @return |
|
195 |
- */ |
|
196 | 148 |
private static Result issuesAsHTML(Project project, Page<Issue> issues, models.support.SearchCondition searchCondition){ |
197 | 149 |
if(project == null){ |
198 | 150 |
return ok(my_list.render("title.issueList", issues, searchCondition, project)); |
... | ... | @@ -202,16 +154,6 @@ |
202 | 154 |
|
203 | 155 |
} |
204 | 156 |
|
205 |
- /** |
|
206 |
- * 이슈 목록을 Microsoft Excel 형식으로 반환 |
|
207 |
- * issues() 에서 요청 형식({@code format})이 엑셀(xls)일 경우 호출된다 |
|
208 |
- * |
|
209 |
- * @param project 프로젝트 |
|
210 |
- * @param el |
|
211 |
- * @throws WriteException |
|
212 |
- * @throws IOException |
|
213 |
- * @return |
|
214 |
- */ |
|
215 | 157 |
private static Result issuesAsExcel(Project project, ExpressionList<Issue> el) throws WriteException, IOException { |
216 | 158 |
byte[] excelData = Issue.excelFrom(el.findList()); |
217 | 159 |
String filename = HttpUtil.encodeContentDisposition( |
... | ... | @@ -223,15 +165,6 @@ |
223 | 165 |
return ok(excelData); |
224 | 166 |
} |
225 | 167 |
|
226 |
- /** |
|
227 |
- * 이슈 목록을 PJAX 용으로 응답한다 |
|
228 |
- * issuesAsHTML()과 거의 같지만 캐시하지 않고 partial_search 로 렌더링한다는 점이 다르다 |
|
229 |
- * |
|
230 |
- * @param project |
|
231 |
- * @param issues |
|
232 |
- * @param searchCondition |
|
233 |
- * @return |
|
234 |
- */ |
|
235 | 168 |
private static Result issuesAsPjax(Project project, Page<Issue> issues, models.support.SearchCondition searchCondition) { |
236 | 169 |
response().setHeader("Cache-Control", "no-cache, no-store"); |
237 | 170 |
if (project == null) { |
... | ... | @@ -242,22 +175,9 @@ |
242 | 175 |
|
243 | 176 |
} |
244 | 177 |
|
245 |
- /** |
|
246 |
- * 이슈 목록을 정해진 갯수만큼 JSON으로 반환한다 |
|
247 |
- * QueryString 으로 목록에서 제외할 이슈ID (exceptId) 를 지정할 수 있고 |
|
248 |
- * 반환하는 갯수는 ITEMS_PER_PAGE |
|
249 |
- * |
|
250 |
- * 이슈 작성/수정시 비슷할 수 있는 이슈 표현을 위해 XHR 이슈 검색시 사용된다 |
|
251 |
- * |
|
252 |
- * @param project |
|
253 |
- * @param issues |
|
254 |
- * @return |
|
255 |
- */ |
|
256 | 178 |
private static Result issuesAsJson(Project project, Page<Issue> issues) { |
257 | 179 |
ObjectNode listData = Json.newObject(); |
258 | 180 |
|
259 |
- // 반환할 목록에서 제외할 이슈ID 를 exceptId 로 지정할 수 있다(QueryString) |
|
260 |
- // 이슈 수정시 '비슷할 수 있는 이슈' 목록에서 현재 수정중인 이슈를 제외하기 위해 사용한다 |
|
261 | 181 |
String exceptIdStr = request().getQueryString("exceptId"); |
262 | 182 |
Long exceptId = -1L; |
263 | 183 |
|
... | ... | @@ -269,7 +189,7 @@ |
269 | 189 |
} |
270 | 190 |
} |
271 | 191 |
|
272 |
- List<Issue> issueList = issues.getList(); // the list of entities for this page |
|
192 |
+ List<Issue> issueList = issues.getList(); |
|
273 | 193 |
|
274 | 194 |
for (Issue issue : issueList){ |
275 | 195 |
Long issueId = issue.getNumber(); |
... | ... | @@ -290,19 +210,6 @@ |
290 | 210 |
return ok(listData); |
291 | 211 |
} |
292 | 212 |
|
293 |
- /** |
|
294 |
- * 이슈 조회 |
|
295 |
- * |
|
296 |
- * <p>when: 단일 이슈의 상세내용 조회</p> |
|
297 |
- * |
|
298 |
- * 접근 권한이 없을 경우, Forbidden 으로 응답한다. |
|
299 |
- * 조회하려는 이슈가 존재하지 않을 경우엔 NotFound 로 응답한다. |
|
300 |
- * |
|
301 |
- * @param ownerName 프로젝트 소유자 이름 |
|
302 |
- * @param projectName 프로젝트 이름 |
|
303 |
- * @param number 이슈 번호 |
|
304 |
- * @return |
|
305 |
- */ |
|
306 | 213 |
@With(NullProjectCheckAction.class) |
307 | 214 |
public static Result issue(String ownerName, String projectName, Long number) { |
308 | 215 |
Project project = Project.findByOwnerAndProjectName(ownerName, projectName); |
... | ... | @@ -348,19 +255,6 @@ |
348 | 255 |
} |
349 | 256 |
} |
350 | 257 |
|
351 |
- /** |
|
352 |
- * 이슈 타임라인 조회 |
|
353 |
- * |
|
354 |
- * <p>when: 단일 이슈의 타임라인 조회</p> |
|
355 |
- * |
|
356 |
- * 접근 권한이 없을 경우, Forbidden 으로 응답한다. |
|
357 |
- * 조회하려는 이슈가 존재하지 않을 경우엔 NotFound 로 응답한다. |
|
358 |
- * |
|
359 |
- * @param ownerName 프로젝트 소유자 이름 |
|
360 |
- * @param projectName 프로젝트 이름 |
|
361 |
- * @param number 이슈 번호 |
|
362 |
- * @return |
|
363 |
- */ |
|
364 | 258 |
@IsAllowed(resourceType = ResourceType.ISSUE_POST, value = Operation.READ) |
365 | 259 |
public static Result timeline(String ownerName, String projectName, Long number) { |
366 | 260 |
Project project = Project.findByOwnerAndProjectName(ownerName, projectName); |
... | ... | @@ -373,15 +267,6 @@ |
373 | 267 |
return ok(partial_comments.render(project, issueInfo)); |
374 | 268 |
} |
375 | 269 |
|
376 |
- /** |
|
377 |
- * 새 이슈 등록 폼 |
|
378 |
- * |
|
379 |
- * <p>when: 새로운 이슈 작성</p> |
|
380 |
- * |
|
381 |
- * @param ownerName 프로젝트 소유자 이름 |
|
382 |
- * @param projectName 프로젝트 이름 |
|
383 |
- * @return |
|
384 |
- */ |
|
385 | 270 |
@With(AnonymousCheckAction.class) |
386 | 271 |
@IsCreatable(ResourceType.ISSUE_POST) |
387 | 272 |
public static Result newIssueForm(String ownerName, String projectName) { |
... | ... | @@ -389,21 +274,6 @@ |
389 | 274 |
return ok(create.render("title.newIssue", new Form<>(Issue.class), project)); |
390 | 275 |
} |
391 | 276 |
|
392 |
- /** |
|
393 |
- * 여러 이슈를 한번에 갱신하려는 요청에 응답한다. |
|
394 |
- * |
|
395 |
- * <p>when: 이슈 목록 페이지에서 이슈를 체크하고 상단의 갱신 드롭박스를 이용해 체크한 이슈들을 갱신할 때</p> |
|
396 |
- * |
|
397 |
- * 갱신을 시도한 이슈들 중 하나 이상 갱신에 성공했다면 이슈 목록 페이지로 리다이렉트한다. (303 See Other) |
|
398 |
- * 어떤 이슈에 대한 갱신 요청이든 모두 실패했으며, 그 중 권한 문제로 실패한 것이 한 개 이상 있다면 403 |
|
399 |
- * Forbidden 으로 응답한다. |
|
400 |
- * 갱신 요청이 잘못된 경우엔 400 Bad Request 로 응답한다. |
|
401 |
- * |
|
402 |
- * @param ownerName 프로젝트 소유자 이름 |
|
403 |
- * @param projectName 프로젝트 이름 |
|
404 |
- * @return |
|
405 |
- * @throws IOException |
|
406 |
- */ |
|
407 | 277 |
@Transactional |
408 | 278 |
@With(NullProjectCheckAction.class) |
409 | 279 |
public static Result massUpdate(String ownerName, String projectName) { |
... | ... | @@ -510,21 +380,6 @@ |
510 | 380 |
} |
511 | 381 |
} |
512 | 382 |
|
513 |
- /** |
|
514 |
- * 새 이슈 등록 |
|
515 |
- * |
|
516 |
- * <p>when: 새 이슈 등록 폼에서 저장</p> |
|
517 |
- * |
|
518 |
- * 이슈 생성 권한이 없다면 Forbidden 으로 응답한다. |
|
519 |
- * 입력 폼에 문제가 있다면 BadRequest 로 응답한다. |
|
520 |
- * 이슈 저장전에 임시적으로 사용자에게 첨부되었던 첨부파일들을 이슈 하위로 옮긴다, |
|
521 |
- * 저장 이후 목록 화면으로 돌아간다. |
|
522 |
- * |
|
523 |
- * @param ownerName 프로젝트 소유자 이름 |
|
524 |
- * @param projectName 프로젝트 이름 |
|
525 |
- * @return |
|
526 |
- * @throws IOException |
|
527 |
- */ |
|
528 | 383 |
@Transactional |
529 | 384 |
@IsCreatable(ResourceType.ISSUE_POST) |
530 | 385 |
public static Result newIssue(String ownerName, String projectName) { |
... | ... | @@ -576,18 +431,6 @@ |
576 | 431 |
return issue.assignee != null; |
577 | 432 |
} |
578 | 433 |
|
579 |
- /** |
|
580 |
- * 이슈 수정 폼 |
|
581 |
- * |
|
582 |
- * <p>when: 기존 이슈 수정</p> |
|
583 |
- * |
|
584 |
- * 이슈 수정 권한이 없을 경우 Forbidden 으로 응답한다. |
|
585 |
- * |
|
586 |
- * @param ownerName 프로젝트 소유자 이름 |
|
587 |
- * @param projectName 프로젝트 이름 |
|
588 |
- * @param number 이슈 번호 |
|
589 |
- * @return |
|
590 |
- */ |
|
591 | 434 |
@With(NullProjectCheckAction.class) |
592 | 435 |
public static Result editIssueForm(String ownerName, String projectName, Long number) { |
593 | 436 |
Project project = Project.findByOwnerAndProjectName(ownerName, projectName); |
... | ... | @@ -602,20 +445,6 @@ |
602 | 445 |
return ok(edit.render("title.editIssue", editForm, issue, project)); |
603 | 446 |
} |
604 | 447 |
|
605 |
- /** |
|
606 |
- * 이슈 상태 전이 |
|
607 |
- * |
|
608 |
- * <p>when: 특정 이슈를 다음 상태로 전이시킬 때</p> |
|
609 |
- * |
|
610 |
- * OPEN 된 이슈의 다음 상태는 CLOSED가 된다. |
|
611 |
- * 단, CLOSED 된 상태의 이슈를 다음 상태로 전이시키면 OPEN 상태가 된다. |
|
612 |
- * |
|
613 |
- * @param ownerName 프로젝트 소유자 이름 |
|
614 |
- * @param projectName 프로젝트 이름 |
|
615 |
- * @param number 이슈 번호 |
|
616 |
- * @return |
|
617 |
- * @throws IOException |
|
618 |
- */ |
|
619 | 448 |
@Transactional |
620 | 449 |
@IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.ISSUE_POST) |
621 | 450 |
public static Result nextState(String ownerName, String projectName, Long number) { |
... | ... | @@ -655,22 +484,6 @@ |
655 | 484 |
} |
656 | 485 |
} |
657 | 486 |
|
658 |
- /** |
|
659 |
- * 이슈 수정 |
|
660 |
- * |
|
661 |
- * <p>when: 이슈 수정 폼에서 저장</p> |
|
662 |
- * |
|
663 |
- * 폼에서 전달 받은 내용, 마일스톤, 라벨 정보와 |
|
664 |
- * 기존 이슈에 작성되어 있던 댓글 정보를 정리하여 저장한다. |
|
665 |
- * 저장후 목록 화면으로 돌아간다. |
|
666 |
- * |
|
667 |
- * @param ownerName 프로젝트 소유자 이름 |
|
668 |
- * @param projectName 프로젝트 이름 |
|
669 |
- * @param number 이슈 번호 |
|
670 |
- * @return |
|
671 |
- * @throws IOException |
|
672 |
- * @see {@link AbstractPostingApp#editPosting} |
|
673 |
- */ |
|
674 | 487 |
@With(NullProjectCheckAction.class) |
675 | 488 |
public static Result editIssue(String ownerName, String projectName, Long number) { |
676 | 489 |
Form<Issue> issueForm = new Form<>(Issue.class).bindFromRequest(); |
... | ... | @@ -710,9 +523,6 @@ |
710 | 523 |
return editPosting(originalIssue, issue, issueForm, redirectTo, preUpdateHook); |
711 | 524 |
} |
712 | 525 |
|
713 |
- /* |
|
714 |
- * form 에서 전달받은 마일스톤ID를 이용해서 이슈객체에 마일스톤 객체를 set한다 |
|
715 |
- */ |
|
716 | 526 |
private static void setMilestone(Form<Issue> issueForm, Issue issue) { |
717 | 527 |
String milestoneId = issueForm.data().get("milestoneId"); |
718 | 528 |
if(milestoneId != null && !milestoneId.isEmpty()) { |
... | ... | @@ -723,16 +533,6 @@ |
723 | 533 |
} |
724 | 534 |
|
725 | 535 |
/** |
726 |
- * 이슈 삭제 |
|
727 |
- * |
|
728 |
- * <p>when: 이슈 조회화면에서 삭제</p> |
|
729 |
- * |
|
730 |
- * 이슈 번호에 해당하는 이슈 삭제 후 이슈 목록 화면으로 돌아간다. |
|
731 |
- * |
|
732 |
- * @param ownerName 프로젝트 소유자 이름 |
|
733 |
- * @param projectName 프로젝트 이름 |
|
734 |
- * @param number 이슈 번호 |
|
735 |
- * @return |
|
736 | 536 |
* @ see {@link AbstractPostingApp#delete(play.db.ebean.Model, models.resource.Resource, Call)} |
737 | 537 |
*/ |
738 | 538 |
@Transactional |
... | ... | @@ -750,17 +550,6 @@ |
750 | 550 |
} |
751 | 551 |
|
752 | 552 |
/** |
753 |
- * 댓글 작성 |
|
754 |
- * |
|
755 |
- * <p>when: 이슈 조회화면에서 댓글 작성하고 저장</p> |
|
756 |
- * |
|
757 |
- * 현재 사용자를 댓글 작성자로 하여 저장하고 이슈 조회화면으로 돌아간다. |
|
758 |
- * |
|
759 |
- * @param ownerName 프로젝트 소유자 이름 |
|
760 |
- * @param projectName 프로젝트 이름 |
|
761 |
- * @param number 이슈 번호 |
|
762 |
- * @return |
|
763 |
- * @throws IOException |
|
764 | 553 |
* @see {@link AbstractPostingApp#newComment(models.Comment, play.data.Form} |
765 | 554 |
*/ |
766 | 555 |
@Transactional |
... | ... | @@ -840,18 +629,6 @@ |
840 | 629 |
|
841 | 630 |
|
842 | 631 |
/** |
843 |
- * 댓글 삭제 |
|
844 |
- * |
|
845 |
- * <p>when: 댓글 삭제 버튼</p> |
|
846 |
- * |
|
847 |
- * 댓글을 삭제하고 이슈 조회 화면으로 돌아간다. |
|
848 |
- * 삭제 권한이 없을 경우 Forbidden 으로 응답한다. |
|
849 |
- * |
|
850 |
- * @param ownerName 프로젝트 소유자 이름 |
|
851 |
- * @param projectName 프로젝트 이름 |
|
852 |
- * @param issueNumber 이슈 번호 |
|
853 |
- * @param commentId 댓글ID |
|
854 |
- * @return |
|
855 | 632 |
* @see {@link AbstractPostingApp#delete(play.db.ebean.Model, models.resource.Resource, Call)} |
856 | 633 |
*/ |
857 | 634 |
@Transactional |
... | ... | @@ -866,17 +643,6 @@ |
866 | 643 |
return delete(comment, comment.asResource(), redirectTo); |
867 | 644 |
} |
868 | 645 |
|
869 |
- /** |
|
870 |
- * 이슈 라벨 구성 |
|
871 |
- * |
|
872 |
- * <p>when: 새로 이슈를 작성하거나, 기존 이슈를 수정할때</p> |
|
873 |
- * |
|
874 |
- * {@code request} 에서 이슈 라벨 ID들을 추출하여 이에 대응하는 이슈라벨 정보들을 |
|
875 |
- * {@code labels} 에 저장한다. |
|
876 |
- * |
|
877 |
- * @param labels 이슈 라벨을 저장할 대상 |
|
878 |
- * @param request 요청 정보 (이슈라벨 ID를 추출하여 사용한다) |
|
879 |
- */ |
|
880 | 646 |
private static void addLabels(Issue issue, Http.Request request) { |
881 | 647 |
if (issue.labels == null) { |
882 | 648 |
issue.labels = new HashSet<>(); |
--- app/controllers/LabelApp.java
+++ app/controllers/LabelApp.java
... | ... | @@ -39,25 +39,7 @@ |
39 | 39 |
private static final int MAX_FETCH_LABELS = 1000; |
40 | 40 |
|
41 | 41 |
/** |
42 |
- * 태그 목록 요청에 대해 응답한다. |
|
43 |
- * |
|
44 |
- * when: 프로젝트 Overview 페이지에서 사용자가 태그를 추가하려고 할 때, 이름 자동완성을 위해 사용한다. |
|
45 |
- * |
|
46 |
- * 주어진 {@code query}로 태그를 검색하여, 그 목록을 json 형식으로 돌려준다. |
|
47 |
- * |
|
48 |
- * 돌려줄 태그 목록의 갯수가, {@link LabelApp#MAX_FETCH_LABELS}와 주어진 {@code limit}중에서 가장 작은 값보다 |
|
49 |
- * 크다면, 그 값에 의해 제한된다. 만약 제한이 되었다면, 응답의 @{code Content-Range}헤더로 어떻게 제한이 |
|
50 |
- * 되었는지에 대한 정보를 클라이언트에게 전달하게 된다. 예를 들어 10개 중에 8개만을 보내게 되었다면 |
|
51 |
- * @{code Content-Range: 8/10}이 된다. 자세한 것은 label-typeahead.md 문서의 "Content-Range 헤더" 문단을 |
|
52 |
- * 참조하라. |
|
53 |
- * |
|
54 |
- * 다음의 경우에는 {@code 406 Not Acceptable}로 응답한다. |
|
55 |
- * 클라이언트가 {@code application/json}을 받아들일 수 없는 경우. 태그 목록 요청에 대한 성공적인 응답에서, |
|
56 |
- * 엔터티 본문의 미디어 타입은 언제나 {@code application/json}이기 때문이다. |
|
57 |
- * |
|
58 |
- * @param query 태그에 대한 검색어 질의 |
|
59 |
- * @param limit 가져올 태그의 최대 갯수 |
|
60 |
- * @return 태그 목록 요청에 대한 응답 |
|
42 |
+ * @param category a group of label to search |
|
61 | 43 |
* @see <a href="https://github.com/nforge/yobi/blob/master/docs/technical/label-typeahead |
62 | 44 |
* .md>label-typeahead.md</a> |
63 | 45 |
*/ |
--- app/controllers/MilestoneApp.java
+++ app/controllers/MilestoneApp.java
... | ... | @@ -47,9 +47,6 @@ |
47 | 47 |
|
48 | 48 |
import static play.data.Form.form; |
49 | 49 |
|
50 |
-/** |
|
51 |
- * 마일스톤 관리 |
|
52 |
- */ |
|
53 | 50 |
public class MilestoneApp extends Controller { |
54 | 51 |
|
55 | 52 |
public static class MilestoneCondition { |
... | ... | @@ -65,15 +62,7 @@ |
65 | 62 |
} |
66 | 63 |
|
67 | 64 |
/** |
68 |
- * {@code userName}과 {@code projectName}에 해당하는 프로젝트의 마일스톤 목록을 조회한다. |
|
69 |
- * |
|
70 | 65 |
* when: GET /:user/:project/milestones |
71 |
- * |
|
72 |
- * {@link MilestoneCondition} 폼에서 입력받은 값으로 기본 검색 조건 및 정렬 조건을 적용한다. |
|
73 |
- * |
|
74 |
- * @param userName |
|
75 |
- * @param projectName |
|
76 |
- * @return |
|
77 | 66 |
*/ |
78 | 67 |
@IsAllowed(Operation.READ) |
79 | 68 |
public static Result milestones(String userName, String projectName) { |
... | ... | @@ -89,16 +78,7 @@ |
89 | 78 |
} |
90 | 79 |
|
91 | 80 |
/** |
92 |
- * {@code userName}과 {@code projectName}에 해당하는 프로젝트에 |
|
93 |
- * 새 마일스톤을 추가할 수 있는 입력 폼으로 이동한다. |
|
94 |
- * |
|
95 | 81 |
* when: GET /:user/:project/newMilestoneForm |
96 |
- * |
|
97 |
- * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다. |
|
98 |
- * |
|
99 |
- * @param userName |
|
100 |
- * @param projectName |
|
101 |
- * @return |
|
102 | 82 |
*/ |
103 | 83 |
@With(AnonymousCheckAction.class) |
104 | 84 |
@IsCreatable(ResourceType.MILESTONE) |
... | ... | @@ -108,19 +88,8 @@ |
108 | 88 |
} |
109 | 89 |
|
110 | 90 |
/** |
111 |
- * {@code userName}과 {@code projectName}에 해당하는 프로젝트에 |
|
112 |
- * 새 마일스톤을 추가한다. |
|
113 |
- * |
|
114 | 91 |
* when: POST /:user/:project/milestones |
115 | 92 |
* |
116 |
- * {@link Milestone} 폼으로 입력받은 데이터를 사용해서 새 마일스톤을 생성한다. |
|
117 |
- * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다. |
|
118 |
- * 같은 이름을 가진 마일스톤이 있는지 확인한다. |
|
119 |
- * 같은 이름을 가진 마일스톤이 있을 경우 새 마일스톤 입력 폼으로 다시 이동한다. |
|
120 |
- * |
|
121 |
- * @param userName |
|
122 |
- * @param projectName |
|
123 |
- * @return |
|
124 | 93 |
* @see {@link #validate(models.Project, play.data.Form)} |
125 | 94 |
*/ |
126 | 95 |
@Transactional |
... | ... | @@ -147,14 +116,6 @@ |
147 | 116 |
} |
148 | 117 |
} |
149 | 118 |
|
150 |
- /** |
|
151 |
- * {@code project}에 동일한 이름을 가진 마일스톤이 있는지 확인한다. |
|
152 |
- * |
|
153 |
- * 동일한 이름을 가진 마일스톤이 있을 경우 마일스톤 이름 중복 에러 메시지를 플래시 스코프에 담는다. |
|
154 |
- * |
|
155 |
- * @param project |
|
156 |
- * @param milestoneForm |
|
157 |
- */ |
|
158 | 119 |
private static void validate(Project project, Form<Milestone> milestoneForm) { |
159 | 120 |
if (!Milestone.isUniqueProjectIdAndTitle(project.id, milestoneForm.field("title").value())) { |
160 | 121 |
milestoneForm.reject("title", "milestone.title.duplicated"); |
... | ... | @@ -163,17 +124,7 @@ |
163 | 124 |
} |
164 | 125 |
|
165 | 126 |
/** |
166 |
- * {@code userName}과 {@code projectName}에 해당하는 프로젝트에 |
|
167 |
- * {@code milestoneId}에 해당하는 마일스톤 수정 화면으로 이동한다. |
|
168 |
- * |
|
169 | 127 |
* when: GET /:user/:project/milestone/:id/editform |
170 |
- * |
|
171 |
- * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다. |
|
172 |
- * |
|
173 |
- * @param userName |
|
174 |
- * @param projectName |
|
175 |
- * @param milestoneId |
|
176 |
- * @return |
|
177 | 128 |
*/ |
178 | 129 |
@With(AnonymousCheckAction.class) |
179 | 130 |
@IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.MILESTONE) |
... | ... | @@ -186,18 +137,7 @@ |
186 | 137 |
} |
187 | 138 |
|
188 | 139 |
/** |
189 |
- * {@code userName}과 {@code projectName}에 해당하는 프로젝트에 |
|
190 |
- * {@code milestoneId}에 해당하는 마일스톤을 갱신한다. |
|
191 |
- * |
|
192 | 140 |
* when: POST /:user/:project/milestone/:id/edit |
193 |
- * |
|
194 |
- * 마일스톤 이름을 변경한 경우에는 이름이 중복되는지 확인한다. |
|
195 |
- * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다. |
|
196 |
- * |
|
197 |
- * @param userName |
|
198 |
- * @param projectName |
|
199 |
- * @param milestoneId |
|
200 |
- * @return |
|
201 | 141 |
*/ |
202 | 142 |
@Transactional |
203 | 143 |
@IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.MILESTONE) |
... | ... | @@ -227,19 +167,7 @@ |
227 | 167 |
} |
228 | 168 |
|
229 | 169 |
/** |
230 |
- * {@code userName}과 {@code projectName}에 해당하는 프로젝트에 |
|
231 |
- * {@code milestoneId}에 해당하는 마일스톤을 삭제한다. |
|
232 |
- * |
|
233 | 170 |
* when: GET /:user/:project/milestone/:id/delete |
234 |
- * |
|
235 |
- * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다. |
|
236 |
- * 프로젝트의 아이디와 마일스톤이 가지고 있는 프로젝트 레퍼런스의 아이디가 다를 경우에 |
|
237 |
- * {@link #internalServerError()}를 반환한다. |
|
238 |
- * |
|
239 |
- * @param userName |
|
240 |
- * @param projectName |
|
241 |
- * @param id |
|
242 |
- * @return |
|
243 | 171 |
*/ |
244 | 172 |
@Transactional |
245 | 173 |
@IsAllowed(value = Operation.DELETE, resourceType = ResourceType.MILESTONE) |
... | ... | @@ -252,7 +180,6 @@ |
252 | 180 |
} |
253 | 181 |
milestone.delete(); |
254 | 182 |
|
255 |
- // XHR 호출에 의한 경우라면 204 No Content 와 Location 헤더로 응답한다 |
|
256 | 183 |
if(HttpUtil.isRequestedWithXHR(request())){ |
257 | 184 |
response().setHeader("Location", routes.MilestoneApp.milestones(userName, projectName).toString()); |
258 | 185 |
return status(204); |
... | ... | @@ -261,15 +188,6 @@ |
261 | 188 |
return redirect(routes.MilestoneApp.milestones(userName, projectName)); |
262 | 189 |
} |
263 | 190 |
|
264 |
- /** |
|
265 |
- * {@code userName}과 {@code projectName}에 해당하는 프로젝트에 |
|
266 |
- * {@code milestoneId}에 해당하는 마일스톤을 미해결 상태로 변경한다. |
|
267 |
- * |
|
268 |
- * @param userName |
|
269 |
- * @param projectName |
|
270 |
- * @param id |
|
271 |
- * @return |
|
272 |
- */ |
|
273 | 191 |
@Transactional |
274 | 192 |
@IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.MILESTONE) |
275 | 193 |
public static Result open(String userName, String projectName, Long id) { |
... | ... | @@ -278,15 +196,6 @@ |
278 | 196 |
return redirect(routes.MilestoneApp.milestone(userName, projectName, id)); |
279 | 197 |
} |
280 | 198 |
|
281 |
- /** |
|
282 |
- * {@code userName}과 {@code projectName}에 해당하는 프로젝트에 |
|
283 |
- * {@code milestoneId}에 해당하는 마일스톤을 해결 상태로 변경한다. |
|
284 |
- * |
|
285 |
- * @param userName |
|
286 |
- * @param projectName |
|
287 |
- * @param id |
|
288 |
- * @return |
|
289 |
- */ |
|
290 | 199 |
@Transactional |
291 | 200 |
@IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.MILESTONE) |
292 | 201 |
public static Result close(String userName, String projectName, Long id) { |
... | ... | @@ -296,15 +205,7 @@ |
296 | 205 |
} |
297 | 206 |
|
298 | 207 |
/** |
299 |
- * {@code userName}과 {@code projectName}에 해당하는 프로젝트에 |
|
300 |
- * {@code milestoneId}에 해당하는 마일스톤 상세 정보를 조회한다. |
|
301 |
- * |
|
302 | 208 |
* when: GET /:user/:project/milestone/:id |
303 |
- * |
|
304 |
- * @param userName |
|
305 |
- * @param projectName |
|
306 |
- * @param id |
|
307 |
- * @return |
|
308 | 209 |
*/ |
309 | 210 |
@IsAllowed(value = Operation.READ, resourceType = ResourceType.MILESTONE) |
310 | 211 |
public static Result milestone(String userName, String projectName, Long id) { |
--- app/controllers/OrganizationApp.java
+++ app/controllers/OrganizationApp.java
... | ... | @@ -92,19 +92,16 @@ |
92 | 92 |
} |
93 | 93 |
|
94 | 94 |
private static void validate(Form<Organization> newOrgForm) { |
95 |
- // 조직 이름 패턴을 검사한다. |
|
96 | 95 |
Set<ConstraintViolation<Organization>> results = Validation.getValidator().validate(newOrgForm.get()); |
97 | 96 |
if (!results.isEmpty()) { |
98 | 97 |
newOrgForm.reject("name", "organization.name.alert"); |
99 | 98 |
} |
100 | 99 |
|
101 | 100 |
String name = newOrgForm.field("name").value(); |
102 |
- // 중복된 loginId로 가입할 수 없다. |
|
103 | 101 |
if (User.isLoginIdExist(name)) { |
104 | 102 |
newOrgForm.reject("name", "organization.name.duplicate"); |
105 | 103 |
} |
106 | 104 |
|
107 |
- // 같은 이름의 조직을 만들 수 없다. |
|
108 | 105 |
if (Organization.isNameExist(name)) { |
109 | 106 |
newOrgForm.reject("name", "organization.name.duplicate"); |
110 | 107 |
} |
... | ... | @@ -123,12 +120,6 @@ |
123 | 120 |
return ok(view.render(org)); |
124 | 121 |
} |
125 | 122 |
|
126 |
- /** |
|
127 |
- * 그룹에 멤버를 추가한다. |
|
128 |
- * |
|
129 |
- * @param organizationName |
|
130 |
- * @return |
|
131 |
- */ |
|
132 | 123 |
@Transactional |
133 | 124 |
public static Result addMember(String organizationName) { |
134 | 125 |
Form<User> addMemberForm = form(User.class).bindFromRequest(); |
... | ... | @@ -146,13 +137,6 @@ |
146 | 137 |
return redirect(routes.OrganizationApp.members(organizationName)); |
147 | 138 |
} |
148 | 139 |
|
149 |
- /** |
|
150 |
- * {@link #addMember(String)}를 위해 사용되는 변수의 유효성 검사를 한다. |
|
151 |
- * |
|
152 |
- * @param addMemberForm |
|
153 |
- * @param organizationName |
|
154 |
- * @return |
|
155 |
- */ |
|
156 | 140 |
private static Result validateForAddMember(Form<User> addMemberForm, String organizationName) { |
157 | 141 |
String userLoginId = addMemberForm.get().loginId; |
158 | 142 |
User userToBeAdded = User.findByLoginId(userLoginId); |
... | ... | @@ -182,13 +166,6 @@ |
182 | 166 |
return null; |
183 | 167 |
} |
184 | 168 |
|
185 |
- /** |
|
186 |
- * 그룹에서 멤버를 삭제한다. |
|
187 |
- * |
|
188 |
- * @param organizationName |
|
189 |
- * @param userId |
|
190 |
- * @return |
|
191 |
- */ |
|
192 | 169 |
@Transactional |
193 | 170 |
public static Result deleteMember(String organizationName, Long userId) { |
194 | 171 |
Result result = validateForDeleteMember(organizationName, userId); |
... | ... | @@ -206,13 +183,6 @@ |
206 | 183 |
} |
207 | 184 |
} |
208 | 185 |
|
209 |
- /** |
|
210 |
- * {@link #deleteMember(String, Long)}를 위해 사용되는 변수의 유효성 검사를 한다. |
|
211 |
- * |
|
212 |
- * @param organizationName |
|
213 |
- * @param userId |
|
214 |
- * @return |
|
215 |
- */ |
|
216 | 186 |
private static Result validateForDeleteMember(String organizationName, Long userId) { |
217 | 187 |
Organization organization = Organization.findByOrganizationName(organizationName); |
218 | 188 |
if (organization == null) { |
... | ... | @@ -239,13 +209,6 @@ |
239 | 209 |
return null; |
240 | 210 |
} |
241 | 211 |
|
242 |
- /** |
|
243 |
- * 그룹 멤버의 권한을 수정한다. |
|
244 |
- * |
|
245 |
- * @param organizationName |
|
246 |
- * @param userId |
|
247 |
- * @return |
|
248 |
- */ |
|
249 | 212 |
@Transactional |
250 | 213 |
public static Result editMember(String organizationName, Long userId) { |
251 | 214 |
Form<Role> roleForm = form(Role.class).bindFromRequest(); |
... | ... | @@ -260,14 +223,6 @@ |
260 | 223 |
return status(Http.Status.NO_CONTENT); |
261 | 224 |
} |
262 | 225 |
|
263 |
- /** |
|
264 |
- * {@link #editMember(String, Long)}를 위해 사용되는 변수의 유효성 검사를 한다. |
|
265 |
- * |
|
266 |
- * @param roleForm |
|
267 |
- * @param organizationName |
|
268 |
- * @param userId |
|
269 |
- * @return |
|
270 |
- */ |
|
271 | 226 |
private static Result validateForEditMember(Form<Role> roleForm, String organizationName, Long userId) { |
272 | 227 |
if (roleForm.hasErrors()) { |
273 | 228 |
flash(Constants.WARNING, "organization.member.unknownRole"); |
... | ... | @@ -297,12 +252,6 @@ |
297 | 252 |
return null; |
298 | 253 |
} |
299 | 254 |
|
300 |
- /** |
|
301 |
- * 그룹 페이지 안에있는 멤버 관리 페이지로 이동한다. |
|
302 |
- * |
|
303 |
- * @param organizationName |
|
304 |
- * @return |
|
305 |
- */ |
|
306 | 255 |
public static Result members(String organizationName) { |
307 | 256 |
Result result = validateForSetting(organizationName); |
308 | 257 |
if (result != null) { |
... | ... | @@ -314,12 +263,6 @@ |
314 | 263 |
return ok(members.render(organization, Role.findOrganizationRoles())); |
315 | 264 |
} |
316 | 265 |
|
317 |
- /** |
|
318 |
- * {@link #members(String)}를 위해 사용되는 변수의 유효성 검사를 한다. |
|
319 |
- * |
|
320 |
- * @param organizationName |
|
321 |
- * @return |
|
322 |
- */ |
|
323 | 266 |
private static Result validateForSetting(String organizationName) { |
324 | 267 |
Organization organization = Organization.findByOrganizationName(organizationName); |
325 | 268 |
if (organization == null) { |
... | ... | @@ -334,12 +277,6 @@ |
334 | 277 |
return null; |
335 | 278 |
} |
336 | 279 |
|
337 |
- /** |
|
338 |
- * 그룹 페이지 안에있는 그룹 관리 페이지로 이동한다. |
|
339 |
- * |
|
340 |
- * @param organizationName |
|
341 |
- * @return |
|
342 |
- */ |
|
343 | 280 |
public static Result settingForm(String organizationName) { |
344 | 281 |
Result result = validateForSetting(organizationName); |
345 | 282 |
if (result != null) { |
... | ... | @@ -351,15 +288,6 @@ |
351 | 288 |
return ok(setting.render(organization, form(Organization.class).fill(organization))); |
352 | 289 |
} |
353 | 290 |
|
354 |
- /** |
|
355 |
- * {@code location}을 JSON 형태로 저장하여 ok와 함께 리턴한다. |
|
356 |
- * |
|
357 |
- * Ajax 요청에 대해 redirect를 리턴하면 정상 작동하지 않음으로 ok에 redirect loation을 포함하여 리턴한다. |
|
358 |
- * 클라이언트에서 {@code location}을 확인하여 redirect 시킨다. |
|
359 |
- * |
|
360 |
- * @param location |
|
361 |
- * @return |
|
362 |
- */ |
|
363 | 291 |
private static Result okWithLocation(String location) { |
364 | 292 |
ObjectNode result = Json.newObject(); |
365 | 293 |
result.put("location", location); |
... | ... | @@ -395,12 +323,6 @@ |
395 | 323 |
return redirect(routes.OrganizationApp.settingForm(modifiedOrganization.name)); |
396 | 324 |
} |
397 | 325 |
|
398 |
- /** |
|
399 |
- * {@link #updateOrganizationInfo(String)}를 위해 사용되는 변수의 유효성 검사를 한다. |
|
400 |
- * @param organizationForm |
|
401 |
- * @param modifiedOrganization |
|
402 |
- * @return |
|
403 |
- */ |
|
404 | 326 |
private static Result validateForUpdate(Form<Organization> organizationForm, Organization modifiedOrganization) { |
405 | 327 |
Organization organization = Organization.find.byId(modifiedOrganization.id); |
406 | 328 |
if (organization == null) { |
--- app/controllers/PasswordResetApp.java
+++ app/controllers/PasswordResetApp.java
... | ... | @@ -39,28 +39,11 @@ |
39 | 39 |
|
40 | 40 |
public class PasswordResetApp extends Controller { |
41 | 41 |
|
42 |
- /** |
|
43 |
- * 패스워드 재설정 메일 발송 페이지로 이동 |
|
44 |
- * |
|
45 |
- * when: 사용자가 패스워드가 패스워드 재설정(forget password) 링크를 눌렀을 때 |
|
46 |
- * @return 패스워드 재설정 메일 발송 페이지 |
|
47 |
- */ |
|
48 | 42 |
public static Result lostPassword(){ |
49 | 43 |
// render(message: String, sender: String, errorMessage: String, isSent: Boolean) |
50 | 44 |
return ok(lostPassword.render("site.resetPasswordEmail.title", null, null, false)); |
51 | 45 |
} |
52 | 46 |
|
53 |
- /** |
|
54 |
- * password reset 메일 발송 요청 |
|
55 |
- * |
|
56 |
- * when: 로그인 아이디와 이메일을 입력해서 패스워드 재설정 메일 요청을 했을 때 |
|
57 |
- * |
|
58 |
- * - form으로부터 {@code loginId}와 {@code emailAddress}를 가져온다. |
|
59 |
- * - 요청한 {@code loginId}가 존재하고 {@code email}이 일치하면 패스워드 reset용 링크가 첨부된 메일을 발송한다. |
|
60 |
- * - 불일치하면 에러메시지를 표시한다. |
|
61 |
- * |
|
62 |
- * @return password reset 메일 요청 페이지 |
|
63 |
- */ |
|
64 | 47 |
public static Result requestResetPasswordEmail(){ |
65 | 48 |
DynamicForm requestData = form().bindFromRequest(); |
66 | 49 |
String loginId = requestData.get("loginId"); |
... | ... | @@ -83,21 +66,7 @@ |
83 | 66 |
return ok(lostPassword.render("site.resetPasswordEmail.title", emailAddress, errorMessage, isMailSent)); |
84 | 67 |
} |
85 | 68 |
|
86 |
- /** |
|
87 |
- * password reset 페이지로 이동가능한 링크가 첨부된 email을 발송한다. |
|
88 |
- * |
|
89 |
- * when: password reset을 위해 생성된 {@code hashString}으로 password reset 메일을 발송하고자 할 때 |
|
90 |
- * |
|
91 |
- * - play의 {@code application.conf} 파일에서 {@code smtp.user}와 {@code smtp.domain}을 읽어들여서 sender 주소로 사용한다. |
|
92 |
- * - password reset URL을 메일 본문에 첨부해서 발송 |
|
93 |
- * |
|
94 |
- * @param user 요청한 email로 찾아낸 사용자 정보 |
|
95 |
- * @param hashString 랜덤하게 생성해낸 해당 사용자용 hash 문자열 |
|
96 |
- * @return |
|
97 |
- */ |
|
98 | 69 |
private static boolean sendPasswordResetMail(User user, String hashString) { |
99 |
- //ToDo SiteApp.sendMail()과 통합할 것 |
|
100 |
- //ToDo site email setting check 하는 부분이 빠져 있음 |
|
101 | 70 |
Configuration config = play.Play.application().configuration(); |
102 | 71 |
String sender = config.getString("smtp.user") + "@" + config.getString("smtp.domain"); |
103 | 72 |
String resetPasswordUrl = getResetPasswordUrl(hashString); |
... | ... | @@ -118,14 +87,6 @@ |
118 | 87 |
} |
119 | 88 |
} |
120 | 89 |
|
121 |
- /** |
|
122 |
- * password reset을 위한 URL link를 만든다. |
|
123 |
- * |
|
124 |
- * - application.conf에서 {@code application.hostname}설정과 {@code application.port} 설정을 읽어들인다. |
|
125 |
- * - 설정되어 있지 않았을 경우에는 개발환경이라고 가정하고 LOCAL_HOST_IP:DEV_MODE_PORT로 URL link를 만든다. |
|
126 |
- * @param hashString |
|
127 |
- * @return password reset을 위한 URL link |
|
128 |
- */ |
|
129 | 90 |
private static String getResetPasswordUrl(String hashString) { |
130 | 91 |
Configuration config = play.Play.application().configuration(); |
131 | 92 |
String hostname = config.getString("application.hostname"); |
... | ... | @@ -134,25 +95,10 @@ |
134 | 95 |
return "http://" + hostname + "/resetPassword?s=" + hashString; |
135 | 96 |
} |
136 | 97 |
|
137 |
- /** |
|
138 |
- * password를 재설정하는 페이지로 이동 |
|
139 |
- * |
|
140 |
- * @param s |
|
141 |
- * @return |
|
142 |
- */ |
|
143 | 98 |
public static Result resetPasswordForm(String hashString){ |
144 | 99 |
return ok(resetPassword.render("title.resetPassword", form(User.class), hashString)); |
145 | 100 |
} |
146 | 101 |
|
147 |
- /** |
|
148 |
- * password reset 메일을 요청한 사용자의 패스워드롤 새로운 패스워드로 교체한다. |
|
149 |
- * |
|
150 |
- * - 요청된 폼에서 유효검증용 {@code hashString}과 {@code password}를 읽어들인다. |
|
151 |
- * - 유효한 {@code hashString}인지를 확인한다. |
|
152 |
- * - 유효하면 패스워드를 재설정 아니면 로그에만 남기도 로그인 페이지로 이동한다. |
|
153 |
- * |
|
154 |
- * @return login 페이지로 이동 |
|
155 |
- */ |
|
156 | 102 |
public static Result resetPassword(){ |
157 | 103 |
DynamicForm requestData = form().bindFromRequest(); |
158 | 104 |
String hashString = requestData.get("hashString"); |
--- app/controllers/ProjectApp.java
+++ app/controllers/ProjectApp.java
... | ... | @@ -80,15 +80,10 @@ |
80 | 80 |
import static utils.LogoUtil.*; |
81 | 81 |
import static utils.TemplateHelper.*; |
82 | 82 |
|
83 |
-/** |
|
84 |
- * ProjectApp |
|
85 |
- * |
|
86 |
- */ |
|
87 | 83 |
public class ProjectApp extends Controller { |
88 | 84 |
|
89 | 85 |
private static final int ISSUE_MENTION_SHOW_LIMIT = 2000; |
90 | 86 |
|
91 |
- /** 자동완성에서 보여줄 최대 프로젝트 개수 */ |
|
92 | 87 |
private static final int MAX_FETCH_PROJECTS = 1000; |
93 | 88 |
|
94 | 89 |
private static final int COMMIT_HISTORY_PAGE = 0; |
... | ... | @@ -123,21 +118,6 @@ |
123 | 118 |
return ok(result); |
124 | 119 |
} |
125 | 120 |
|
126 |
- /** |
|
127 |
- * 프로젝트 Home 페이지를 처리한다.<p /> |
|
128 |
- * |
|
129 |
- * {@code ownerId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br /> |
|
130 |
- * 읽기 권한이 없을 경우는 unauthorized로 응답한다.<br /> |
|
131 |
- * 해당 프로젝트의 최근 커밋, 이슈, 포스팅 목록을 가져와서 히스토리를 만든다.<br /> |
|
132 |
- * |
|
133 |
- * @param ownerId |
|
134 |
- * @param projectName |
|
135 |
- * @return 프로젝트 정보 |
|
136 |
- * @throws IOException Signals that an I/O exception has occurred. |
|
137 |
- * @throws ServletException the servlet exception |
|
138 |
- * @throws SVNException the svn exception |
|
139 |
- * @throws GitAPIException the git api exception |
|
140 |
- */ |
|
141 | 121 |
@IsAllowed(Operation.READ) |
142 | 122 |
public static Result project(String ownerId, String projectName) |
143 | 123 |
throws IOException, ServletException, SVNException, GitAPIException { |
... | ... | @@ -163,17 +143,6 @@ |
163 | 143 |
} |
164 | 144 |
} |
165 | 145 |
|
166 |
- /** |
|
167 |
- * {@code project}의 최근 커밋, 이슈, 포스팅 목록을 가져와서 히스토리를 만든다 |
|
168 |
- * |
|
169 |
- * @param ownerId |
|
170 |
- * @param project |
|
171 |
- * @return 프로젝트 히스토리 정보 |
|
172 |
- * @throws IOException Signals that an I/O exception has occurred. |
|
173 |
- * @throws ServletException the servlet exception |
|
174 |
- * @throws SVNException the svn exception |
|
175 |
- * @throws GitAPIException the git api exception |
|
176 |
- */ |
|
177 | 146 |
private static List<History> getProjectHistory(String ownerId, Project project) |
178 | 147 |
throws IOException, ServletException, SVNException, GitAPIException { |
179 | 148 |
project.fixInvalidForkData(); |
... | ... | @@ -195,14 +164,6 @@ |
195 | 164 |
return History.makeHistory(ownerId, project, commits, issues, postings, pullRequests); |
196 | 165 |
} |
197 | 166 |
|
198 |
- /** |
|
199 |
- * 신규 프로젝트 생성 페이지로 이동한다.<p /> |
|
200 |
- * |
|
201 |
- * 비로그인 상태({@link models.User#anonymous})이면 로그인 경고메세지와 함께 로그인페이지로 redirect 된다.<br /> |
|
202 |
- * 로그인 상태이면 프로젝트 생성 페이지로 이동한다.<br /> |
|
203 |
- * |
|
204 |
- * @return 익명사용자이면 로그인페이지, 로그인 상태이면 프로젝트 생성페이지 |
|
205 |
- */ |
|
206 | 167 |
@With(AnonymousCheckAction.class) |
207 | 168 |
public static Result newProjectForm() { |
208 | 169 |
Form<Project> projectForm = form(Project.class).bindFromRequest("owner"); |
... | ... | @@ -211,16 +172,6 @@ |
211 | 172 |
return ok(create.render("title.newProject", projectForm, orgUserList)); |
212 | 173 |
} |
213 | 174 |
|
214 |
- /** |
|
215 |
- * 프로젝트 설정(업데이트) 페이지로 이동한다.<p /> |
|
216 |
- * |
|
217 |
- * {@code ownerId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br /> |
|
218 |
- * 업데이트 권한이 없을 경우는 unauthorized로 응답한다.<br /> |
|
219 |
- * |
|
220 |
- * @param ownerId |
|
221 |
- * @param projectName |
|
222 |
- * @return 프로젝트 정보 |
|
223 |
- */ |
|
224 | 175 |
@IsAllowed(Operation.UPDATE) |
225 | 176 |
public static Result settingForm(String ownerId, String projectName) throws Exception { |
226 | 177 |
Project project = Project.findByOwnerAndProjectName(ownerId, projectName); |
... | ... | @@ -229,16 +180,6 @@ |
229 | 180 |
return ok(setting.render("title.projectSetting", projectForm, project, repository.getBranches())); |
230 | 181 |
} |
231 | 182 |
|
232 |
- /** |
|
233 |
- * 신규 프로젝트 생성(관리자Role 설정/코드 저장소를 생성)하고 Overview 페이지로 redirect 된다.<p /> |
|
234 |
- * |
|
235 |
- * {@code loginId}와 {@code projectName}으로 프로젝트 정보를 조회하여 <br /> |
|
236 |
- * 프로젝트가 이미 존재할 경우 경고메세지와 함께 badRequest로 응답한다.<br /> |
|
237 |
- * 프로젝트폼 입력데이터에 오류가 있을 경우 경고메시지와 함께 badRequest로 응답한다.<br /> |
|
238 |
- * |
|
239 |
- * @return 프로젝트 존재시 경고메세지, 입력폼 오류시 경고메세지, 프로젝트 생성시 프로젝트 정보 |
|
240 |
- * @throws Exception |
|
241 |
- */ |
|
242 | 183 |
@Transactional |
243 | 184 |
public static Result newProject() throws Exception { |
244 | 185 |
Form<Project> filledNewProjectForm = form(Project.class).bindFromRequest(); |
... | ... | @@ -300,22 +241,6 @@ |
300 | 241 |
return newProjectForm.hasErrors(); |
301 | 242 |
} |
302 | 243 |
|
303 |
- /** |
|
304 |
- * 프로젝트 설정을 업데이트한다.<p /> |
|
305 |
- * |
|
306 |
- * 업데이트 권한이 없을 경우 경고메세지와 함께 프로젝트 설정페이지로 redirect된다.<br /> |
|
307 |
- * {@code ownerId}의 프로젝트중 변경하고자 하는 이름과 동일한 프로젝트명이 있으면 경고메세지와 함께 badRequest를 응답한다.<br /> |
|
308 |
- * 프로젝트 로고({@code filePart})가 이미지파일이 아니거나 제한사이즈(1MB) 보다 크다면 경고메세지와 함께 badRequest를 응답한다.<br /> |
|
309 |
- * 프로젝트 로고({@code filePart})가 이미지파일이고 제한사이즈(1MB) 보다 크지 않다면 첨부파일과 프로젝트 정보를 저장하고 프로젝트 설정(업데이트) 페이지로 이동한다.<br /> |
|
310 |
- * |
|
311 |
- * @param ownerId user login id |
|
312 |
- * @param projectName the project name |
|
313 |
- * @return |
|
314 |
- * @throws IOException Signals that an I/O exception has occurred. |
|
315 |
- * @throws NoSuchAlgorithmException the no such algorithm exception |
|
316 |
- * @throws ServletException |
|
317 |
- * @throws UnsupportedOperationException |
|
318 |
- */ |
|
319 | 244 |
@Transactional |
320 | 245 |
@IsAllowed(Operation.UPDATE) |
321 | 246 |
public static Result settingProject(String ownerId, String projectName) |
... | ... | @@ -391,16 +316,6 @@ |
391 | 316 |
return updateProjectForm.hasErrors(); |
392 | 317 |
} |
393 | 318 |
|
394 |
- /** |
|
395 |
- * 프로젝트 삭제 페이지로 이동한다.<p /> |
|
396 |
- * |
|
397 |
- * {@code ownerId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br /> |
|
398 |
- * 업데이트 권한이 없을 경우는 unauthorized로 응답한다.<br /> |
|
399 |
- * |
|
400 |
- * @param ownerId user login id |
|
401 |
- * @param projectName the project name |
|
402 |
- * @return 프로젝트폼, 프로젝트 정보 |
|
403 |
- */ |
|
404 | 319 |
@IsAllowed(Operation.DELETE) |
405 | 320 |
public static Result deleteForm(String ownerId, String projectName) { |
406 | 321 |
Project project = Project.findByOwnerAndProjectName(ownerId, projectName); |
... | ... | @@ -408,17 +323,6 @@ |
408 | 323 |
return ok(delete.render("title.projectDelete", projectForm, project)); |
409 | 324 |
} |
410 | 325 |
|
411 |
- /** |
|
412 |
- * 프로젝트를 삭제한다.<p /> |
|
413 |
- * |
|
414 |
- * {@code ownerId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br /> |
|
415 |
- * 삭제 권한이 없을 경우는 경고 메시지와 함께 설정페이지로 redirect된다. <br /> |
|
416 |
- * |
|
417 |
- * @param ownerId the user login id |
|
418 |
- * @param projectName the project name |
|
419 |
- * @return the result |
|
420 |
- * @throws Exception the exception |
|
421 |
- */ |
|
422 | 326 |
@Transactional |
423 | 327 |
@IsAllowed(Operation.DELETE) |
424 | 328 |
public static Result deleteProject(String ownerId, String projectName) throws Exception { |
... | ... | @@ -426,7 +330,6 @@ |
426 | 330 |
project.delete(); |
427 | 331 |
RepositoryService.deleteRepository(project); |
428 | 332 |
|
429 |
- // XHR 호출에 의한 경우라면 204 No Content 와 Location 헤더로 응답한다 |
|
430 | 333 |
if (HttpUtil.isRequestedWithXHR(request())){ |
431 | 334 |
response().setHeader("Location", routes.Application.index().toString()); |
432 | 335 |
return status(204); |
... | ... | @@ -435,18 +338,6 @@ |
435 | 338 |
return redirect(routes.Application.index()); |
436 | 339 |
} |
437 | 340 |
|
438 |
- /** |
|
439 |
- * 프로젝트 멤버설정 페이지로 이동한다.<p /> |
|
440 |
- * |
|
441 |
- * {@code loginId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br /> |
|
442 |
- * 프로젝트 아이디로 해당 프로젝트의 멤버목록을 가져온다.<br /> |
|
443 |
- * 프로젝트 관련 Role 목록을 가져온다.<br /> |
|
444 |
- * 프로젝트 수정 권한이 없을 경우 unauthorized 로 응답한다<br /> |
|
445 |
- * |
|
446 |
- * @param loginId the user login id |
|
447 |
- * @param projectName the project name |
|
448 |
- * @return 프로젝트, 멤버목록, Role 목록 |
|
449 |
- */ |
|
450 | 341 |
@Transactional |
451 | 342 |
@IsAllowed(Operation.UPDATE) |
452 | 343 |
public static Result members(String loginId, String projectName) { |
... | ... | @@ -457,21 +348,6 @@ |
457 | 348 |
Role.findProjectRoles())); |
458 | 349 |
} |
459 | 350 |
|
460 |
- /** |
|
461 |
- * 이슈나 게시판 본문, 댓글에서 보여줄 멘션 목록 |
|
462 |
- * |
|
463 |
- * 대상 |
|
464 |
- * - 해당 프로젝트 멤버 |
|
465 |
- * - 해당 이슈/게시글 작성자 |
|
466 |
- * - 해당 이슈/게시글의 코멘트 작성자 |
|
467 |
- * - 프로젝트가 속한 그룹의 관리자와 멤버 |
|
468 |
- * |
|
469 |
- * @param loginId |
|
470 |
- * @param projectName |
|
471 |
- * @param number 글번호 |
|
472 |
- * @param resourceType |
|
473 |
- * @return |
|
474 |
- */ |
|
475 | 351 |
@IsAllowed(Operation.READ) |
476 | 352 |
public static Result mentionList(String loginId, String projectName, Long number, String resourceType) { |
477 | 353 |
String prefer = HttpUtil.getPreferType(request(), HTML, JSON); |
... | ... | @@ -543,14 +419,6 @@ |
543 | 419 |
} |
544 | 420 |
} |
545 | 421 |
|
546 |
- /** |
|
547 |
- * 멘션에 노출될 이슈 목록 |
|
548 |
- * |
|
549 |
- * {@code state}와 {@code createdDate} 내림차순으로 정렬하여 {@code ISSUE_MENTION_SHOW_LIMIT} 만큼 가져온다. |
|
550 |
- * |
|
551 |
- * @param project |
|