func SubmitReview(ctx *context.Context, form auth.SubmitReviewForm) {
	issue := GetActionIssue(ctx)
	if !issue.IsPull {
		return
	}
	if ctx.Written() {
		return
	}
	if ctx.HasError() {
		ctx.Flash.Error(ctx.Data["ErrorMsg"].(string))
		ctx.Redirect(fmt.Sprintf("%s/pulls/%d/files", ctx.Repo.RepoLink, issue.Index))
		return
	}
	var review *models.Review
	var err error

	reviewType := form.ReviewType()

	switch reviewType {
	case models.ReviewTypeUnknown:
		ctx.ServerError("GetCurrentReview", fmt.Errorf("unknown ReviewType: %s", form.Type))
		return

	// can not approve/reject your own PR
	case models.ReviewTypeApprove, models.ReviewTypeReject:

		if issue.Poster.ID == ctx.User.ID {

			var translated string

			if reviewType == models.ReviewTypeApprove {
				translated = ctx.Tr("repo.issues.review.self.approval")
			} else {
				translated = ctx.Tr("repo.issues.review.self.rejection")
			}

			ctx.Flash.Error(translated)
			ctx.Redirect(fmt.Sprintf("%s/pulls/%d/files", ctx.Repo.RepoLink, issue.Index))
			return
		}
	}

	review, err = models.GetCurrentReview(ctx.User, issue)
	if err == nil {
		review.Issue = issue
		if errl := review.LoadCodeComments(); errl != nil {
			ctx.ServerError("LoadCodeComments", err)
			return
		}
	}

	if ((err == nil && len(review.CodeComments) == 0) ||
		(err != nil && models.IsErrReviewNotExist(err))) &&
		form.HasEmptyContent() {
		ctx.Flash.Error(ctx.Tr("repo.issues.review.content.empty"))
		ctx.Redirect(fmt.Sprintf("%s/pulls/%d/files", ctx.Repo.RepoLink, issue.Index))
		return
	}

	if err != nil {
		if !models.IsErrReviewNotExist(err) {
			ctx.ServerError("GetCurrentReview", err)
			return
		}
		// No current review. Create a new one!
		if review, err = models.CreateReview(models.CreateReviewOptions{
			Type:     reviewType,
			Issue:    issue,
			Reviewer: ctx.User,
			Content:  form.Content,
		}); err != nil {
			ctx.ServerError("CreateReview", err)
			return
		}
	} else {
		review.Content = form.Content
		review.Type = reviewType
		if err = models.UpdateReview(review); err != nil {
			ctx.ServerError("UpdateReview", err)
			return
		}
	}
	comm, err := models.CreateComment(&models.CreateCommentOptions{
		Type:     models.CommentTypeReview,
		Doer:     ctx.User,
		Content:  review.Content,
		Issue:    issue,
		Repo:     issue.Repo,
		ReviewID: review.ID,
	})
	if err != nil || comm == nil {
		ctx.ServerError("CreateComment", err)
		return
	}
	if err = review.Publish(); err != nil {
		ctx.ServerError("Publish", err)
		return
	}

	pr, err := issue.GetPullRequest()
	if err != nil {
		ctx.ServerError("GetPullRequest", err)
		return
	}
	notification.NotifyPullRequestReview(pr, review, comm)

	ctx.Redirect(fmt.Sprintf("%s/pulls/%d#%s", ctx.Repo.RepoLink, issue.Index, comm.HashTag()))
}
// SubmitReview creates a review out of the existing pending review or creates a new one if no pending review exist
SubmitReview creates a review out of the existing pending review or creates a new one if no pending review exist
// SubmitReview creates a review out of the existing pending review or creates a new one if no pending review exist
func SubmitReview(ctx *context.Context, form auth.SubmitReviewForm) {
	issue := GetActionIssue(ctx)
	if !issue.IsPull {
		return
	}
	if ctx.Written() {
		return
	}
	if ctx.HasError() {
		ctx.Flash.Error(ctx.Data["ErrorMsg"].(string))
		ctx.Redirect(fmt.Sprintf("%s/pulls/%d/files", ctx.Repo.RepoLink, issue.Index))
		return
	}
	var review *models.Review
	var err error
	reviewType := form.ReviewType()
	switch reviewType {
	case models.ReviewTypeUnknown:
		ctx.ServerError("GetCurrentReview", fmt.Errorf("unknown ReviewType: %s", form.Type))
		return
	case models.ReviewTypeApprove, models.ReviewTypeReject:
		if issue.Poster.ID == ctx.User.ID {
			var translated string
			if reviewType == models.ReviewTypeApprove {
				translated = ctx.Tr("repo.issues.review.self.approval")
			} else {
				translated = ctx.Tr("repo.issues.review.self.rejection")
			}
			ctx.Flash.Error(translated)
			ctx.Redirect(fmt.Sprintf("%s/pulls/%d/files", ctx.Repo.RepoLink, issue.Index))
			return
		}
	}
	review, err = models.GetCurrentReview(ctx.User, issue)
	if err == nil {
		review.Issue = issue
		if errl := review.LoadCodeComments(); errl != nil {
			ctx.ServerError("LoadCodeComments", err)
			return
		}
	}
	if ((err == nil && len(review.CodeComments) == 0) ||
		(err != nil && models.IsErrReviewNotExist(err))) &&
		form.HasEmptyContent() {
		ctx.Flash.Error(ctx.Tr("repo.issues.review.content.empty"))
		ctx.Redirect(fmt.Sprintf("%s/pulls/%d/files", ctx.Repo.RepoLink, issue.Index))
		return
	}
	if err != nil {
		if !models.IsErrReviewNotExist(err) {
			ctx.ServerError("GetCurrentReview", err)
			return
		}
		if review, err = models.CreateReview(models.CreateReviewOptions{
			Type:     reviewType,
			Issue:    issue,
			Reviewer: ctx.User,
			Content:  form.Content,
		}); err != nil {
			ctx.ServerError("CreateReview", err)
			return
		}
	} else {
		review.Content = form.Content
		review.Type = reviewType
		if err = models.UpdateReview(review); err != nil {
			ctx.ServerError("UpdateReview", err)
			return
		}
	}
	comm, err := models.CreateComment(&models.CreateCommentOptions{
		Type:     models.CommentTypeReview,
		Doer:     ctx.User,
		Content:  review.Content,
		Issue:    issue,
		Repo:     issue.Repo,
		ReviewID: review.ID,
	})
	if err != nil || comm == nil {
		ctx.ServerError("CreateComment", err)
		return
	}
	if err = review.Publish(); err != nil {
		ctx.ServerError("Publish", err)
		return
	}
	pr, err := issue.GetPullRequest()
	if err != nil {
		ctx.ServerError("GetPullRequest", err)
		return
	}
	notification.NotifyPullRequestReview(pr, review, comm)
	ctx.Redirect(fmt.Sprintf("%s/pulls/%d#%s", ctx.Repo.RepoLink, issue.Index, comm.HashTag()))
}
func SubmitReview ( ctx * context . Context , form auth . SubmitReviewForm ) { issue := GetActionIssue ( ctx ) if ! issue . IsPull { return } if ctx . Written ( ) { return } if ctx . HasError ( ) { ctx . Flash . Error ( ctx . Data [ " " ] . ( string ) ) ctx . Redirect ( fmt . Sprintf ( " " , ctx . Repo . RepoLink , issue . Index ) ) return } var review * models . Review var err error reviewType := form . ReviewType ( ) switch reviewType { case models . ReviewTypeUnknown : ctx . ServerError ( " " , fmt . Errorf ( " " , form . Type ) ) return case models . ReviewTypeApprove , models . ReviewTypeReject : if issue . Poster . ID == ctx . User . ID { var translated string if reviewType == models . ReviewTypeApprove { translated = ctx . Tr ( " " ) } else { translated = ctx . Tr ( " " ) } ctx . Flash . Error ( translated ) ctx . Redirect ( fmt . Sprintf ( " " , ctx . Repo . RepoLink , issue . Index ) ) return } } review , err = models . GetCurrentReview ( ctx . User , issue ) if err == nil { review . Issue = issue if errl := review . LoadCodeComments ( ) ; errl != nil { ctx . ServerError ( " " , err ) return } } if ( ( err == nil && len ( review . CodeComments ) == 0 ) || ( err != nil && models . IsErrReviewNotExist ( err ) ) ) && form . HasEmptyContent ( ) { ctx . Flash . Error ( ctx . Tr ( " " ) ) ctx . Redirect ( fmt . Sprintf ( " " , ctx . Repo . RepoLink , issue . Index ) ) return } if err != nil { if ! models . IsErrReviewNotExist ( err ) { ctx . ServerError ( " " , err ) return } if review , err = models . CreateReview ( models . CreateReviewOptions { Type : reviewType , Issue : issue , Reviewer : ctx . User , Content : form . Content , } ) ; err != nil { ctx . ServerError ( " " , err ) return } } else { review . Content = form . Content review . Type = reviewType if err = models . UpdateReview ( review ) ; err != nil { ctx . ServerError ( " " , err ) return } } comm , err := models . CreateComment ( & models . CreateCommentOptions { Type : models . CommentTypeReview , Doer : ctx . User , Content : review . Content , Issue : issue , Repo : issue . Repo , ReviewID : review . ID , } ) if err != nil || comm == nil { ctx . ServerError ( " " , err ) return } if err = review . Publish ( ) ; err != nil { ctx . ServerError ( " " , err ) return } pr , err := issue . GetPullRequest ( ) if err != nil { ctx . ServerError ( " " , err ) return } notification . NotifyPullRequestReview ( pr , review , comm ) ctx . Redirect ( fmt . Sprintf ( " " , ctx . Repo . RepoLink , issue . Index , comm . HashTag ( ) ) ) }
SubmitReview creates a review out of the existing pending review or creates a new one if no pending review exist
SubmitReview creates a review out of the existing pending review or creates a new one if no pending review exist
// can not approve/reject your own PR // No current review. Create a new one!