[Notice] Announcing the End of Demo Server [Read me]
Ahn Hyeok Jun 2012-08-13
change url in boardApp using owner & using JODAdateUtil
@cff6e85b7ec5541ee08eec43c4c7d3c67f7b1c91
app/controllers/BoardApp.java
--- app/controllers/BoardApp.java
+++ app/controllers/BoardApp.java
@@ -24,28 +24,29 @@
 
 public class BoardApp extends Controller {
 
-    public static Result posts(String projectName) {
+    public static Result posts(String ownerName, String projectName) {
 
         Form<Post.Param> postParamForm = new Form<Post.Param>(Post.Param.class);
         Param postParam = postParamForm.bindFromRequest().get();
-        Project project = Project.findByName(projectName);
+        Project project = Project.findByNameAndOwner(ownerName, projectName);
+        
         
         return ok(postList.render("게시판", project,
                 Post.findOnePage(project.name, postParam.pageNum, Direction.getValue(postParam.order), postParam.key),
                 postParam));
     }
 
-    public static Result newPost(String projectName) {
-        Project project = Project.findByName(projectName);
+    public static Result newPost(String ownerName, String projectName) {
+        Project project = Project.findByNameAndOwner(ownerName, projectName);
         return ok(newPost.render("새 게시물", new Form<Post>(Post.class), project));
     }
 
-    public static Result savePost(String projectName) {
+    public static Result savePost(String ownerName, String projectName) {
         Form<Post> postForm = new Form<Post>(Post.class).bindFromRequest();
-        Project project = Project.findByName(projectName);
+        Project project = Project.findByNameAndOwner(ownerName, projectName);
         if (postForm.hasErrors()) {
             return ok(boardError.render("본문과 제목은 반드시 써야합니다.",
-                    routes.BoardApp.newPost(project.name), project));
+                    routes.BoardApp.newPost(project.owner, project.name), project));
         } else {
             Post post = postForm.get();
             post.authorId = UserApp.currentUser().id;
@@ -55,12 +56,12 @@
             Post.write(post);
         }
 
-        return redirect(routes.BoardApp.posts(project.name));
+        return redirect(routes.BoardApp.posts(project.owner, project.name));
     }
 
-    public static Result post(String projectName, Long postId) {
+    public static Result post(String ownerName, String projectName, Long postId) {
         Post post = Post.findById(postId);
-        Project project = Project.findByName(projectName);
+        Project project = Project.findByNameAndOwner(ownerName, projectName);
         if (post == null) {
             return ok(notExsitPage.render("존재하지 않는 게시물", project));
         } else {
@@ -69,13 +70,13 @@
         }
     }
 
-    public static Result saveComment(String projectName, Long postId) {
+    public static Result saveComment(String ownerName, String projectName, Long postId) {
         Form<Comment> commentForm = new Form<Comment>(Comment.class).bindFromRequest();
 
-        Project project = Project.findByName(projectName);
+        Project project = Project.findByNameAndOwner(ownerName, projectName);
         if (commentForm.hasErrors()) {
             return ok(boardError.render("본문은 반드시 쓰셔야 합니다.",
-                    routes.BoardApp.post(project.name, postId), project));
+                    routes.BoardApp.post(project.owner, project.name, postId), project));
 
         } else {
             Comment comment = commentForm.get();
@@ -86,32 +87,32 @@
             Comment.write(comment);
             Post.countUpCommentCounter(postId);
             
-            return redirect(routes.BoardApp.post(project.name, postId));
+            return redirect(routes.BoardApp.post(project.owner, project.name, postId));
         }
     }
 
-    public static Result deletePost(String projectName, Long postId) {
-        Project project = Project.findByName(projectName);
+    public static Result deletePost(String ownerName, String projectName, Long postId) {
+        Project project = Project.findByNameAndOwner(ownerName, projectName);
         Post.delete(postId);
-        return redirect(routes.BoardApp.posts(project.name));
+        return redirect(routes.BoardApp.posts(project.owner, project.name));
     }
 
-    public static Result editPost(String projectName, Long postId) {
+    public static Result editPost(String ownerName, String projectName, Long postId) {
         Post existPost = Post.findById(postId);
         Form<Post> editForm = new Form<Post>(Post.class).fill(existPost);
-        Project project = Project.findByName(projectName);
+        Project project = Project.findByNameAndOwner(ownerName, projectName);
 
         if (UserApp.currentUser().id == existPost.authorId) {
             return ok(editPost.render("게시물 수정", editForm, postId, project));
         } else {
-            return ok(boardError.render("글쓴이가 아닙니다.", routes.BoardApp.post(project.name, postId),
+            return ok(boardError.render("글쓴이가 아닙니다.", routes.BoardApp.post(project.owner, project.name, postId),
                     project));
         }
     }
 
-    public static Result updatePost(String projectName, Long postId) {
+    public static Result updatePost(String ownerName, String projectName, Long postId) {
         Form<Post> postForm = new Form<Post>(Post.class).bindFromRequest();
-        Project projcet = Project.findByName(projectName);
+        Project project = Project.findByNameAndOwner(ownerName, projectName);
 
         if (postForm.hasErrors()) {
             return ok("입력값이 잘못되었습니다.");
@@ -121,12 +122,12 @@
             post.authorId = UserApp.currentUser().id;
             post.id = postId;
             post.filePath = saveFile(request());
-            post.project = projcet;
+            post.project = project;
 
             Post.edit(post);
         }
 
-        return redirect(routes.BoardApp.posts(projcet.name));
+        return redirect(routes.BoardApp.posts(project.owner, project.name));
     }
 
     private static String saveFile(Request request) {
app/controllers/CodeApp.java
--- app/controllers/CodeApp.java
+++ app/controllers/CodeApp.java
@@ -14,6 +14,7 @@
 public class CodeApp extends Controller {
 
     public static Result view(String ownerName, String projectName, String path) throws IOException {
+        //FIXME use ownerName
         String vcs = Project.findByName(projectName).vcs;
         if (vcs.equals("GIT")) {
             return GitApp.viewCode(projectName, path);
@@ -24,6 +25,7 @@
     
     public static Result ajaxRequest(String ownerName, String projectName, String path) throws IOException, NoHeadException, GitAPIException {
         try {
+            //FIXME use ownerName
             return ok(new GitRepository(projectName).findFileInfo(path));
         } catch (NoHeadException e) {
             return forbidden();
app/models/Comment.java
--- app/models/Comment.java
+++ app/models/Comment.java
@@ -1,15 +1,14 @@
 package models;
 
+import java.util.*;
+
+import javax.persistence.*;
+
 import org.joda.time.Duration;
+
 import play.data.validation.Constraints;
 import play.db.ebean.Model;
 import utils.JodaDateUtil;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import java.util.Date;
-import java.util.List;
 
 @Entity
 public class Comment extends Model {
@@ -46,20 +45,9 @@
     public static List<Comment> findCommentsByPostId(Long postId) {
         return find.where().eq("post.id", postId).findList();
     }
-
-    public String calcPassTime() {
-        Duration dur = JodaDateUtil.ago(this.date);
-        if (dur.getStandardDays() > 0) {
-            return dur.getStandardDays() + "일 전";
-        } else if (dur.getStandardHours() > 0) {
-            return dur.getStandardHours() + "시간 전";
-        } else if (dur.getStandardMinutes() > 0) {
-            return dur.getStandardMinutes() + "분 전";
-        } else if (dur.getStandardSeconds() > 0) {
-            return dur.getStandardSeconds() + "초 전";
-        } else {
-            return "방금 전";
-        }
+    
+    public Duration ago(){
+        return JodaDateUtil.ago(this.date);
     }
 
     public String authorName() {
app/models/Post.java
--- app/models/Post.java
+++ app/models/Post.java
@@ -101,21 +101,6 @@
         return JodaDateUtil.ago(this.date);
     }
 
-    public String calcPassTime() {
-        Duration dur = JodaDateUtil.ago(this.date);
-        if (dur.getStandardDays() > 0) {
-            return dur.getStandardDays() + "일 전";
-        } else if (dur.getStandardHours() > 0) {
-            return dur.getStandardHours() + "시간 전";
-        } else if (dur.getStandardMinutes() > 0) {
-            return dur.getStandardMinutes() + "분 전";
-        } else if (dur.getStandardSeconds() > 0) {
-            return dur.getStandardSeconds() + "초 전";
-        } else {
-            return "방금 전";
-        }
-    }
-
     public static void edit(Post post) {
         Post beforePost = findById(post.id);
         post.commentCount = beforePost.commentCount;
app/views/agoString.scala.html
--- app/views/agoString.scala.html
+++ app/views/agoString.scala.html
@@ -1,15 +1,15 @@
 @(duration:org.joda.time.Duration)
 
 @if(duration.getStandardDays() > 0) {
-    @duration.getStandardDays() 일 전
+    @duration.getStandardDays() @Messages("time.day")
 } else {@if(duration.getStandardHours() > 0){
-    @duration.getStandardHours() 시간전
+    @duration.getStandardHours() @Messages("time.hour")
 } else {@if(duration.getStandardMinutes() > 0) {
-    @duration.getStandardMinutes() 분전
+    @duration.getStandardMinutes() @Messages("time.minute")
 } else {@if(duration.getStandardSeconds() > 0) {
-    @duration.getStandardSeconds 초전
+    @duration.getStandardSeconds @Messages("time.second")
 } else {
-    방금전
+    @Messages("time.just")
 }}}}
 
 
app/views/board/editPost.scala.html
--- app/views/board/editPost.scala.html
+++ app/views/board/editPost.scala.html
@@ -4,7 +4,7 @@
 @implicitFieldConstructor = @{ helper.FieldConstructor(twitterBootstrapInput.render) } 
 
 @main(title, project) {
-    @helper.form(action=routes.BoardApp.updatePost(project.name, postId), 'enctype -> "multipart/form-data"){
+    @helper.form(action=routes.BoardApp.updatePost(project.owner, project.name, postId), 'enctype -> "multipart/form-data"){
     	@helper.inputText(form("title"), '_showConstraints -> false, '_label-> "제목")
     	@helper.textarea(form("contents"), '_showConstraints -> false, '_label->"내용")
     	@helper.inputFile(form("filePath"))
app/views/board/newPost.scala.html
--- app/views/board/newPost.scala.html
+++ app/views/board/newPost.scala.html
@@ -4,7 +4,7 @@
 @implicitFieldConstructor = @{ helper.FieldConstructor(twitterBootstrapInput.render) } 
 
 @main(title, project) {
-    @helper.form(action=routes.BoardApp.savePost(project.name), 'enctype -> "multipart/form-data"){
+    @helper.form(action=routes.BoardApp.savePost(project.owner, project.name), 'enctype -> "multipart/form-data"){
     	@helper.inputText(form("title"), '_showConstraints -> false, '_label-> "제목")
     	@helper.textarea(form("contents"), '_showConstraints -> false, '_label->"내용")
     	@helper.inputFile(form("filePath"))
app/views/board/notExsitPage.scala.html
--- app/views/board/notExsitPage.scala.html
+++ app/views/board/notExsitPage.scala.html
@@ -4,5 +4,5 @@
 
 @main(title, project) {
     <h1>존재하지 않는 게시물 입니다.</h1>
-    <a href="@routes.BoardApp.posts(project.name)" class="btn">목록으로 가기</a>
+    <a href="@routes.BoardApp.posts(project.owner, project.name)" class="btn">목록으로 가기</a>
 }
(No newline at end of file)
app/views/board/post.scala.html
--- app/views/board/post.scala.html
+++ app/views/board/post.scala.html
@@ -4,9 +4,9 @@
 <div class="row">
     <div class="span2 offset10">
 	    <div id="board_btn_panel">
-	        <a class="btn btn-primary" href="@routes.BoardApp.editPost(project.name, post.id)">수정</a>
+	        <a class="btn btn-primary" href="@routes.BoardApp.editPost(project.owner, project.name, post.id)">수정</a>
 	        <a data-toggle="modal" href="#deleteConfirm" class="btn">삭제</a>
-	        <a class="btn" href="@routes.BoardApp.posts(project.name)">목록</a>
+	        <a class="btn" href="@routes.BoardApp.posts(project.owner, project.name)">목록</a>
 	    </div>
 	</div>
 </div>
@@ -17,7 +17,7 @@
 		<div class="span11">
 			<h1>@post.title</h1>
 			<div>
-				<span>@post.authorName가 @post.calcPassTime()에 작성함<span> |
+				<span>@post.authorName가 @agoString(post.ago())에 작성함<span> |
 				<span>@post.date</span>
 			</div>
 		</div>
@@ -42,7 +42,7 @@
 	<div class="span1"><img class="pull-right" src="http://placehold.it/50x50"/></div>
 	<div class="span11">
 		<div>
-			<span>@comment.authorName가 @comment.calcPassTime()에 작성함</span> |
+			<span>@comment.authorName가 @agoString(comment.ago())에 작성함</span> |
 			<span>@comment.date</span>
 		</div>
 		<p>@comment.contents<p>
@@ -55,7 +55,7 @@
 <!-- 댓글 입력 폼 -->
 <hr/>
 <div class="row">
-	@helper.form(routes.BoardApp.saveComment(project.name, post.id), 'enctype -> "multipart/form-data"){
+	@helper.form(routes.BoardApp.saveComment(project.owner, project.name, post.id), 'enctype -> "multipart/form-data"){
 		<div class="span12">@helper.textarea(commentForm("contents"), '_showConstraints -> false, 'label-> "덧글내용")</div>
 		<div class="span6">@helper.inputFile(commentForm("filePath"), '_showConstraints -> false, 'label->"파일첨부")</div>		
 		<div class="span6"><input class="btn pull-right" type="submit" value="댓글입력"/></div>
@@ -81,7 +81,7 @@
     <p>그래도 삭제하시겠습니까?</p>
   </div>
   <div class="modal-footer">
-    <a class="btn btn-primary" href="@routes.BoardApp.deletePost(project.name, post.id)">예</a>
+    <a class="btn btn-primary" href="@routes.BoardApp.deletePost(project.owner, project.name, post.id)">예</a>
     <a href="#" class="btn" data-dismiss="modal">아니오</a>
   </div>
 </div>
app/views/board/postList.scala.html
--- app/views/board/postList.scala.html
+++ app/views/board/postList.scala.html
@@ -2,7 +2,7 @@
 
 @header(label:String, key:String) = {
     <th>
-        <a key="@key" href="@routes.BoardApp.posts(project.name)">@label</a>
+        <a key="@key" href="@routes.BoardApp.posts(project.owner, project.name)">@label</a>
         @if(key == param.key){
         @if(param.order == "desc"){
         <i class="icon-chevron-down"></i>
@@ -23,7 +23,7 @@
           <input type="hidden" name="pageNum" value="@param.pageNum">
           <input type="text" name="filter" class="search-query">
           <button type="submit" class="btn"><i class="icon-search"></i></button>
-          <a class="btn btn-primary" href="@routes.BoardApp.newPost(project.name)" >새글</a>
+          <a class="btn btn-primary" href="@routes.BoardApp.newPost(project.owner, project.name)" >새글</a>
         </form>
       </div>    
     </div>  
@@ -52,9 +52,9 @@
 	    		@for(post <- page.getList()){
 	    		<tr>
 	    			<td>@post.id</td>
-	    			<td><a href="@routes.BoardApp.post(project.name, post.id)">@post.title [@post.commentCount]</a></td>
+	    			<td><a href="@routes.BoardApp.post(project.owner, project.name, post.id)">@post.title [@post.commentCount]</a></td>
 	    			<td>@post.authorName</td>
-	    			<td>@post.calcPassTime() @agoString(post.ago())</td>
+	    			<td>@agoString(post.ago())</td>
 	    		</tr>
 	    		}
 	    	</tbody>
app/views/topmenu.scala.html
--- app/views/topmenu.scala.html
+++ app/views/topmenu.scala.html
@@ -7,8 +7,8 @@
       <a href="@routes.ProjectApp.project(project.owner, project.name)">@Messages("menu.home")</a>
     </li>
     @roleCheck(session.get("userId"), project.id, models.enumeration.PermissionResource.BOARD, models.enumeration.PermissionOperation.READ){
-        <li class="@isActiveMenu(routes.BoardApp.posts(project.name))">
-          <a href="@routes.BoardApp.posts(project.name)">@Messages("menu.board")</a>
+        <li class="@isActiveMenu(routes.BoardApp.posts(project.owner, project.name))">
+          <a href="@routes.BoardApp.posts(project.owner, project.name)">@Messages("menu.board")</a>
         </li>
     }
     @roleCheck(session.get("userId"), project.id, models.enumeration.PermissionResource.CODE, models.enumeration.PermissionOperation.READ){
conf/messages.en
--- conf/messages.en
+++ conf/messages.en
@@ -179,4 +179,11 @@
 user.email = E-mail
 user.wrongEmail.alert = Wrong email address.
 user.login.failed = Your login ID or password is not valid.
-user.logout.success = Logout successfully
(No newline at end of file)
+user.logout.success = Logout successfully
+
+#Time
+time.just = just now
+time.second = second ago
+time.minute = minute ago
+time.hour = hour ago
+time.day = day ago
(No newline at end of file)
conf/messages.ko
--- conf/messages.ko
+++ conf/messages.ko
@@ -178,4 +178,11 @@
 user.email = 이메일
 user.wrongEmail.alert = 이메일이 잘못되었습니다.
 user.login.failed = 아이디 또는 비밀번호가 잘못되었습니다.
-user.logout.success = 성공적으로 로그아웃되었습니다.
(No newline at end of file)
+user.logout.success = 성공적으로 로그아웃되었습니다.
+
+#Time
+time.just = 방금 전
+time.second = 초 전
+time.minute = 분 전
+time.hour = 시간 전
+time.day = 일 전
(No newline at end of file)
conf/routes
--- conf/routes
+++ conf/routes
@@ -24,14 +24,14 @@
 GET     /sites/softwareMap                  controllers.SiteApp.softwareMap()
 
 # Boards
-GET     /:projectName/boardList                 controllers.BoardApp.posts(projectName:String)
-GET     /:projectName/boards/new                controllers.BoardApp.newPost(projectName:String)
-POST    /:projectName/boards/new                controllers.BoardApp.savePost(projectName:String)
-GET     /:projectName/board/:id                 controllers.BoardApp.post(projectName:String, id:Long)
-POST    /:projectName/board/:id/replay          controllers.BoardApp.saveComment(projectName:String, id:Long)
-GET     /:projectName/board/:id/delete          controllers.BoardApp.deletePost(projectName:String, id:Long)
-GET     /:projectName/board/:id/edit            controllers.BoardApp.editPost(projectName:String, id:Long)
-POST    /:projectName/board/:id/edit            controllers.BoardApp.updatePost(projectName:String, id:Long)
+GET     /:ownerName/:projectName/boardList                 controllers.BoardApp.posts(ownerName:String, projectName:String)
+GET     /:ownerName/:projectName/boards/new                controllers.BoardApp.newPost(ownerName:String, projectName:String)
+POST    /:ownerName/:projectName/boards/new                controllers.BoardApp.savePost(ownerName:String, projectName:String)
+GET     /:ownerName/:projectName/board/:id                 controllers.BoardApp.post(ownerName:String, projectName:String, id:Long)
+POST    /:ownerName/:projectName/board/:id/replay          controllers.BoardApp.saveComment(ownerName:String, projectName:String, id:Long)
+GET     /:ownerName/:projectName/board/:id/delete          controllers.BoardApp.deletePost(ownerName:String, projectName:String, id:Long)
+GET     /:ownerName/:projectName/board/:id/edit            controllers.BoardApp.editPost(ownerName:String, projectName:String, id:Long)
+POST    /:ownerName/:projectName/board/:id/edit            controllers.BoardApp.updatePost(ownerName:String, projectName:String, id:Long)
 
 # Projects
 GET     /projects/new                           controllers.ProjectApp.newProject()
Add a comment
List