gitea/models/issues/ai_comment.go
Lieslot de827e114d
PR AI 정적 분석 기능 API 구현 (#24)
* feat: PR 리뷰 ai 정적 분석 기능 추가

* fix: CreateAiPullComment의 반환값을 *AiPullComment로 변경

* fix: review_test 모킹 타입 오류 수정

* fix: ai interface server config 파일 설정 추가 및 ai interface server 요청 방식 변경
2024-08-02 10:41:38 +09:00

141 lines
3.0 KiB
Go

package issues
import (
"context"
"fmt"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/timeutil"
)
// init 메소드가 있으면 자동적으로 xorm에서 이 메소드를 실행하는듯 하다.
func init() {
db.RegisterModel(new(AiPullComment))
}
// TODOC AI 코멘트 테이블 만들기
// TODOC outdated가 어떤 식으로 나타나는 것인지 알아보기
// TODOC 먼저 영속성 계층부터-도메인 계층 순서로 만들어가기
type AiPullComment struct {
ID int64 `xorm:"pk autoincr"`
PosterID int64 `xorm:"INDEX"`
Poster *user_model.User `xorm:"-"`
PullID int64
Pull *Issue `xorm:"-"`
TreePath string
Content string `xorm:"LONGTEXT"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
Status string `xorm:"status"` //
DeletedUnix timeutil.TimeStamp `xorm:"deleted"`
CommitSHA string `xorm:"VARCHAR(64)"`
// CommitID int64
}
type CreateAiPullCommentOption struct {
Doer *user_model.User
Repo *repo_model.Repository
Pull *Issue
TreePath string
Content string
CommitSHA string
// CommitID string
}
type ErrAiPullCommentNotExist struct {
ID int64
RepoID int64
}
func IsErrAiPullCommentNotExist(err error) bool {
_, ok := err.(ErrIssueWasClosed)
return ok
}
func (err ErrAiPullCommentNotExist) Error() string {
return fmt.Sprintf("AiPullComment does not exist [id: %d, repo_id: %d]", err.ID, err.RepoID)
}
func CreateAiPullComment(ctx context.Context, opts *CreateAiPullCommentOption) (*AiPullComment, error) {
ctx, committer, err := db.TxContext(ctx)
if err != nil {
return nil, err
}
defer committer.Close()
aiPullComment := &AiPullComment{
PosterID: opts.Doer.ID,
PullID: opts.Pull.ID,
TreePath: opts.TreePath,
Content: opts.Content,
CommitSHA: opts.CommitSHA,
}
e := db.GetEngine(ctx)
_, err = e.Insert(aiPullComment)
if err != nil {
fmt.Errorf("new Comment insert is invalid")
return nil, err
}
if err = committer.Commit(); err != nil {
return nil, err
}
return aiPullComment, nil
}
func GetAIPullCommentByID(ctx context.Context, id int64) (*AiPullComment, error) {
comment := new(AiPullComment)
has, err := db.GetEngine(ctx).ID(id).Get(comment)
if err != nil {
return nil, ErrAiPullCommentNotExist{id, 0}
} else if !has {
return nil, err
}
return comment, nil
}
func DeleteAiPullCommentByID(ctx context.Context, id int64) error {
_, err := GetAIPullCommentByID(ctx, id)
if err != nil {
if IsErrAiPullCommentNotExist(err) {
return nil
}
return err
}
dbCtx, commiter, err := db.TxContext(ctx)
defer commiter.Close()
if err != nil {
return err
}
_, err = db.DeleteByID[AiPullComment](dbCtx, id)
if err != nil {
return err
}
return commiter.Commit()
}
// TODOC repo가 삭제되면 Ai Comment도 삭제하는 로직
// TODOC