-
-
Notifications
You must be signed in to change notification settings - Fork 5.8k
Add API to get/edit wiki #17278
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Add API to get/edit wiki #17278
Changes from 57 commits
Commits
Show all changes
63 commits
Select commit
Hold shift + click to select a range
878481b
Add API to get/edit wiki
qwerty287 7981a21
Add swagger docs, various improvements
qwerty287 48db90e
fmt
qwerty287 30a2377
Fix lint and rm comment
qwerty287 1312d58
Add page parameter
qwerty287 7f5b4ef
Add pagination to pages
qwerty287 ba25936
Merge branch 'main' into wiki-api
qwerty287 58fb2f6
Add tests
qwerty287 06bb4cf
fmt
qwerty287 c908b69
Update func names
qwerty287 d3ef69c
Update error handling
qwerty287 53f82fa
Update type name
qwerty287 8600b87
Fix lint
qwerty287 ceabfd7
Don't delete Home
qwerty287 23f6475
Update func name
qwerty287 77e42d5
Update routers/api/v1/repo/wiki.go
qwerty287 cfa6303
Remove unnecessary check
qwerty287 63ea38e
Fix lint
qwerty287 8d568a4
Use English strings
qwerty287 bfbe3ac
Update integrations/api_wiki_test.go
qwerty287 65d1951
Update func and test names
qwerty287 3027d3f
Remove unsed check and avoid duplicated error reports
qwerty287 fc8443a
Improve error handling
qwerty287 1ea3fe1
Return after error
qwerty287 eefb617
Document 404 error
qwerty287 b0ef969
Update swagger
qwerty287 fd76be3
Fix lint
qwerty287 adbaf41
Merge branch 'main' into wiki-api
qwerty287 7d04627
Apply suggestions from code review
qwerty287 f9455bc
Document file encoding
qwerty287 e642b2b
fmt
qwerty287 21e9e70
Merge branch 'main' into wiki-api
qwerty287 0e1e979
Merge branch 'main' into wiki-api
qwerty287 40962d6
Merge branch 'main' into wiki-api
qwerty287 9a1590c
Merge branch 'main' into wiki-api
qwerty287 f26b52b
Merge branch 'main' into wiki-api
qwerty287 ecc7ba6
Apply suggestions
qwerty287 34c6d71
Use convert
qwerty287 3b50c27
Merge branch 'main' into wiki-api
qwerty287 be93b48
Fix integration test
qwerty287 952beef
simplify permissions
noerw 3b5d5ff
unify duplicate key Title/Name
noerw 89bbcfa
improve types & return UTC timestamps
noerw 546a565
improve types pt.2
noerw f88605b
WikiPage.Content is base64 encoded
noerw cafbea4
simplify error handling in wikiContentsByName()
noerw 490a168
update swagger
noerw ab649d4
fix & DRY findWikiRepoCommit() error handling
noerw afd51f4
Merge branch 'main' into wiki-api
qwerty287 40e399f
rename Content -> ContentBase64
noerw d84e39d
Merge branch 'main' into wiki-api
6543 804458c
Merge branch 'main' into wiki-api
qwerty287 3a82d12
Merge pull request #1 from noerw/wiki-api
qwerty287 c67eff3
Merge branch 'main' into wiki-api
qwerty287 933697d
Fix test
qwerty287 2ac6b9a
Merge branch 'main' into wiki-api
qwerty287 75922f7
Fix tests
qwerty287 daf8ee0
Update var name
qwerty287 7105721
suburl -> sub_url
qwerty287 d78f2d8
Merge branch 'main' into wiki-api
qwerty287 1de0d03
Merge branch 'main' into wiki-api
qwerty287 d141619
Merge branch 'main' into wiki-api
zeripath 6425a28
Merge branch 'main' into wiki-api
wxiaoguang File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,251 @@ | ||
// Copyright 2021 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 integrations | ||
|
||
import ( | ||
"encoding/base64" | ||
"fmt" | ||
"net/http" | ||
"testing" | ||
|
||
api "code.gitea.io/gitea/modules/structs" | ||
|
||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func TestAPIGetWikiPage(t *testing.T) { | ||
defer prepareTestEnv(t)() | ||
|
||
username := "user2" | ||
session := loginUser(t, username) | ||
|
||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/wiki/page/Home", username, "repo1") | ||
|
||
req := NewRequest(t, "GET", urlStr) | ||
resp := session.MakeRequest(t, req, http.StatusOK) | ||
var page *api.WikiPage | ||
DecodeJSON(t, resp, &page) | ||
|
||
assert.Equal(t, &api.WikiPage{ | ||
WikiPageMetaData: &api.WikiPageMetaData{ | ||
Title: "Home", | ||
HTMLURL: page.HTMLURL, | ||
SubURL: "Home", | ||
LastCommit: &api.WikiCommit{ | ||
ID: "2c54faec6c45d31c1abfaecdab471eac6633738a", | ||
Author: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Ethan Koenig", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2017-11-27T04:31:18Z", | ||
}, | ||
Committer: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Ethan Koenig", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2017-11-27T04:31:18Z", | ||
}, | ||
Message: "Add Home.md\n", | ||
}, | ||
}, | ||
ContentBase64: base64.RawStdEncoding.EncodeToString( | ||
[]byte("# Home page\n\nThis is the home page!\n"), | ||
), | ||
CommitCount: 1, | ||
Sidebar: "", | ||
Footer: "", | ||
}, page) | ||
} | ||
|
||
func TestAPIListWikiPages(t *testing.T) { | ||
defer prepareTestEnv(t)() | ||
|
||
username := "user2" | ||
session := loginUser(t, username) | ||
|
||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/wiki/pages", username, "repo1") | ||
|
||
req := NewRequest(t, "GET", urlStr) | ||
resp := session.MakeRequest(t, req, http.StatusOK) | ||
|
||
var meta []*api.WikiPageMetaData | ||
DecodeJSON(t, resp, &meta) | ||
|
||
dummymeta := []*api.WikiPageMetaData{ | ||
{ | ||
Title: "Home", | ||
HTMLURL: meta[0].HTMLURL, | ||
SubURL: "Home", | ||
LastCommit: &api.WikiCommit{ | ||
ID: "2c54faec6c45d31c1abfaecdab471eac6633738a", | ||
Author: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Ethan Koenig", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2017-11-27T04:31:18Z", | ||
}, | ||
Committer: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Ethan Koenig", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2017-11-27T04:31:18Z", | ||
}, | ||
Message: "Add Home.md\n", | ||
}, | ||
}, | ||
{ | ||
Title: "Page With Image", | ||
HTMLURL: meta[1].HTMLURL, | ||
SubURL: "Page-With-Image", | ||
LastCommit: &api.WikiCommit{ | ||
ID: "0cf15c3f66ec8384480ed9c3cf87c9e97fbb0ec3", | ||
Author: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Gabriel Silva Simões", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2019-01-25T01:41:55Z", | ||
}, | ||
Committer: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Gabriel Silva Simões", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2019-01-25T01:41:55Z", | ||
}, | ||
Message: "Add jpeg.jpg and page with image\n", | ||
}, | ||
}, | ||
{ | ||
Title: "Page With Spaced Name", | ||
HTMLURL: meta[2].HTMLURL, | ||
SubURL: "Page-With-Spaced-Name", | ||
LastCommit: &api.WikiCommit{ | ||
ID: "c10d10b7e655b3dab1f53176db57c8219a5488d6", | ||
Author: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Gabriel Silva Simões", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2019-01-25T01:39:51Z", | ||
}, | ||
Committer: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Gabriel Silva Simões", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2019-01-25T01:39:51Z", | ||
}, | ||
Message: "Add page with spaced name\n", | ||
}, | ||
}, | ||
{ | ||
Title: "Unescaped File", | ||
HTMLURL: meta[3].HTMLURL, | ||
SubURL: "Unescaped-File", | ||
LastCommit: &api.WikiCommit{ | ||
ID: "0dca5bd9b5d7ef937710e056f575e86c0184ba85", | ||
Author: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "6543", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2021-07-19T16:42:46Z", | ||
}, | ||
Committer: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "6543", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2021-07-19T16:42:46Z", | ||
}, | ||
Message: "add unescaped file\n", | ||
}, | ||
}, | ||
} | ||
|
||
assert.Equal(t, dummymeta, meta) | ||
} | ||
|
||
func TestAPINewWikiPage(t *testing.T) { | ||
for _, title := range []string{ | ||
"New page", | ||
"&&&&", | ||
} { | ||
defer prepareTestEnv(t)() | ||
username := "user2" | ||
session := loginUser(t, username) | ||
token := getTokenForLoggedInUser(t, session) | ||
|
||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/wiki/new?token=%s", username, "repo1", token) | ||
|
||
req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateWikiPageOptions{ | ||
Title: title, | ||
ContentBase64: base64.StdEncoding.EncodeToString([]byte("Wiki page content for API unit tests")), | ||
Message: "", | ||
}) | ||
session.MakeRequest(t, req, http.StatusCreated) | ||
} | ||
} | ||
|
||
func TestAPIEditWikiPage(t *testing.T) { | ||
defer prepareTestEnv(t)() | ||
username := "user2" | ||
session := loginUser(t, username) | ||
token := getTokenForLoggedInUser(t, session) | ||
|
||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/wiki/page/Page-With-Spaced-Name?token=%s", username, "repo1", token) | ||
|
||
req := NewRequestWithJSON(t, "PATCH", urlStr, &api.CreateWikiPageOptions{ | ||
Title: "edited title", | ||
ContentBase64: base64.StdEncoding.EncodeToString([]byte("Edited wiki page content for API unit tests")), | ||
Message: "", | ||
}) | ||
session.MakeRequest(t, req, http.StatusOK) | ||
} | ||
|
||
func TestAPIListPageRevisions(t *testing.T) { | ||
defer prepareTestEnv(t)() | ||
username := "user2" | ||
session := loginUser(t, username) | ||
|
||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/wiki/revisions/Home", username, "repo1") | ||
|
||
req := NewRequest(t, "GET", urlStr) | ||
resp := session.MakeRequest(t, req, http.StatusOK) | ||
|
||
var revisions *api.WikiCommitList | ||
DecodeJSON(t, resp, &revisions) | ||
|
||
dummyrevisions := &api.WikiCommitList{ | ||
WikiCommits: []*api.WikiCommit{ | ||
{ | ||
ID: "2c54faec6c45d31c1abfaecdab471eac6633738a", | ||
Author: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Ethan Koenig", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2017-11-27T04:31:18Z", | ||
}, | ||
Committer: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: "Ethan Koenig", | ||
Email: "[email protected]", | ||
}, | ||
Date: "2017-11-27T04:31:18Z", | ||
}, | ||
Message: "Add Home.md\n", | ||
}, | ||
}, | ||
Count: 1, | ||
} | ||
|
||
assert.Equal(t, dummyrevisions, revisions) | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
// Copyright 2021 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 ( | ||
"time" | ||
|
||
"code.gitea.io/gitea/models" | ||
"code.gitea.io/gitea/modules/git" | ||
api "code.gitea.io/gitea/modules/structs" | ||
"code.gitea.io/gitea/modules/util" | ||
wiki_service "code.gitea.io/gitea/services/wiki" | ||
) | ||
|
||
// ToWikiCommit convert a git commit into a WikiCommit | ||
func ToWikiCommit(commit *git.Commit) *api.WikiCommit { | ||
return &api.WikiCommit{ | ||
ID: commit.ID.String(), | ||
Author: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: commit.Author.Name, | ||
Email: commit.Author.Email, | ||
}, | ||
Date: commit.Author.When.UTC().Format(time.RFC3339), | ||
}, | ||
Committer: &api.CommitUser{ | ||
Identity: api.Identity{ | ||
Name: commit.Committer.Name, | ||
Email: commit.Committer.Email, | ||
}, | ||
Date: commit.Committer.When.UTC().Format(time.RFC3339), | ||
}, | ||
Message: commit.CommitMessage, | ||
} | ||
} | ||
|
||
// ToWikiCommitList convert a list of git commits into a WikiCommitList | ||
func ToWikiCommitList(commits []*git.Commit, total int64) *api.WikiCommitList { | ||
result := make([]*api.WikiCommit, len(commits)) | ||
for i := range commits { | ||
result[i] = ToWikiCommit(commits[i]) | ||
} | ||
return &api.WikiCommitList{ | ||
WikiCommits: result, | ||
Count: total, | ||
} | ||
} | ||
|
||
// ToWikiPageMetaData converts meta information to a WikiPageMetaData | ||
func ToWikiPageMetaData(title string, lastCommit *git.Commit, repo *models.Repository) *api.WikiPageMetaData { | ||
suburl := wiki_service.NameToSubURL(title) | ||
return &api.WikiPageMetaData{ | ||
Title: title, | ||
HTMLURL: util.URLJoin(repo.HTMLURL(), "wiki", suburl), | ||
SubURL: suburl, | ||
LastCommit: ToWikiCommit(lastCommit), | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// Copyright 2021 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 structs | ||
|
||
// WikiCommit page commit/revision | ||
type WikiCommit struct { | ||
ID string `json:"sha"` | ||
Author *CommitUser `json:"author"` | ||
Committer *CommitUser `json:"commiter"` | ||
Message string `json:"message"` | ||
} | ||
|
||
// WikiPage a wiki page | ||
type WikiPage struct { | ||
*WikiPageMetaData | ||
// Page content, base64 encoded | ||
ContentBase64 string `json:"content"` | ||
qwerty287 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
CommitCount int64 `json:"commit_count"` | ||
Sidebar string `json:"sidebar"` | ||
Footer string `json:"footer"` | ||
} | ||
|
||
// WikiPageMetaData wiki page meta information | ||
type WikiPageMetaData struct { | ||
Title string `json:"title"` | ||
HTMLURL string `json:"html_url"` | ||
SubURL string `json:"suburl"` | ||
qwerty287 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
LastCommit *WikiCommit `json:"last_commit"` | ||
} | ||
|
||
// CreateWikiPageOptions form for creating wiki | ||
type CreateWikiPageOptions struct { | ||
// page title. leave empty to keep unchanged | ||
Title string `json:"title"` | ||
// content must be base64 encoded | ||
ContentBase64 string `json:"content"` | ||
qwerty287 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
// optional commit message summarizing the change | ||
Message string `json:"message"` | ||
qwerty287 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
|
||
// WikiCommitList commit/revision list | ||
type WikiCommitList struct { | ||
qwerty287 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
WikiCommits []*WikiCommit `json:"commits"` | ||
Count int64 `json:"count"` | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.