mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	[Refactor] Move APIFormat functions into convert package (#12856)
* USER APIFormat -> ToUser * Migrate more and mark APIFormat deprecated * models.Comment APIFormat() -> convert.ToComment * models.Release APIFormat() -> convert.ToRelease * models.Attachments APIFormat() -> convert.ToReleaseAttachments * models.CommitStatus APIFormat() -> convert.ToCommitStatus * finish migration to convert.ToUser * Move Test * Imprufe Test * fix test Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		| @@ -11,6 +11,7 @@ import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| @@ -125,7 +126,7 @@ func TestAPIGetComment(t *testing.T) { | ||||
| 	DecodeJSON(t, resp, &apiComment) | ||||
|  | ||||
| 	assert.NoError(t, comment.LoadPoster()) | ||||
| 	expect := comment.APIFormat() | ||||
| 	expect := convert.ToComment(comment) | ||||
|  | ||||
| 	assert.Equal(t, expect.ID, apiComment.ID) | ||||
| 	assert.Equal(t, expect.Poster.FullName, apiComment.Poster.FullName) | ||||
|   | ||||
| @@ -11,6 +11,7 @@ import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| @@ -60,7 +61,7 @@ func TestAPIIssuesReactions(t *testing.T) { | ||||
| 	DecodeJSON(t, resp, &apiReactions) | ||||
| 	expectResponse := make(map[int]api.Reaction) | ||||
| 	expectResponse[0] = api.Reaction{ | ||||
| 		User:     user2.APIFormat(), | ||||
| 		User:     convert.ToUser(user2, true, true), | ||||
| 		Reaction: "eyes", | ||||
| 		Created:  time.Unix(1573248003, 0), | ||||
| 	} | ||||
| @@ -120,12 +121,12 @@ func TestAPICommentReactions(t *testing.T) { | ||||
| 	DecodeJSON(t, resp, &apiReactions) | ||||
| 	expectResponse := make(map[int]api.Reaction) | ||||
| 	expectResponse[0] = api.Reaction{ | ||||
| 		User:     user2.APIFormat(), | ||||
| 		User:     convert.ToUser(user2, true, true), | ||||
| 		Reaction: "laugh", | ||||
| 		Created:  time.Unix(1573248004, 0), | ||||
| 	} | ||||
| 	expectResponse[1] = api.Reaction{ | ||||
| 		User:     user1.APIFormat(), | ||||
| 		User:     convert.ToUser(user1, true, true), | ||||
| 		Reaction: "laugh", | ||||
| 		Created:  time.Unix(1573248005, 0), | ||||
| 	} | ||||
|   | ||||
| @@ -12,7 +12,6 @@ import ( | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
| 	"code.gitea.io/gitea/modules/storage" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/modules/timeutil" | ||||
|  | ||||
| 	gouuid "github.com/google/uuid" | ||||
| @@ -43,19 +42,6 @@ func (a *Attachment) IncreaseDownloadCount() error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // APIFormat converts models.Attachment to api.Attachment | ||||
| func (a *Attachment) APIFormat() *api.Attachment { | ||||
| 	return &api.Attachment{ | ||||
| 		ID:            a.ID, | ||||
| 		Name:          a.Name, | ||||
| 		Created:       a.CreatedUnix.AsTime(), | ||||
| 		DownloadCount: a.DownloadCount, | ||||
| 		Size:          a.Size, | ||||
| 		UUID:          a.UUID, | ||||
| 		DownloadURL:   a.DownloadURL(), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // AttachmentRelativePath returns the relative path | ||||
| func AttachmentRelativePath(uuid string) string { | ||||
| 	return path.Join(uuid[0:1], uuid[1:2], uuid) | ||||
|   | ||||
| @@ -61,27 +61,6 @@ func (status *CommitStatus) APIURL() string { | ||||
| 		setting.AppURL, status.Repo.FullName(), status.SHA) | ||||
| } | ||||
|  | ||||
| // APIFormat assumes some fields assigned with values: | ||||
| // Required - Repo, Creator | ||||
| func (status *CommitStatus) APIFormat() *api.Status { | ||||
| 	_ = status.loadRepo(x) | ||||
| 	apiStatus := &api.Status{ | ||||
| 		Created:     status.CreatedUnix.AsTime(), | ||||
| 		Updated:     status.CreatedUnix.AsTime(), | ||||
| 		State:       api.StatusState(status.State), | ||||
| 		TargetURL:   status.TargetURL, | ||||
| 		Description: status.Description, | ||||
| 		ID:          status.Index, | ||||
| 		URL:         status.APIURL(), | ||||
| 		Context:     status.Context, | ||||
| 	} | ||||
| 	if status.Creator != nil { | ||||
| 		apiStatus.Creator = status.Creator.APIFormat() | ||||
| 	} | ||||
|  | ||||
| 	return apiStatus | ||||
| } | ||||
|  | ||||
| // CalcCommitStatus returns commit status state via some status, the commit statues should order by id desc | ||||
| func CalcCommitStatus(statuses []*CommitStatus) *CommitStatus { | ||||
| 	var lastStatus *CommitStatus | ||||
|   | ||||
| @@ -20,7 +20,6 @@ import ( | ||||
| 	"code.gitea.io/gitea/modules/markup/markdown" | ||||
| 	"code.gitea.io/gitea/modules/references" | ||||
| 	"code.gitea.io/gitea/modules/structs" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/modules/timeutil" | ||||
|  | ||||
| 	"github.com/unknwon/com" | ||||
| @@ -354,20 +353,6 @@ func (c *Comment) PRURL() string { | ||||
| 	return c.Issue.HTMLURL() | ||||
| } | ||||
|  | ||||
| // APIFormat converts a Comment to the api.Comment format | ||||
| func (c *Comment) APIFormat() *api.Comment { | ||||
| 	return &api.Comment{ | ||||
| 		ID:       c.ID, | ||||
| 		Poster:   c.Poster.APIFormat(), | ||||
| 		HTMLURL:  c.HTMLURL(), | ||||
| 		IssueURL: c.IssueURL(), | ||||
| 		PRURL:    c.PRURL(), | ||||
| 		Body:     c.Content, | ||||
| 		Created:  c.CreatedUnix.AsTime(), | ||||
| 		Updated:  c.UpdatedUnix.AsTime(), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // CommentHashTag returns unique hash tag for comment id. | ||||
| func CommentHashTag(id int64) string { | ||||
| 	return fmt.Sprintf("issuecomment-%d", id) | ||||
|   | ||||
| @@ -12,7 +12,6 @@ import ( | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
| 	"code.gitea.io/gitea/modules/structs" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/modules/timeutil" | ||||
|  | ||||
| 	"xorm.io/builder" | ||||
| @@ -86,31 +85,6 @@ func (r *Release) HTMLURL() string { | ||||
| 	return fmt.Sprintf("%s/releases/tag/%s", r.Repo.HTMLURL(), r.TagName) | ||||
| } | ||||
|  | ||||
| // APIFormat convert a Release to api.Release | ||||
| func (r *Release) APIFormat() *api.Release { | ||||
| 	assets := make([]*api.Attachment, 0) | ||||
| 	for _, att := range r.Attachments { | ||||
| 		assets = append(assets, att.APIFormat()) | ||||
| 	} | ||||
| 	return &api.Release{ | ||||
| 		ID:           r.ID, | ||||
| 		TagName:      r.TagName, | ||||
| 		Target:       r.Target, | ||||
| 		Title:        r.Title, | ||||
| 		Note:         r.Note, | ||||
| 		URL:          r.APIURL(), | ||||
| 		HTMLURL:      r.HTMLURL(), | ||||
| 		TarURL:       r.TarURL(), | ||||
| 		ZipURL:       r.ZipURL(), | ||||
| 		IsDraft:      r.IsDraft, | ||||
| 		IsPrerelease: r.IsPrerelease, | ||||
| 		CreatedAt:    r.CreatedUnix.AsTime(), | ||||
| 		PublishedAt:  r.CreatedUnix.AsTime(), | ||||
| 		Publisher:    r.Publisher.APIFormat(), | ||||
| 		Attachments:  assets, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // IsReleaseExist returns true if release with given tag name already exists. | ||||
| func IsReleaseExist(repoID int64, tagName string) (bool, error) { | ||||
| 	if len(tagName) == 0 { | ||||
|   | ||||
| @@ -411,7 +411,16 @@ func (repo *Repository) innerAPIFormat(e Engine, mode AccessMode, isParent bool) | ||||
|  | ||||
| 	return &api.Repository{ | ||||
| 		ID: repo.ID, | ||||
| 		Owner:                     repo.Owner.APIFormat(), | ||||
| 		// TODO use convert.ToUser(repo.Owner) | ||||
| 		Owner: &api.User{ | ||||
| 			ID:        repo.Owner.ID, | ||||
| 			UserName:  repo.Owner.Name, | ||||
| 			FullName:  repo.Owner.FullName, | ||||
| 			Email:     repo.Owner.GetEmail(), | ||||
| 			AvatarURL: repo.Owner.AvatarLink(), | ||||
| 			LastLogin: repo.Owner.LastLoginUnix.AsTime(), | ||||
| 			Created:   repo.Owner.CreatedUnix.AsTime(), | ||||
| 		}, | ||||
| 		Name:                      repo.Name, | ||||
| 		FullName:                  repo.FullName(), | ||||
| 		Description:               repo.Description, | ||||
|   | ||||
| @@ -29,7 +29,6 @@ import ( | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
| 	"code.gitea.io/gitea/modules/storage" | ||||
| 	"code.gitea.io/gitea/modules/structs" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/modules/timeutil" | ||||
| 	"code.gitea.io/gitea/modules/util" | ||||
|  | ||||
| @@ -241,24 +240,6 @@ func GetAllUsers() ([]*User, error) { | ||||
| 	return users, x.OrderBy("id").Find(&users) | ||||
| } | ||||
|  | ||||
| // APIFormat converts a User to api.User | ||||
| func (u *User) APIFormat() *api.User { | ||||
| 	if u == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return &api.User{ | ||||
| 		ID:        u.ID, | ||||
| 		UserName:  u.Name, | ||||
| 		FullName:  u.FullName, | ||||
| 		Email:     u.GetEmail(), | ||||
| 		AvatarURL: u.AvatarLink(), | ||||
| 		Language:  u.Language, | ||||
| 		IsAdmin:   u.IsAdmin, | ||||
| 		LastLogin: u.LastLoginUnix.AsTime(), | ||||
| 		Created:   u.CreatedUnix.AsTime(), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // IsLocal returns true if user login type is LoginPlain. | ||||
| func (u *User) IsLocal() bool { | ||||
| 	return u.LoginType <= LoginPlain | ||||
|   | ||||
| @@ -78,23 +78,6 @@ func TestGetUserEmailsByNames(t *testing.T) { | ||||
| 	assert.Equal(t, []string{"user8@example.com"}, GetUserEmailsByNames([]string{"user8", "user7"})) | ||||
| } | ||||
|  | ||||
| func TestUser_APIFormat(t *testing.T) { | ||||
|  | ||||
| 	user, err := GetUserByID(1) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.True(t, user.IsAdmin) | ||||
|  | ||||
| 	apiUser := user.APIFormat() | ||||
| 	assert.True(t, apiUser.IsAdmin) | ||||
|  | ||||
| 	user, err = GetUserByID(2) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.False(t, user.IsAdmin) | ||||
|  | ||||
| 	apiUser = user.APIFormat() | ||||
| 	assert.False(t, apiUser.IsAdmin) | ||||
| } | ||||
|  | ||||
| func TestCanCreateOrganization(t *testing.T) { | ||||
| 	assert.NoError(t, PrepareTestDatabase()) | ||||
|  | ||||
|   | ||||
| @@ -8,7 +8,6 @@ import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| ) | ||||
|  | ||||
| //UserList is a list of user. | ||||
| @@ -94,12 +93,3 @@ func (users UserList) loadTwoFactorStatus(e Engine) (map[int64]*TwoFactor, error | ||||
| 	} | ||||
| 	return tokenMaps, nil | ||||
| } | ||||
|  | ||||
| //APIFormat return list of users in api format | ||||
| func (users UserList) APIFormat() []*api.User { | ||||
| 	result := make([]*api.User, 0, len(users)) | ||||
| 	for _, u := range users { | ||||
| 		result = append(result, u.APIFormat()) | ||||
| 	} | ||||
| 	return result | ||||
| } | ||||
|   | ||||
| @@ -339,3 +339,24 @@ func ToOAuth2Application(app *models.OAuth2Application) *api.OAuth2Application { | ||||
| 		Created:      app.CreatedUnix.AsTime(), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ToCommitStatus converts models.CommitStatus to api.Status | ||||
| func ToCommitStatus(status *models.CommitStatus) *api.Status { | ||||
| 	apiStatus := &api.Status{ | ||||
| 		Created:     status.CreatedUnix.AsTime(), | ||||
| 		Updated:     status.CreatedUnix.AsTime(), | ||||
| 		State:       api.StatusState(status.State), | ||||
| 		TargetURL:   status.TargetURL, | ||||
| 		Description: status.Description, | ||||
| 		ID:          status.Index, | ||||
| 		URL:         status.APIURL(), | ||||
| 		Context:     status.Context, | ||||
| 	} | ||||
|  | ||||
| 	if status.CreatorID != 0 { | ||||
| 		creator, _ := models.GetUserByID(status.CreatorID) | ||||
| 		apiStatus.Creator = ToUser(creator, false, false) | ||||
| 	} | ||||
|  | ||||
| 	return apiStatus | ||||
| } | ||||
|   | ||||
| @@ -86,13 +86,13 @@ func ToCommit(repo *models.Repository, commit *git.Commit, userCache map[string] | ||||
| 	} | ||||
|  | ||||
| 	if ok { | ||||
| 		apiAuthor = cacheAuthor.APIFormat() | ||||
| 		apiAuthor = ToUser(cacheAuthor, false, false) | ||||
| 	} else { | ||||
| 		author, err := models.GetUserByEmail(commit.Author.Email) | ||||
| 		if err != nil && !models.IsErrUserNotExist(err) { | ||||
| 			return nil, err | ||||
| 		} else if err == nil { | ||||
| 			apiAuthor = author.APIFormat() | ||||
| 			apiAuthor = ToUser(author, false, false) | ||||
| 			if userCache != nil { | ||||
| 				userCache[commit.Author.Email] = author | ||||
| 			} | ||||
| @@ -108,13 +108,13 @@ func ToCommit(repo *models.Repository, commit *git.Commit, userCache map[string] | ||||
| 	} | ||||
|  | ||||
| 	if ok { | ||||
| 		apiCommitter = cacheCommitter.APIFormat() | ||||
| 		apiCommitter = ToUser(cacheCommitter, false, false) | ||||
| 	} else { | ||||
| 		committer, err := models.GetUserByEmail(commit.Committer.Email) | ||||
| 		if err != nil && !models.IsErrUserNotExist(err) { | ||||
| 			return nil, err | ||||
| 		} else if err == nil { | ||||
| 			apiCommitter = committer.APIFormat() | ||||
| 			apiCommitter = ToUser(committer, false, false) | ||||
| 			if userCache != nil { | ||||
| 				userCache[commit.Committer.Email] = committer | ||||
| 			} | ||||
|   | ||||
| @@ -31,7 +31,7 @@ func ToAPIIssue(issue *models.Issue) *api.Issue { | ||||
| 		URL:      issue.APIURL(), | ||||
| 		HTMLURL:  issue.HTMLURL(), | ||||
| 		Index:    issue.Index, | ||||
| 		Poster:   issue.Poster.APIFormat(), | ||||
| 		Poster:   ToUser(issue.Poster, false, false), | ||||
| 		Title:    issue.Title, | ||||
| 		Body:     issue.Content, | ||||
| 		Labels:   ToLabelList(issue.Labels), | ||||
| @@ -65,9 +65,9 @@ func ToAPIIssue(issue *models.Issue) *api.Issue { | ||||
| 	} | ||||
| 	if len(issue.Assignees) > 0 { | ||||
| 		for _, assignee := range issue.Assignees { | ||||
| 			apiIssue.Assignees = append(apiIssue.Assignees, assignee.APIFormat()) | ||||
| 			apiIssue.Assignees = append(apiIssue.Assignees, ToUser(assignee, false, false)) | ||||
| 		} | ||||
| 		apiIssue.Assignee = issue.Assignees[0].APIFormat() // For compatibility, we're keeping the first assignee as `apiIssue.Assignee` | ||||
| 		apiIssue.Assignee = ToUser(issue.Assignees[0], false, false) // For compatibility, we're keeping the first assignee as `apiIssue.Assignee` | ||||
| 	} | ||||
| 	if issue.IsPull { | ||||
| 		if err := issue.LoadPullRequest(); err != nil { | ||||
|   | ||||
							
								
								
									
										24
									
								
								modules/convert/issue_comment.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								modules/convert/issue_comment.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved. | ||||
| // Use of this source code is governed by a MIT-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package convert | ||||
|  | ||||
| import ( | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| ) | ||||
|  | ||||
| // ToComment converts a models.Comment to the api.Comment format | ||||
| func ToComment(c *models.Comment) *api.Comment { | ||||
| 	return &api.Comment{ | ||||
| 		ID:       c.ID, | ||||
| 		Poster:   ToUser(c.Poster, false, false), | ||||
| 		HTMLURL:  c.HTMLURL(), | ||||
| 		IssueURL: c.IssueURL(), | ||||
| 		PRURL:    c.PRURL(), | ||||
| 		Body:     c.Content, | ||||
| 		Created:  c.CreatedUnix.AsTime(), | ||||
| 		Updated:  c.UpdatedUnix.AsTime(), | ||||
| 	} | ||||
| } | ||||
| @@ -141,7 +141,7 @@ func ToAPIPullRequest(pr *models.PullRequest) *api.PullRequest { | ||||
| 	if pr.HasMerged { | ||||
| 		apiPullRequest.Merged = pr.MergedUnix.AsTimePtr() | ||||
| 		apiPullRequest.MergedCommitID = &pr.MergedCommitID | ||||
| 		apiPullRequest.MergedBy = pr.Merger.APIFormat() | ||||
| 		apiPullRequest.MergedBy = ToUser(pr.Merger, false, false) | ||||
| 	} | ||||
|  | ||||
| 	return apiPullRequest | ||||
|   | ||||
							
								
								
									
										48
									
								
								modules/convert/release.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								modules/convert/release.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved. | ||||
| // Use of this source code is governed by a MIT-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package convert | ||||
|  | ||||
| import ( | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| ) | ||||
|  | ||||
| // ToRelease convert a models.Release to api.Release | ||||
| func ToRelease(r *models.Release) *api.Release { | ||||
| 	assets := make([]*api.Attachment, 0) | ||||
| 	for _, att := range r.Attachments { | ||||
| 		assets = append(assets, ToReleaseAttachment(att)) | ||||
| 	} | ||||
| 	return &api.Release{ | ||||
| 		ID:           r.ID, | ||||
| 		TagName:      r.TagName, | ||||
| 		Target:       r.Target, | ||||
| 		Title:        r.Title, | ||||
| 		Note:         r.Note, | ||||
| 		URL:          r.APIURL(), | ||||
| 		HTMLURL:      r.HTMLURL(), | ||||
| 		TarURL:       r.TarURL(), | ||||
| 		ZipURL:       r.ZipURL(), | ||||
| 		IsDraft:      r.IsDraft, | ||||
| 		IsPrerelease: r.IsPrerelease, | ||||
| 		CreatedAt:    r.CreatedUnix.AsTime(), | ||||
| 		PublishedAt:  r.CreatedUnix.AsTime(), | ||||
| 		Publisher:    ToUser(r.Publisher, false, false), | ||||
| 		Attachments:  assets, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ToReleaseAttachment converts models.Attachment to api.Attachment | ||||
| func ToReleaseAttachment(a *models.Attachment) *api.Attachment { | ||||
| 	return &api.Attachment{ | ||||
| 		ID:            a.ID, | ||||
| 		Name:          a.Name, | ||||
| 		Created:       a.CreatedUnix.AsTime(), | ||||
| 		DownloadCount: a.DownloadCount, | ||||
| 		Size:          a.Size, | ||||
| 		UUID:          a.UUID, | ||||
| 		DownloadURL:   a.DownloadURL(), | ||||
| 	} | ||||
| } | ||||
| @@ -13,6 +13,9 @@ import ( | ||||
| // ToUser convert models.User to api.User | ||||
| // signed shall only be set if requester is logged in. authed shall only be set if user is site admin or user himself | ||||
| func ToUser(user *models.User, signed, authed bool) *api.User { | ||||
| 	if user == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	result := &api.User{ | ||||
| 		ID:        user.ID, | ||||
| 		UserName:  user.Name, | ||||
|   | ||||
							
								
								
									
										28
									
								
								modules/convert/user_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								modules/convert/user_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| // Copyright 2020 The Gitea Authors. All rights reserved. | ||||
| // Use of this source code is governed by a MIT-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package convert | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestUser_ToUser(t *testing.T) { | ||||
|  | ||||
| 	user1 := models.AssertExistsAndLoadBean(t, &models.User{ID: 1, IsAdmin: true}).(*models.User) | ||||
|  | ||||
| 	apiUser := ToUser(user1, true, true) | ||||
| 	assert.True(t, apiUser.IsAdmin) | ||||
|  | ||||
| 	user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2, IsAdmin: false}).(*models.User) | ||||
|  | ||||
| 	apiUser = ToUser(user2, true, true) | ||||
| 	assert.False(t, apiUser.IsAdmin) | ||||
|  | ||||
| 	apiUser = ToUser(user1, false, false) | ||||
| 	assert.False(t, apiUser.IsAdmin) | ||||
| } | ||||
| @@ -53,7 +53,7 @@ func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *model | ||||
| 			Index:       issue.Index, | ||||
| 			PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | ||||
| 			Repository:  issue.Repo.APIFormat(mode), | ||||
| 			Sender:      doer.APIFormat(), | ||||
| 			Sender:      convert.ToUser(doer, false, false), | ||||
| 		}) | ||||
| 	} else { | ||||
| 		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssueLabel, &api.IssuePayload{ | ||||
| @@ -61,7 +61,7 @@ func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *model | ||||
| 			Index:      issue.Index, | ||||
| 			Issue:      convert.ToAPIIssue(issue), | ||||
| 			Repository: issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 		}) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| @@ -77,7 +77,7 @@ func (m *webhookNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo | ||||
| 	if err := webhook_module.PrepareWebhooks(oldRepo, models.HookEventFork, &api.ForkPayload{ | ||||
| 		Forkee: oldRepo.APIFormat(oldMode), | ||||
| 		Repo:   repo.APIFormat(mode), | ||||
| 		Sender: doer.APIFormat(), | ||||
| 		Sender: convert.ToUser(doer, false, false), | ||||
| 	}); err != nil { | ||||
| 		log.Error("PrepareWebhooks [repo_id: %d]: %v", oldRepo.ID, err) | ||||
| 	} | ||||
| @@ -89,8 +89,8 @@ func (m *webhookNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo | ||||
| 		if err := webhook_module.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{ | ||||
| 			Action:       api.HookRepoCreated, | ||||
| 			Repository:   repo.APIFormat(models.AccessModeOwner), | ||||
| 			Organization: u.APIFormat(), | ||||
| 			Sender:       doer.APIFormat(), | ||||
| 			Organization: convert.ToUser(u, false, false), | ||||
| 			Sender:       convert.ToUser(doer, false, false), | ||||
| 		}); err != nil { | ||||
| 			log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err) | ||||
| 		} | ||||
| @@ -102,8 +102,8 @@ func (m *webhookNotifier) NotifyCreateRepository(doer *models.User, u *models.Us | ||||
| 	if err := webhook_module.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{ | ||||
| 		Action:       api.HookRepoCreated, | ||||
| 		Repository:   repo.APIFormat(models.AccessModeOwner), | ||||
| 		Organization: u.APIFormat(), | ||||
| 		Sender:       doer.APIFormat(), | ||||
| 		Organization: convert.ToUser(u, false, false), | ||||
| 		Sender:       convert.ToUser(doer, false, false), | ||||
| 	}); err != nil { | ||||
| 		log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err) | ||||
| 	} | ||||
| @@ -115,8 +115,8 @@ func (m *webhookNotifier) NotifyDeleteRepository(doer *models.User, repo *models | ||||
| 	if err := webhook_module.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{ | ||||
| 		Action:       api.HookRepoDeleted, | ||||
| 		Repository:   repo.APIFormat(models.AccessModeOwner), | ||||
| 		Organization: u.APIFormat(), | ||||
| 		Sender:       doer.APIFormat(), | ||||
| 		Organization: convert.ToUser(u, false, false), | ||||
| 		Sender:       convert.ToUser(doer, false, false), | ||||
| 	}); err != nil { | ||||
| 		log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err) | ||||
| 	} | ||||
| @@ -135,7 +135,7 @@ func (m *webhookNotifier) NotifyIssueChangeAssignee(doer *models.User, issue *mo | ||||
| 			Index:       issue.Index, | ||||
| 			PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | ||||
| 			Repository:  issue.Repo.APIFormat(mode), | ||||
| 			Sender:      doer.APIFormat(), | ||||
| 			Sender:      convert.ToUser(doer, false, false), | ||||
| 		} | ||||
| 		if removed { | ||||
| 			apiPullRequest.Action = api.HookIssueUnassigned | ||||
| @@ -153,7 +153,7 @@ func (m *webhookNotifier) NotifyIssueChangeAssignee(doer *models.User, issue *mo | ||||
| 			Index:      issue.Index, | ||||
| 			Issue:      convert.ToAPIIssue(issue), | ||||
| 			Repository: issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 		} | ||||
| 		if removed { | ||||
| 			apiIssue.Action = api.HookIssueUnassigned | ||||
| @@ -187,7 +187,7 @@ func (m *webhookNotifier) NotifyIssueChangeTitle(doer *models.User, issue *model | ||||
| 			}, | ||||
| 			PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | ||||
| 			Repository:  issue.Repo.APIFormat(mode), | ||||
| 			Sender:      doer.APIFormat(), | ||||
| 			Sender:      convert.ToUser(doer, false, false), | ||||
| 		}) | ||||
| 	} else { | ||||
| 		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssues, &api.IssuePayload{ | ||||
| @@ -200,7 +200,7 @@ func (m *webhookNotifier) NotifyIssueChangeTitle(doer *models.User, issue *model | ||||
| 			}, | ||||
| 			Issue:      convert.ToAPIIssue(issue), | ||||
| 			Repository: issue.Repo.APIFormat(mode), | ||||
| 			Sender:     issue.Poster.APIFormat(), | ||||
| 			Sender:     convert.ToUser(issue.Poster, false, false), | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| @@ -222,7 +222,7 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(doer *models.User, issue *mode | ||||
| 			Index:       issue.Index, | ||||
| 			PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | ||||
| 			Repository:  issue.Repo.APIFormat(mode), | ||||
| 			Sender:      doer.APIFormat(), | ||||
| 			Sender:      convert.ToUser(doer, false, false), | ||||
| 		} | ||||
| 		if isClosed { | ||||
| 			apiPullRequest.Action = api.HookIssueClosed | ||||
| @@ -235,7 +235,7 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(doer *models.User, issue *mode | ||||
| 			Index:      issue.Index, | ||||
| 			Issue:      convert.ToAPIIssue(issue), | ||||
| 			Repository: issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 		} | ||||
| 		if isClosed { | ||||
| 			apiIssue.Action = api.HookIssueClosed | ||||
| @@ -265,7 +265,7 @@ func (m *webhookNotifier) NotifyNewIssue(issue *models.Issue) { | ||||
| 		Index:      issue.Index, | ||||
| 		Issue:      convert.ToAPIIssue(issue), | ||||
| 		Repository: issue.Repo.APIFormat(mode), | ||||
| 		Sender:     issue.Poster.APIFormat(), | ||||
| 		Sender:     convert.ToUser(issue.Poster, false, false), | ||||
| 	}); err != nil { | ||||
| 		log.Error("PrepareWebhooks: %v", err) | ||||
| 	} | ||||
| @@ -291,7 +291,7 @@ func (m *webhookNotifier) NotifyNewPullRequest(pull *models.PullRequest) { | ||||
| 		Index:       pull.Issue.Index, | ||||
| 		PullRequest: convert.ToAPIPullRequest(pull), | ||||
| 		Repository:  pull.Issue.Repo.APIFormat(mode), | ||||
| 		Sender:      pull.Issue.Poster.APIFormat(), | ||||
| 		Sender:      convert.ToUser(pull.Issue.Poster, false, false), | ||||
| 	}); err != nil { | ||||
| 		log.Error("PrepareWebhooks: %v", err) | ||||
| 	} | ||||
| @@ -312,7 +312,7 @@ func (m *webhookNotifier) NotifyIssueChangeContent(doer *models.User, issue *mod | ||||
| 			}, | ||||
| 			PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | ||||
| 			Repository:  issue.Repo.APIFormat(mode), | ||||
| 			Sender:      doer.APIFormat(), | ||||
| 			Sender:      convert.ToUser(doer, false, false), | ||||
| 		}) | ||||
| 	} else { | ||||
| 		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssues, &api.IssuePayload{ | ||||
| @@ -325,7 +325,7 @@ func (m *webhookNotifier) NotifyIssueChangeContent(doer *models.User, issue *mod | ||||
| 			}, | ||||
| 			Issue:      convert.ToAPIIssue(issue), | ||||
| 			Repository: issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 		}) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| @@ -355,28 +355,28 @@ func (m *webhookNotifier) NotifyUpdateComment(doer *models.User, c *models.Comme | ||||
| 		err = webhook_module.PrepareWebhooks(c.Issue.Repo, models.HookEventPullRequestComment, &api.IssueCommentPayload{ | ||||
| 			Action:  api.HookIssueCommentEdited, | ||||
| 			Issue:   convert.ToAPIIssue(c.Issue), | ||||
| 			Comment: c.APIFormat(), | ||||
| 			Comment: convert.ToComment(c), | ||||
| 			Changes: &api.ChangesPayload{ | ||||
| 				Body: &api.ChangesFromPayload{ | ||||
| 					From: oldContent, | ||||
| 				}, | ||||
| 			}, | ||||
| 			Repository: c.Issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 			IsPull:     true, | ||||
| 		}) | ||||
| 	} else { | ||||
| 		err = webhook_module.PrepareWebhooks(c.Issue.Repo, models.HookEventIssueComment, &api.IssueCommentPayload{ | ||||
| 			Action:  api.HookIssueCommentEdited, | ||||
| 			Issue:   convert.ToAPIIssue(c.Issue), | ||||
| 			Comment: c.APIFormat(), | ||||
| 			Comment: convert.ToComment(c), | ||||
| 			Changes: &api.ChangesPayload{ | ||||
| 				Body: &api.ChangesFromPayload{ | ||||
| 					From: oldContent, | ||||
| 				}, | ||||
| 			}, | ||||
| 			Repository: c.Issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 			IsPull:     false, | ||||
| 		}) | ||||
| 	} | ||||
| @@ -395,18 +395,18 @@ func (m *webhookNotifier) NotifyCreateIssueComment(doer *models.User, repo *mode | ||||
| 		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventPullRequestComment, &api.IssueCommentPayload{ | ||||
| 			Action:     api.HookIssueCommentCreated, | ||||
| 			Issue:      convert.ToAPIIssue(issue), | ||||
| 			Comment:    comment.APIFormat(), | ||||
| 			Comment:    convert.ToComment(comment), | ||||
| 			Repository: repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 			IsPull:     true, | ||||
| 		}) | ||||
| 	} else { | ||||
| 		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssueComment, &api.IssueCommentPayload{ | ||||
| 			Action:     api.HookIssueCommentCreated, | ||||
| 			Issue:      convert.ToAPIIssue(issue), | ||||
| 			Comment:    comment.APIFormat(), | ||||
| 			Comment:    convert.ToComment(comment), | ||||
| 			Repository: repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 			IsPull:     false, | ||||
| 		}) | ||||
| 	} | ||||
| @@ -439,18 +439,18 @@ func (m *webhookNotifier) NotifyDeleteComment(doer *models.User, comment *models | ||||
| 		err = webhook_module.PrepareWebhooks(comment.Issue.Repo, models.HookEventPullRequestComment, &api.IssueCommentPayload{ | ||||
| 			Action:     api.HookIssueCommentDeleted, | ||||
| 			Issue:      convert.ToAPIIssue(comment.Issue), | ||||
| 			Comment:    comment.APIFormat(), | ||||
| 			Comment:    convert.ToComment(comment), | ||||
| 			Repository: comment.Issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 			IsPull:     true, | ||||
| 		}) | ||||
| 	} else { | ||||
| 		err = webhook_module.PrepareWebhooks(comment.Issue.Repo, models.HookEventIssueComment, &api.IssueCommentPayload{ | ||||
| 			Action:     api.HookIssueCommentDeleted, | ||||
| 			Issue:      convert.ToAPIIssue(comment.Issue), | ||||
| 			Comment:    comment.APIFormat(), | ||||
| 			Comment:    convert.ToComment(comment), | ||||
| 			Repository: comment.Issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 			IsPull:     false, | ||||
| 		}) | ||||
| 	} | ||||
| @@ -490,7 +490,7 @@ func (m *webhookNotifier) NotifyIssueChangeLabels(doer *models.User, issue *mode | ||||
| 			Index:       issue.Index, | ||||
| 			PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | ||||
| 			Repository:  issue.Repo.APIFormat(models.AccessModeNone), | ||||
| 			Sender:      doer.APIFormat(), | ||||
| 			Sender:      convert.ToUser(doer, false, false), | ||||
| 		}) | ||||
| 	} else { | ||||
| 		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssueLabel, &api.IssuePayload{ | ||||
| @@ -498,7 +498,7 @@ func (m *webhookNotifier) NotifyIssueChangeLabels(doer *models.User, issue *mode | ||||
| 			Index:      issue.Index, | ||||
| 			Issue:      convert.ToAPIIssue(issue), | ||||
| 			Repository: issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 		}) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| @@ -532,7 +532,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(doer *models.User, issue *m | ||||
| 			Index:       issue.Index, | ||||
| 			PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | ||||
| 			Repository:  issue.Repo.APIFormat(mode), | ||||
| 			Sender:      doer.APIFormat(), | ||||
| 			Sender:      convert.ToUser(doer, false, false), | ||||
| 		}) | ||||
| 	} else { | ||||
| 		err = webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssueMilestone, &api.IssuePayload{ | ||||
| @@ -540,7 +540,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(doer *models.User, issue *m | ||||
| 			Index:      issue.Index, | ||||
| 			Issue:      convert.ToAPIIssue(issue), | ||||
| 			Repository: issue.Repo.APIFormat(mode), | ||||
| 			Sender:     doer.APIFormat(), | ||||
| 			Sender:     convert.ToUser(doer, false, false), | ||||
| 		}) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| @@ -549,7 +549,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(doer *models.User, issue *m | ||||
| } | ||||
|  | ||||
| func (m *webhookNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | ||||
| 	apiPusher := pusher.APIFormat() | ||||
| 	apiPusher := convert.ToUser(pusher, false, false) | ||||
| 	apiCommits, err := commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) | ||||
| 	if err != nil { | ||||
| 		log.Error("commits.ToAPIPayloadCommits failed: %v", err) | ||||
| @@ -598,7 +598,7 @@ func (*webhookNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *mod | ||||
| 		Index:       pr.Issue.Index, | ||||
| 		PullRequest: convert.ToAPIPullRequest(pr), | ||||
| 		Repository:  pr.Issue.Repo.APIFormat(mode), | ||||
| 		Sender:      doer.APIFormat(), | ||||
| 		Sender:      convert.ToUser(doer, false, false), | ||||
| 		Action:      api.HookIssueClosed, | ||||
| 	} | ||||
|  | ||||
| @@ -631,7 +631,7 @@ func (m *webhookNotifier) NotifyPullRequestChangeTargetBranch(doer *models.User, | ||||
| 		}, | ||||
| 		PullRequest: convert.ToAPIPullRequest(issue.PullRequest), | ||||
| 		Repository:  issue.Repo.APIFormat(mode), | ||||
| 		Sender:      doer.APIFormat(), | ||||
| 		Sender:      convert.ToUser(doer, false, false), | ||||
| 	}) | ||||
|  | ||||
| 	if err != nil { | ||||
| @@ -670,7 +670,7 @@ func (m *webhookNotifier) NotifyPullRequestReview(pr *models.PullRequest, review | ||||
| 		Index:       review.Issue.Index, | ||||
| 		PullRequest: convert.ToAPIPullRequest(pr), | ||||
| 		Repository:  review.Issue.Repo.APIFormat(mode), | ||||
| 		Sender:      review.Reviewer.APIFormat(), | ||||
| 		Sender:      convert.ToUser(review.Reviewer, false, false), | ||||
| 		Review: &api.ReviewPayload{ | ||||
| 			Type:    string(reviewHookType), | ||||
| 			Content: review.Content, | ||||
| @@ -681,7 +681,7 @@ func (m *webhookNotifier) NotifyPullRequestReview(pr *models.PullRequest, review | ||||
| } | ||||
|  | ||||
| func (m *webhookNotifier) NotifyCreateRef(pusher *models.User, repo *models.Repository, refType, refFullName string) { | ||||
| 	apiPusher := pusher.APIFormat() | ||||
| 	apiPusher := convert.ToUser(pusher, false, false) | ||||
| 	apiRepo := repo.APIFormat(models.AccessModeNone) | ||||
| 	refName := git.RefEndName(refFullName) | ||||
|  | ||||
| @@ -725,14 +725,14 @@ func (m *webhookNotifier) NotifyPullRequestSynchronized(doer *models.User, pr *m | ||||
| 		Index:       pr.Issue.Index, | ||||
| 		PullRequest: convert.ToAPIPullRequest(pr), | ||||
| 		Repository:  pr.Issue.Repo.APIFormat(models.AccessModeNone), | ||||
| 		Sender:      doer.APIFormat(), | ||||
| 		Sender:      convert.ToUser(doer, false, false), | ||||
| 	}); err != nil { | ||||
| 		log.Error("PrepareWebhooks [pull_id: %v]: %v", pr.ID, err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (m *webhookNotifier) NotifyDeleteRef(pusher *models.User, repo *models.Repository, refType, refFullName string) { | ||||
| 	apiPusher := pusher.APIFormat() | ||||
| 	apiPusher := convert.ToUser(pusher, false, false) | ||||
| 	apiRepo := repo.APIFormat(models.AccessModeNone) | ||||
| 	refName := git.RefEndName(refFullName) | ||||
|  | ||||
| @@ -756,9 +756,9 @@ func sendReleaseHook(doer *models.User, rel *models.Release, action api.HookRele | ||||
| 	mode, _ := models.AccessLevel(rel.Publisher, rel.Repo) | ||||
| 	if err := webhook_module.PrepareWebhooks(rel.Repo, models.HookEventRelease, &api.ReleasePayload{ | ||||
| 		Action:     action, | ||||
| 		Release:    rel.APIFormat(), | ||||
| 		Release:    convert.ToRelease(rel), | ||||
| 		Repository: rel.Repo.APIFormat(mode), | ||||
| 		Sender:     rel.Publisher.APIFormat(), | ||||
| 		Sender:     convert.ToUser(rel.Publisher, false, false), | ||||
| 	}); err != nil { | ||||
| 		log.Error("PrepareWebhooks: %v", err) | ||||
| 	} | ||||
| @@ -777,7 +777,7 @@ func (m *webhookNotifier) NotifyDeleteRelease(doer *models.User, rel *models.Rel | ||||
| } | ||||
|  | ||||
| func (m *webhookNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, refName, oldCommitID, newCommitID string, commits *repository.PushCommits) { | ||||
| 	apiPusher := pusher.APIFormat() | ||||
| 	apiPusher := convert.ToUser(pusher, false, false) | ||||
| 	apiCommits, err := commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL()) | ||||
| 	if err != nil { | ||||
| 		log.Error("commits.ToAPIPayloadCommits failed: %v", err) | ||||
|   | ||||
| @@ -11,6 +11,7 @@ import ( | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||
| 	comment_service "code.gitea.io/gitea/services/comments" | ||||
| @@ -85,7 +86,7 @@ func ListIssueComments(ctx *context.APIContext) { | ||||
| 	apiComments := make([]*api.Comment, len(comments)) | ||||
| 	for i, comment := range comments { | ||||
| 		comment.Issue = issue | ||||
| 		apiComments[i] = comments[i].APIFormat() | ||||
| 		apiComments[i] = convert.ToComment(comments[i]) | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusOK, &apiComments) | ||||
| } | ||||
| @@ -167,7 +168,7 @@ func ListRepoIssueComments(ctx *context.APIContext) { | ||||
| 		return | ||||
| 	} | ||||
| 	for i := range comments { | ||||
| 		apiComments[i] = comments[i].APIFormat() | ||||
| 		apiComments[i] = convert.ToComment(comments[i]) | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusOK, &apiComments) | ||||
| } | ||||
| @@ -225,7 +226,7 @@ func CreateIssueComment(ctx *context.APIContext, form api.CreateIssueCommentOpti | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSON(http.StatusCreated, comment.APIFormat()) | ||||
| 	ctx.JSON(http.StatusCreated, convert.ToComment(comment)) | ||||
| } | ||||
|  | ||||
| // GetIssueComment Get a comment by ID | ||||
| @@ -293,7 +294,7 @@ func GetIssueComment(ctx *context.APIContext) { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSON(http.StatusOK, comment.APIFormat()) | ||||
| 	ctx.JSON(http.StatusOK, convert.ToComment(comment)) | ||||
| } | ||||
|  | ||||
| // EditIssueComment modify a comment of an issue | ||||
| @@ -414,7 +415,7 @@ func editIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSON(http.StatusOK, comment.APIFormat()) | ||||
| 	ctx.JSON(http.StatusOK, convert.ToComment(comment)) | ||||
| } | ||||
|  | ||||
| // DeleteIssueComment delete a comment from an issue | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import ( | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||
| ) | ||||
| @@ -75,7 +76,7 @@ func GetIssueCommentReactions(ctx *context.APIContext) { | ||||
| 	var result []api.Reaction | ||||
| 	for _, r := range reactions { | ||||
| 		result = append(result, api.Reaction{ | ||||
| 			User:     r.User.APIFormat(), | ||||
| 			User:     convert.ToUser(r.User, ctx.IsSigned, false), | ||||
| 			Reaction: r.Type, | ||||
| 			Created:  r.CreatedUnix.AsTime(), | ||||
| 		}) | ||||
| @@ -193,7 +194,7 @@ func changeIssueCommentReaction(ctx *context.APIContext, form api.EditReactionOp | ||||
| 				ctx.Error(http.StatusForbidden, err.Error(), err) | ||||
| 			} else if models.IsErrReactionAlreadyExist(err) { | ||||
| 				ctx.JSON(http.StatusOK, api.Reaction{ | ||||
| 					User:     ctx.User.APIFormat(), | ||||
| 					User:     convert.ToUser(ctx.User, true, true), | ||||
| 					Reaction: reaction.Type, | ||||
| 					Created:  reaction.CreatedUnix.AsTime(), | ||||
| 				}) | ||||
| @@ -204,7 +205,7 @@ func changeIssueCommentReaction(ctx *context.APIContext, form api.EditReactionOp | ||||
| 		} | ||||
|  | ||||
| 		ctx.JSON(http.StatusCreated, api.Reaction{ | ||||
| 			User:     ctx.User.APIFormat(), | ||||
| 			User:     convert.ToUser(ctx.User, true, true), | ||||
| 			Reaction: reaction.Type, | ||||
| 			Created:  reaction.CreatedUnix.AsTime(), | ||||
| 		}) | ||||
| @@ -289,7 +290,7 @@ func GetIssueReactions(ctx *context.APIContext) { | ||||
| 	var result []api.Reaction | ||||
| 	for _, r := range reactions { | ||||
| 		result = append(result, api.Reaction{ | ||||
| 			User:     r.User.APIFormat(), | ||||
| 			User:     convert.ToUser(r.User, ctx.IsSigned, false), | ||||
| 			Reaction: r.Type, | ||||
| 			Created:  r.CreatedUnix.AsTime(), | ||||
| 		}) | ||||
| @@ -402,7 +403,7 @@ func changeIssueReaction(ctx *context.APIContext, form api.EditReactionOption, i | ||||
| 				ctx.Error(http.StatusForbidden, err.Error(), err) | ||||
| 			} else if models.IsErrReactionAlreadyExist(err) { | ||||
| 				ctx.JSON(http.StatusOK, api.Reaction{ | ||||
| 					User:     ctx.User.APIFormat(), | ||||
| 					User:     convert.ToUser(ctx.User, true, true), | ||||
| 					Reaction: reaction.Type, | ||||
| 					Created:  reaction.CreatedUnix.AsTime(), | ||||
| 				}) | ||||
| @@ -413,7 +414,7 @@ func changeIssueReaction(ctx *context.APIContext, form api.EditReactionOption, i | ||||
| 		} | ||||
|  | ||||
| 		ctx.JSON(http.StatusCreated, api.Reaction{ | ||||
| 			User:     ctx.User.APIFormat(), | ||||
| 			User:     convert.ToUser(ctx.User, true, true), | ||||
| 			Reaction: reaction.Type, | ||||
| 			Created:  reaction.CreatedUnix.AsTime(), | ||||
| 		}) | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import ( | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||
| ) | ||||
| @@ -276,6 +277,10 @@ func GetIssueSubscribers(ctx *context.APIContext) { | ||||
| 		ctx.Error(http.StatusInternalServerError, "GetUsersByIDs", err) | ||||
| 		return | ||||
| 	} | ||||
| 	apiUsers := make([]*api.User, 0, len(users)) | ||||
| 	for i := range users { | ||||
| 		apiUsers[i] = convert.ToUser(users[i], ctx.IsSigned, false) | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSON(http.StatusOK, users.APIFormat()) | ||||
| 	ctx.JSON(http.StatusOK, apiUsers) | ||||
| } | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import ( | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||
| 	releaseservice "code.gitea.io/gitea/services/release" | ||||
| @@ -60,7 +61,7 @@ func GetRelease(ctx *context.APIContext) { | ||||
| 		ctx.Error(http.StatusInternalServerError, "LoadAttributes", err) | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusOK, release.APIFormat()) | ||||
| 	ctx.JSON(http.StatusOK, convert.ToRelease(release)) | ||||
| } | ||||
|  | ||||
| // ListReleases list a repository's releases | ||||
| @@ -117,7 +118,7 @@ func ListReleases(ctx *context.APIContext) { | ||||
| 			ctx.Error(http.StatusInternalServerError, "LoadAttributes", err) | ||||
| 			return | ||||
| 		} | ||||
| 		rels[i] = release.APIFormat() | ||||
| 		rels[i] = convert.ToRelease(release) | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusOK, rels) | ||||
| } | ||||
| @@ -205,7 +206,7 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) { | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusCreated, rel.APIFormat()) | ||||
| 	ctx.JSON(http.StatusCreated, convert.ToRelease(rel)) | ||||
| } | ||||
|  | ||||
| // EditRelease edit a release | ||||
| @@ -288,7 +289,7 @@ func EditRelease(ctx *context.APIContext, form api.EditReleaseOption) { | ||||
| 		ctx.Error(http.StatusInternalServerError, "LoadAttributes", err) | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusOK, rel.APIFormat()) | ||||
| 	ctx.JSON(http.StatusOK, convert.ToRelease(rel)) | ||||
| } | ||||
|  | ||||
| // DeleteRelease delete a release from a repository | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import ( | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| @@ -62,7 +63,7 @@ func GetReleaseAttachment(ctx *context.APIContext) { | ||||
| 		return | ||||
| 	} | ||||
| 	// FIXME Should prove the existence of the given repo, but results in unnecessary database requests | ||||
| 	ctx.JSON(http.StatusOK, attach.APIFormat()) | ||||
| 	ctx.JSON(http.StatusOK, convert.ToReleaseAttachment(attach)) | ||||
| } | ||||
|  | ||||
| // ListReleaseAttachments lists all attachments of the release | ||||
| @@ -107,7 +108,7 @@ func ListReleaseAttachments(ctx *context.APIContext) { | ||||
| 		ctx.Error(http.StatusInternalServerError, "LoadAttributes", err) | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusOK, release.APIFormat().Attachments) | ||||
| 	ctx.JSON(http.StatusOK, convert.ToRelease(release).Attachments) | ||||
| } | ||||
|  | ||||
| // CreateReleaseAttachment creates an attachment and saves the given file | ||||
| @@ -203,7 +204,7 @@ func CreateReleaseAttachment(ctx *context.APIContext) { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSON(http.StatusCreated, attach.APIFormat()) | ||||
| 	ctx.JSON(http.StatusCreated, convert.ToReleaseAttachment(attach)) | ||||
| } | ||||
|  | ||||
| // EditReleaseAttachment updates the given attachment | ||||
| @@ -267,7 +268,7 @@ func EditReleaseAttachment(ctx *context.APIContext, form api.EditAttachmentOptio | ||||
| 	if err := models.UpdateAttachment(attach); err != nil { | ||||
| 		ctx.Error(http.StatusInternalServerError, "UpdateAttachment", attach) | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusCreated, attach.APIFormat()) | ||||
| 	ctx.JSON(http.StatusCreated, convert.ToReleaseAttachment(attach)) | ||||
| } | ||||
|  | ||||
| // DeleteReleaseAttachment delete a given attachment | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import ( | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| ) | ||||
|  | ||||
| // GetReleaseTag get a single release of a repository by its tagname | ||||
| @@ -56,5 +57,5 @@ func GetReleaseTag(ctx *context.APIContext) { | ||||
| 		ctx.Error(http.StatusInternalServerError, "LoadAttributes", err) | ||||
| 		return | ||||
| 	} | ||||
| 	ctx.JSON(http.StatusOK, release.APIFormat()) | ||||
| 	ctx.JSON(http.StatusOK, convert.ToRelease(release)) | ||||
| } | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import ( | ||||
|  | ||||
| 	"code.gitea.io/gitea/models" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	"code.gitea.io/gitea/modules/repofiles" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||
| @@ -64,7 +65,7 @@ func NewCommitStatus(ctx *context.APIContext, form api.CreateStatusOption) { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSON(http.StatusCreated, status.APIFormat()) | ||||
| 	ctx.JSON(http.StatusCreated, convert.ToCommitStatus(status)) | ||||
| } | ||||
|  | ||||
| // GetCommitStatuses returns all statuses for any given commit hash | ||||
| @@ -222,7 +223,7 @@ func getCommitStatuses(ctx *context.APIContext, sha string) { | ||||
|  | ||||
| 	apiStatuses := make([]*api.Status, 0, len(statuses)) | ||||
| 	for _, status := range statuses { | ||||
| 		apiStatuses = append(apiStatuses, status.APIFormat()) | ||||
| 		apiStatuses = append(apiStatuses, convert.ToCommitStatus(status)) | ||||
| 	} | ||||
|  | ||||
| 	ctx.SetLinkHeader(int(maxResults), listOptions.PageSize) | ||||
| @@ -305,7 +306,7 @@ func GetCombinedCommitStatusByRef(ctx *context.APIContext) { | ||||
|  | ||||
| 	retStatus.Statuses = make([]*api.Status, 0, len(statuses)) | ||||
| 	for _, status := range statuses { | ||||
| 		retStatus.Statuses = append(retStatus.Statuses, status.APIFormat()) | ||||
| 		retStatus.Statuses = append(retStatus.Statuses, convert.ToCommitStatus(status)) | ||||
| 		if status.State.NoBetterThan(retStatus.State) { | ||||
| 			retStatus.State = status.State | ||||
| 		} | ||||
|   | ||||
| @@ -19,6 +19,7 @@ import ( | ||||
| 	"code.gitea.io/gitea/modules/auth" | ||||
| 	"code.gitea.io/gitea/modules/base" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	issue_indexer "code.gitea.io/gitea/modules/indexer/issues" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| @@ -2453,7 +2454,7 @@ func GetIssueAttachments(ctx *context.Context) { | ||||
| 	issue := GetActionIssue(ctx) | ||||
| 	var attachments = make([]*api.Attachment, len(issue.Attachments)) | ||||
| 	for i := 0; i < len(issue.Attachments); i++ { | ||||
| 		attachments[i] = issue.Attachments[i].APIFormat() | ||||
| 		attachments[i] = convert.ToReleaseAttachment(issue.Attachments[i]) | ||||
| 	} | ||||
| 	ctx.JSON(200, attachments) | ||||
| } | ||||
| @@ -2472,7 +2473,7 @@ func GetCommentAttachments(ctx *context.Context) { | ||||
| 			return | ||||
| 		} | ||||
| 		for i := 0; i < len(comment.Attachments); i++ { | ||||
| 			attachments = append(attachments, comment.Attachments[i].APIFormat()) | ||||
| 			attachments = append(attachments, convert.ToReleaseAttachment(comment.Attachments[i])) | ||||
| 		} | ||||
| 	} | ||||
| 	ctx.JSON(200, attachments) | ||||
|   | ||||
| @@ -16,6 +16,7 @@ import ( | ||||
| 	"code.gitea.io/gitea/modules/auth" | ||||
| 	"code.gitea.io/gitea/modules/base" | ||||
| 	"code.gitea.io/gitea/modules/context" | ||||
| 	"code.gitea.io/gitea/modules/convert" | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	"code.gitea.io/gitea/modules/setting" | ||||
| 	api "code.gitea.io/gitea/modules/structs" | ||||
| @@ -1052,7 +1053,7 @@ func TestWebhook(ctx *context.Context) { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	apiUser := ctx.User.APIFormat() | ||||
| 	apiUser := convert.ToUser(ctx.User, true, true) | ||||
| 	p := &api.PushPayload{ | ||||
| 		Ref:    git.BranchPrefix + ctx.Repo.Repository.DefaultBranch, | ||||
| 		Before: commit.ID.String(), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user