Ver código fonte

Removed API in Admin

Yoginth 7 anos atrás
pai
commit
037924ef55
5 arquivos alterados com 113 adições e 244 exclusões
  1. 0 1
      cmd/web.go
  2. 97 145
      models/repo_editor.go
  3. 16 16
      models/user.go
  4. 0 74
      templates/admin/api.tmpl
  5. 0 8
      templates/admin/navbar.tmpl

+ 0 - 1
cmd/web.go

@@ -258,7 +258,6 @@ func runWeb(c *cli.Context) error {
 	m.Group("/admin", func() {
 		m.Get("", admin.Dashboard)
 		m.Get("/analytics", admin.Analytics)
-		m.Get("/api", admin.AdminAPI)
 		m.Get("/config", admin.Config)
 		m.Post("/config/test_mail", admin.SendTestMail)
 		m.Get("/monitor", admin.Monitor)

+ 97 - 145
models/repo_editor.go

@@ -11,6 +11,7 @@ import (
 	"gitote/gitote/models/errors"
 	"gitote/gitote/pkg/process"
 	"gitote/gitote/pkg/setting"
+	"gitote/gitote/pkg/tool"
 	"io"
 	"io/ioutil"
 	"mime/multipart"
@@ -21,12 +22,45 @@ import (
 	"time"
 
 	"github.com/Unknwon/com"
-	raven "github.com/getsentry/raven-go"
 	gouuid "github.com/satori/go.uuid"
-	git "gitlab.com/gitote/git-module"
-	log "gopkg.in/clog.v1"
+	"gitlab.com/gitote/git-module"
 )
 
+const (
+	ENV_AUTH_USER_ID           = "GITOTE_AUTH_USER_ID"
+	ENV_AUTH_USER_NAME         = "GITOTE_AUTH_USER_NAME"
+	ENV_AUTH_USER_EMAIL        = "GITOTE_AUTH_USER_EMAIL"
+	ENV_REPO_OWNER_NAME        = "GITOTE_REPO_OWNER_NAME"
+	ENV_REPO_OWNER_SALT_MD5    = "GITOTE_REPO_OWNER_SALT_MD5"
+	ENV_REPO_ID                = "GITOTE_REPO_ID"
+	ENV_REPO_NAME              = "GITOTE_REPO_NAME"
+	ENV_REPO_CUSTOM_HOOKS_PATH = "GITOTE_REPO_CUSTOM_HOOKS_PATH"
+)
+
+type ComposeHookEnvsOptions struct {
+	AuthUser  *User
+	OwnerName string
+	OwnerSalt string
+	RepoID    int64
+	RepoName  string
+	RepoPath  string
+}
+
+func ComposeHookEnvs(opts ComposeHookEnvsOptions) []string {
+	envs := []string{
+		"SSH_ORIGINAL_COMMAND=1",
+		ENV_AUTH_USER_ID + "=" + com.ToStr(opts.AuthUser.ID),
+		ENV_AUTH_USER_NAME + "=" + opts.AuthUser.Name,
+		ENV_AUTH_USER_EMAIL + "=" + opts.AuthUser.Email,
+		ENV_REPO_OWNER_NAME + "=" + opts.OwnerName,
+		ENV_REPO_OWNER_SALT_MD5 + "=" + tool.MD5(opts.OwnerSalt),
+		ENV_REPO_ID + "=" + com.ToStr(opts.RepoID),
+		ENV_REPO_NAME + "=" + opts.RepoName,
+		ENV_REPO_CUSTOM_HOOKS_PATH + "=" + path.Join(opts.RepoPath, "custom_hooks"),
+	}
+	return envs
+}
+
 // discardLocalRepoBranchChanges discards local commits/changes of
 // given branch to make sure it is even to remote branch.
 func discardLocalRepoBranchChanges(localPath, branch string) error {
@@ -82,9 +116,9 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
 	defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
 
 	if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
-		return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err)
+		return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
 	} else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
-		return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
+		return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
 	}
 
 	repoPath := repo.RepoPath()
@@ -101,12 +135,12 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
 			if err = git.DeleteBranch(localPath, opts.NewBranch, git.DeleteBranchOptions{
 				Force: true,
 			}); err != nil {
-				return fmt.Errorf("DeleteBranch [name: %s]: %v", opts.NewBranch, err)
+				return fmt.Errorf("delete branch[%s]: %v", opts.NewBranch, err)
 			}
 		}
 
 		if err := repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
-			return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
+			return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
 		}
 	}
 
@@ -125,12 +159,12 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
 	// Otherwise, move the file when name changed.
 	if com.IsFile(oldFilePath) && opts.OldTreeName != opts.NewTreeName {
 		if err = git.MoveFile(localPath, opts.OldTreeName, opts.NewTreeName); err != nil {
-			return fmt.Errorf("git mv %s %s: %v", opts.OldTreeName, opts.NewTreeName, err)
+			return fmt.Errorf("git mv %q %q: %v", opts.OldTreeName, opts.NewTreeName, err)
 		}
 	}
 
 	if err = ioutil.WriteFile(filePath, []byte(opts.Content), 0666); err != nil {
-		return fmt.Errorf("WriteFile: %v", err)
+		return fmt.Errorf("write file: %v", err)
 	}
 
 	if err = git.AddChanges(localPath, true); err != nil {
@@ -139,48 +173,18 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
 		Committer: doer.NewGitSig(),
 		Message:   opts.Message,
 	}); err != nil {
-		return fmt.Errorf("CommitChanges: %v", err)
-	} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
+		return fmt.Errorf("commit changes on %q: %v", localPath, err)
+	} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
+		ComposeHookEnvs(ComposeHookEnvsOptions{
+			AuthUser:  doer,
+			OwnerName: repo.MustOwner().Name,
+			OwnerSalt: repo.MustOwner().Salt,
+			RepoID:    repo.ID,
+			RepoName:  repo.Name,
+			RepoPath:  repo.RepoPath(),
+		})); err != nil {
 		return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
 	}
-
-	gitRepo, err := git.OpenRepository(repo.RepoPath())
-	if err != nil {
-		raven.CaptureErrorAndWait(err, nil)
-		log.Error(2, "OpenRepository: %v", err)
-		return nil
-	}
-	commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
-	if err != nil {
-		raven.CaptureErrorAndWait(err, nil)
-		log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
-		return nil
-	}
-
-	// Simulate push event.
-	pushCommits := &PushCommits{
-		Len:     1,
-		Commits: []*PushCommit{CommitToPushCommit(commit)},
-	}
-	oldCommitID := opts.LastCommitID
-	if opts.NewBranch != opts.OldBranch {
-		oldCommitID = git.EMPTY_SHA
-	}
-	if err := CommitRepoAction(CommitRepoActionOptions{
-		PusherName:  doer.Name,
-		RepoOwnerID: repo.MustOwner().ID,
-		RepoName:    repo.Name,
-		RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
-		OldCommitID: oldCommitID,
-		NewCommitID: commit.ID.String(),
-		Commits:     pushCommits,
-	}); err != nil {
-		raven.CaptureErrorAndWait(err, nil)
-		log.Error(2, "CommitRepoAction: %v", err)
-		return nil
-	}
-
-	go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
 	return nil
 }
 
@@ -190,16 +194,16 @@ func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *
 	defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
 
 	if err = repo.DiscardLocalRepoBranchChanges(branch); err != nil {
-		return nil, fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", branch, err)
+		return nil, fmt.Errorf("discard local repo branch[%s] changes: %v", branch, err)
 	} else if err = repo.UpdateLocalCopyBranch(branch); err != nil {
-		return nil, fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", branch, err)
+		return nil, fmt.Errorf("update local copy branch[%s]: %v", branch, err)
 	}
 
 	localPath := repo.LocalCopyPath()
 	filePath := path.Join(localPath, treePath)
 	os.MkdirAll(filepath.Dir(filePath), os.ModePerm)
 	if err = ioutil.WriteFile(filePath, []byte(content), 0666); err != nil {
-		return nil, fmt.Errorf("WriteFile: %v", err)
+		return nil, fmt.Errorf("write file: %v", err)
 	}
 
 	cmd := exec.Command("git", "diff", treePath)
@@ -208,11 +212,11 @@ func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *
 
 	stdout, err := cmd.StdoutPipe()
 	if err != nil {
-		return nil, fmt.Errorf("StdoutPipe: %v", err)
+		return nil, fmt.Errorf("get stdout pipe: %v", err)
 	}
 
 	if err = cmd.Start(); err != nil {
-		return nil, fmt.Errorf("Start: %v", err)
+		return nil, fmt.Errorf("start: %v", err)
 	}
 
 	pid := process.Add(fmt.Sprintf("GetDiffPreview [repo_path: %s]", repo.RepoPath()), cmd)
@@ -220,11 +224,11 @@ func (repo *Repository) GetDiffPreview(branch, treePath, content string) (diff *
 
 	diff, err = ParsePatch(setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, stdout)
 	if err != nil {
-		return nil, fmt.Errorf("ParsePatch: %v", err)
+		return nil, fmt.Errorf("parse path: %v", err)
 	}
 
 	if err = cmd.Wait(); err != nil {
-		return nil, fmt.Errorf("Wait: %v", err)
+		return nil, fmt.Errorf("wait: %v", err)
 	}
 
 	return diff, nil
@@ -243,20 +247,20 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (
 	defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
 
 	if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
-		return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err)
+		return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
 	} else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
-		return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
+		return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
 	}
 
 	if opts.OldBranch != opts.NewBranch {
 		if err := repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
-			return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
+			return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
 		}
 	}
 
 	localPath := repo.LocalCopyPath()
 	if err = os.Remove(path.Join(localPath, opts.TreePath)); err != nil {
-		return fmt.Errorf("Remove: %v", err)
+		return fmt.Errorf("remove file %q: %v", opts.TreePath, err)
 	}
 
 	if err = git.AddChanges(localPath, true); err != nil {
@@ -265,44 +269,18 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) (
 		Committer: doer.NewGitSig(),
 		Message:   opts.Message,
 	}); err != nil {
-		return fmt.Errorf("CommitChanges: %v", err)
-	} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
+		return fmt.Errorf("commit changes to %q: %v", localPath, err)
+	} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
+		ComposeHookEnvs(ComposeHookEnvsOptions{
+			AuthUser:  doer,
+			OwnerName: repo.MustOwner().Name,
+			OwnerSalt: repo.MustOwner().Salt,
+			RepoID:    repo.ID,
+			RepoName:  repo.Name,
+			RepoPath:  repo.RepoPath(),
+		})); err != nil {
 		return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
 	}
-
-	gitRepo, err := git.OpenRepository(repo.RepoPath())
-	if err != nil {
-		raven.CaptureErrorAndWait(err, nil)
-		log.Error(2, "OpenRepository: %v", err)
-		return nil
-	}
-	commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
-	if err != nil {
-		raven.CaptureErrorAndWait(err, nil)
-		log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
-		return nil
-	}
-
-	// Simulate push event.
-	pushCommits := &PushCommits{
-		Len:     1,
-		Commits: []*PushCommit{CommitToPushCommit(commit)},
-	}
-	if err := CommitRepoAction(CommitRepoActionOptions{
-		PusherName:  doer.Name,
-		RepoOwnerID: repo.MustOwner().ID,
-		RepoName:    repo.Name,
-		RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
-		OldCommitID: opts.LastCommitID,
-		NewCommitID: commit.ID.String(),
-		Commits:     pushCommits,
-	}); err != nil {
-		raven.CaptureErrorAndWait(err, nil)
-		log.Error(2, "CommitRepoAction: %v", err)
-		return nil
-	}
-
-	go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
 	return nil
 }
 
@@ -327,24 +305,24 @@ func (upload *Upload) LocalPath() string {
 func NewUpload(name string, buf []byte, file multipart.File) (_ *Upload, err error) {
 	upload := &Upload{
 		UUID: gouuid.NewV4().String(),
-		Name: name,
+		Name: tool.SanitizePath(name),
 	}
 
 	localPath := upload.LocalPath()
 	if err = os.MkdirAll(path.Dir(localPath), os.ModePerm); err != nil {
-		return nil, fmt.Errorf("MkdirAll: %v", err)
+		return nil, fmt.Errorf("mkdir all: %v", err)
 	}
 
 	fw, err := os.Create(localPath)
 	if err != nil {
-		return nil, fmt.Errorf("Create: %v", err)
+		return nil, fmt.Errorf("create: %v", err)
 	}
 	defer fw.Close()
 
 	if _, err = fw.Write(buf); err != nil {
-		return nil, fmt.Errorf("Write: %v", err)
+		return nil, fmt.Errorf("write: %v", err)
 	} else if _, err = io.Copy(fw, file); err != nil {
-		return nil, fmt.Errorf("Copy: %v", err)
+		return nil, fmt.Errorf("copy: %v", err)
 	}
 
 	if _, err := x.Insert(upload); err != nil {
@@ -418,11 +396,11 @@ func DeleteUploadByUUID(uuid string) error {
 		if IsErrUploadNotExist(err) {
 			return nil
 		}
-		return fmt.Errorf("GetUploadByUUID: %v", err)
+		return fmt.Errorf("get upload by UUID[%s]: %v", uuid, err)
 	}
 
 	if err := DeleteUpload(upload); err != nil {
-		return fmt.Errorf("DeleteUpload: %v", err)
+		return fmt.Errorf("delete upload: %v", err)
 	}
 
 	return nil
@@ -434,7 +412,7 @@ type UploadRepoFileOptions struct {
 	NewBranch    string
 	TreePath     string
 	Message      string
-	Files        []string // In UUID format.
+	Files        []string // In UUID format
 }
 
 func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) (err error) {
@@ -444,21 +422,21 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
 
 	uploads, err := GetUploadsByUUIDs(opts.Files)
 	if err != nil {
-		return fmt.Errorf("GetUploadsByUUIDs [uuids: %v]: %v", opts.Files, err)
+		return fmt.Errorf("get uploads by UUIDs[%v]: %v", opts.Files, err)
 	}
 
 	repoWorkingPool.CheckIn(com.ToStr(repo.ID))
 	defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
 
 	if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil {
-		return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err)
+		return fmt.Errorf("discard local repo branch[%s] changes: %v", opts.OldBranch, err)
 	} else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil {
-		return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
+		return fmt.Errorf("update local copy branch[%s]: %v", opts.OldBranch, err)
 	}
 
 	if opts.OldBranch != opts.NewBranch {
 		if err = repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
-			return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
+			return fmt.Errorf("checkout new branch[%s] from old branch[%s]: %v", opts.NewBranch, opts.OldBranch, err)
 		}
 	}
 
@@ -475,7 +453,7 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
 		}
 
 		if err = com.Copy(tmpPath, targetPath); err != nil {
-			return fmt.Errorf("Copy: %v", err)
+			return fmt.Errorf("copy: %v", err)
 		}
 	}
 
@@ -485,43 +463,17 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions)
 		Committer: doer.NewGitSig(),
 		Message:   opts.Message,
 	}); err != nil {
-		return fmt.Errorf("CommitChanges: %v", err)
-	} else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil {
+		return fmt.Errorf("commit changes on %q: %v", localPath, err)
+	} else if err = git.PushWithEnvs(localPath, "origin", opts.NewBranch,
+		ComposeHookEnvs(ComposeHookEnvsOptions{
+			AuthUser:  doer,
+			OwnerName: repo.MustOwner().Name,
+			OwnerSalt: repo.MustOwner().Salt,
+			RepoID:    repo.ID,
+			RepoName:  repo.Name,
+			RepoPath:  repo.RepoPath(),
+		})); err != nil {
 		return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err)
 	}
-
-	gitRepo, err := git.OpenRepository(repo.RepoPath())
-	if err != nil {
-		raven.CaptureErrorAndWait(err, nil)
-		log.Error(2, "OpenRepository: %v", err)
-		return nil
-	}
-	commit, err := gitRepo.GetBranchCommit(opts.NewBranch)
-	if err != nil {
-		raven.CaptureErrorAndWait(err, nil)
-		log.Error(2, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err)
-		return nil
-	}
-
-	// Simulate push event.
-	pushCommits := &PushCommits{
-		Len:     1,
-		Commits: []*PushCommit{CommitToPushCommit(commit)},
-	}
-	if err := CommitRepoAction(CommitRepoActionOptions{
-		PusherName:  doer.Name,
-		RepoOwnerID: repo.MustOwner().ID,
-		RepoName:    repo.Name,
-		RefFullName: git.BRANCH_PREFIX + opts.NewBranch,
-		OldCommitID: opts.LastCommitID,
-		NewCommitID: commit.ID.String(),
-		Commits:     pushCommits,
-	}); err != nil {
-		raven.CaptureErrorAndWait(err, nil)
-		log.Error(2, "CommitRepoAction: %v", err)
-		return nil
-	}
-
-	go AddTestPullRequestTask(doer, repo.ID, opts.NewBranch, true)
 	return DeleteUploads(uploads...)
 }

+ 16 - 16
models/user.go

@@ -166,22 +166,22 @@ func (u *User) IDStr() string {
 
 func (u *User) APIFormat() *api.User {
 	return &api.User{
-		ID:               u.ID,
-		UserName:         u.Name,
-		Login:            u.Name,
-		FullName:         u.FullName,
-		Website:          u.Website,
-		Company:          u.Company,
-		Location:         u.Location,
-		Description:      u.Description,
-		Email:            u.Email,
-		IsAdmin:          u.IsAdmin,
-		NumRepos:         u.NumRepos,
-		Created:          u.Created,
-		Updated:          u.Updated,
-		NumFollowing:     u.NumFollowing,
-		NumFollowers:     u.NumFollowers,
-		AvatarUrl:        u.AvatarLink(),
+		Login:        u.Name,
+		ID:           u.ID,
+		UserName:     u.Name,
+		FullName:     u.FullName,
+		Company:      u.Company,
+		Location:     u.Location,
+		Description:  u.Description,
+		Email:        u.Email,
+		Website:      u.Website,
+		AvatarUrl:    u.AvatarLink(),
+		IsAdmin:      u.IsAdmin,
+		NumRepos:     u.NumRepos,
+		NumFollowing: u.NumFollowing,
+		NumFollowers: u.NumFollowers,
+		Created:      u.Created,
+		Updated:      u.Updated,
 	}
 }
 

+ 0 - 74
templates/admin/api.tmpl

@@ -1,74 +0,0 @@
-{{template "base/head" .}}
-<div class="admin monitor">
-	<div class="ui container">
-		<div class="ui grid">
-			{{template "admin/navbar" .}}
-			<div class="twelve wide column content">
-				{{template "base/alert" .}}
-				<h4 class="ui top attached header">
-					API 📲 <span class="ui basic green label small">Beta</span>
-				</h4>
-                <div class="ui attached segment">
-                    <h3>
-                        Version - <a href="{{AppURL}}api/{{APIVer}}/users/gitote">{{APIVer}}</a>
-                    </h3>
-                </div>
-
-                <h4 class="ui top attached header">
-					User
-				</h4>
-                <div class="ui attached segment">
-                    <h3>
-                        Soon
-                    </h3>
-                </div>
-
-                <h4 class="ui top attached header">
-					Organization
-				</h4>
-                <div class="ui attached segment">
-                    <h3>
-                        Soon
-                    </h3>
-                </div>
-
-                <h4 class="ui top attached header">
-					Repository
-				</h4>
-                <div class="ui attached segment">
-                    <h3>
-                        Soon
-                    </h3>
-                </div>
-
-                <h4 class="ui top attached header">
-					Issues
-				</h4>
-                <div class="ui attached segment">
-                    <h3>
-                        Soon
-                    </h3>
-                </div>
-
-                <h4 class="ui top attached header">
-					Admin
-				</h4>
-                <div class="ui attached segment">
-                    <h3>
-                        Soon
-                    </h3>
-                </div>
-
-                <h4 class="ui top attached header">
-					Miscellaneous
-				</h4>
-                <div class="ui attached segment">
-                    <h3>
-                        Soon
-                    </h3>
-                </div>
-			</div>
-		</div>
-	</div>
-</div>
-{{template "base/footer" .}}

+ 0 - 8
templates/admin/navbar.tmpl

@@ -8,10 +8,6 @@
 			🚦 Analytics
 			<span class="ui green basic label small">Beta</span>
 		</a>
-		<a class="item" href="{{AppSubURL}}/admin/picks">
-			😍 Staff Picks
-			<span class="ui violet basic label small">ToDo</span>
-		</a>
 		<a class="{{if .PageIsAdminNews}}active{{end}} item" href="{{AppSubURL}}/admin/news">
 			🌐 News
 			<span class="ui green basic label small">Beta</span>
@@ -31,10 +27,6 @@
 		<a class="{{if .PageIsAdminConfig}}active{{end}} item" href="{{AppSubURL}}/admin/config">
 			🛠️ Configuration
 		</a>
-		<a class="{{if .PageIsAdminAPI}}active{{end}} item" href="{{AppSubURL}}/admin/api">
-			📲 API
-			<span class="ui green basic label small">Beta</span>
-		</a>
 		<a class="{{if .PageIsAdminNotices}}active{{end}} item" href="{{AppSubURL}}/admin/notices">
 			📜 System Notices
 		</a>