code.gitea.io/gitea@v1.21.7/routers/api/v1/admin/adopt.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package admin
     5  
     6  import (
     7  	"net/http"
     8  
     9  	repo_model "code.gitea.io/gitea/models/repo"
    10  	user_model "code.gitea.io/gitea/models/user"
    11  	"code.gitea.io/gitea/modules/context"
    12  	"code.gitea.io/gitea/modules/util"
    13  	"code.gitea.io/gitea/routers/api/v1/utils"
    14  	repo_service "code.gitea.io/gitea/services/repository"
    15  )
    16  
    17  // ListUnadoptedRepositories lists the unadopted repositories that match the provided names
    18  func ListUnadoptedRepositories(ctx *context.APIContext) {
    19  	// swagger:operation GET /admin/unadopted admin adminUnadoptedList
    20  	// ---
    21  	// summary: List unadopted repositories
    22  	// produces:
    23  	// - application/json
    24  	// parameters:
    25  	// - name: page
    26  	//   in: query
    27  	//   description: page number of results to return (1-based)
    28  	//   type: integer
    29  	// - name: limit
    30  	//   in: query
    31  	//   description: page size of results
    32  	//   type: integer
    33  	// - name: pattern
    34  	//   in: query
    35  	//   description: pattern of repositories to search for
    36  	//   type: string
    37  	// responses:
    38  	//   "200":
    39  	//     "$ref": "#/responses/StringSlice"
    40  	//   "403":
    41  	//     "$ref": "#/responses/forbidden"
    42  
    43  	listOptions := utils.GetListOptions(ctx)
    44  	if listOptions.Page == 0 {
    45  		listOptions.Page = 1
    46  	}
    47  	repoNames, count, err := repo_service.ListUnadoptedRepositories(ctx, ctx.FormString("query"), &listOptions)
    48  	if err != nil {
    49  		ctx.InternalServerError(err)
    50  		return
    51  	}
    52  
    53  	ctx.SetTotalCountHeader(int64(count))
    54  
    55  	ctx.JSON(http.StatusOK, repoNames)
    56  }
    57  
    58  // AdoptRepository will adopt an unadopted repository
    59  func AdoptRepository(ctx *context.APIContext) {
    60  	// swagger:operation POST /admin/unadopted/{owner}/{repo} admin adminAdoptRepository
    61  	// ---
    62  	// summary: Adopt unadopted files as a repository
    63  	// produces:
    64  	// - application/json
    65  	// parameters:
    66  	// - name: owner
    67  	//   in: path
    68  	//   description: owner of the repo
    69  	//   type: string
    70  	//   required: true
    71  	// - name: repo
    72  	//   in: path
    73  	//   description: name of the repo
    74  	//   type: string
    75  	//   required: true
    76  	// responses:
    77  	//   "204":
    78  	//     "$ref": "#/responses/empty"
    79  	//   "404":
    80  	//     "$ref": "#/responses/notFound"
    81  	//   "403":
    82  	//     "$ref": "#/responses/forbidden"
    83  	ownerName := ctx.Params(":username")
    84  	repoName := ctx.Params(":reponame")
    85  
    86  	ctxUser, err := user_model.GetUserByName(ctx, ownerName)
    87  	if err != nil {
    88  		if user_model.IsErrUserNotExist(err) {
    89  			ctx.NotFound()
    90  			return
    91  		}
    92  		ctx.InternalServerError(err)
    93  		return
    94  	}
    95  
    96  	// check not a repo
    97  	has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, repoName)
    98  	if err != nil {
    99  		ctx.InternalServerError(err)
   100  		return
   101  	}
   102  	isDir, err := util.IsDir(repo_model.RepoPath(ctxUser.Name, repoName))
   103  	if err != nil {
   104  		ctx.InternalServerError(err)
   105  		return
   106  	}
   107  	if has || !isDir {
   108  		ctx.NotFound()
   109  		return
   110  	}
   111  	if _, err := repo_service.AdoptRepository(ctx, ctx.Doer, ctxUser, repo_service.CreateRepoOptions{
   112  		Name:      repoName,
   113  		IsPrivate: true,
   114  	}); err != nil {
   115  		ctx.InternalServerError(err)
   116  		return
   117  	}
   118  
   119  	ctx.Status(http.StatusNoContent)
   120  }
   121  
   122  // DeleteUnadoptedRepository will delete an unadopted repository
   123  func DeleteUnadoptedRepository(ctx *context.APIContext) {
   124  	// swagger:operation DELETE /admin/unadopted/{owner}/{repo} admin adminDeleteUnadoptedRepository
   125  	// ---
   126  	// summary: Delete unadopted files
   127  	// produces:
   128  	// - application/json
   129  	// parameters:
   130  	// - name: owner
   131  	//   in: path
   132  	//   description: owner of the repo
   133  	//   type: string
   134  	//   required: true
   135  	// - name: repo
   136  	//   in: path
   137  	//   description: name of the repo
   138  	//   type: string
   139  	//   required: true
   140  	// responses:
   141  	//   "204":
   142  	//     "$ref": "#/responses/empty"
   143  	//   "403":
   144  	//     "$ref": "#/responses/forbidden"
   145  	ownerName := ctx.Params(":username")
   146  	repoName := ctx.Params(":reponame")
   147  
   148  	ctxUser, err := user_model.GetUserByName(ctx, ownerName)
   149  	if err != nil {
   150  		if user_model.IsErrUserNotExist(err) {
   151  			ctx.NotFound()
   152  			return
   153  		}
   154  		ctx.InternalServerError(err)
   155  		return
   156  	}
   157  
   158  	// check not a repo
   159  	has, err := repo_model.IsRepositoryModelExist(ctx, ctxUser, repoName)
   160  	if err != nil {
   161  		ctx.InternalServerError(err)
   162  		return
   163  	}
   164  	isDir, err := util.IsDir(repo_model.RepoPath(ctxUser.Name, repoName))
   165  	if err != nil {
   166  		ctx.InternalServerError(err)
   167  		return
   168  	}
   169  	if has || !isDir {
   170  		ctx.NotFound()
   171  		return
   172  	}
   173  
   174  	if err := repo_service.DeleteUnadoptedRepository(ctx, ctx.Doer, ctxUser, repoName); err != nil {
   175  		ctx.InternalServerError(err)
   176  		return
   177  	}
   178  
   179  	ctx.Status(http.StatusNoContent)
   180  }