Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
258 changes: 63 additions & 195 deletions api/jiaozifs.gen.go

Large diffs are not rendered by default.

35 changes: 0 additions & 35 deletions api/swagger.yml
Original file line number Diff line number Diff line change
Expand Up @@ -736,26 +736,6 @@ paths:
schema:
type: string
format: binary

parameters:
- in: query
name: wipID
description: working in process
required: true
schema:
type: string
format: uuid
- in: header
name: If-None-Match
description: |
Currently supports only "*" to allow uploading an object only if one doesn't exist yet.
Deprecated, this capability will not be supported in future releases.
example: "*"
required: false
deprecated: true
schema:
type: string
pattern: '^\*$' # Currently, only "*" is supported
responses:
201:
description: object metadata
Expand All @@ -780,14 +760,6 @@ paths:
- objects
operationId: deleteObject
summary: delete object. Missing objects will not return a NotFound error.
parameters:
- in: query
name: wipID
description: working in process
required: true
schema:
type: string
format: uuid
responses:
204:
description: object deleted successfully
Expand Down Expand Up @@ -855,13 +827,6 @@ paths:
- wip
operationId: createWip
summary: create working in process
parameters:
- in: query
name: name
description: wip name
required: true
schema:
type: string
responses:
201:
description: working in process created
Expand Down
10 changes: 4 additions & 6 deletions controller/branch_ctl.go
Original file line number Diff line number Diff line change
Expand Up @@ -192,16 +192,14 @@ func (bct BranchController) DeleteBranch(ctx context.Context, w *api.JiaozifsRes
return
}

_, err = bct.Repo.RefRepo().Get(ctx, models.NewGetRefParams().SetName(params.RefName).SetRepositoryID(repository.ID))
// Delete branch
affectedRows, err := bct.Repo.RefRepo().Delete(ctx, models.NewDeleteRefParams().SetName(params.RefName).SetRepositoryID(repository.ID))
if err != nil {
w.Error(err)
return
}

// Delete branch
err = bct.Repo.RefRepo().Delete(ctx, models.NewDeleteRefParams().SetName(params.RefName).SetRepositoryID(repository.ID))
if err != nil {
w.Error(err)
if affectedRows == 0 {
w.NotFound()
return
}
w.OK()
Expand Down
99 changes: 62 additions & 37 deletions controller/object_ctl.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
"net/http"
"time"

"github.com/jiaozifs/jiaozifs/utils/hash"

logging "github.com/ipfs/go-log/v2"

"github.com/go-openapi/swag"
Expand Down Expand Up @@ -39,7 +41,7 @@ type ObjectController struct {
}

func (oct ObjectController) DeleteObject(ctx context.Context, w *api.JiaozifsResponse, r *http.Request, ownerName string, repositoryName string, params api.DeleteObjectParams) { //nolint
user, err := auth.GetOperator(ctx)
operator, err := auth.GetOperator(ctx)
if err != nil {
w.Error(err)
return
Expand All @@ -51,7 +53,7 @@ func (oct ObjectController) DeleteObject(ctx context.Context, w *api.JiaozifsRes
return
}

if user.Name != ownerName { //todo check permission
if operator.Name != ownerName { //todo check permission
w.Forbidden()
return
}
Expand All @@ -73,6 +75,12 @@ func (oct ObjectController) DeleteObject(ctx context.Context, w *api.JiaozifsRes
return
}

wip, err := oct.Repo.WipRepo().Get(ctx, models.NewGetWipParams().SetCreatorID(operator.ID).SetRepositoryID(repository.ID).SetRefID(ref.ID))
if err != nil {
w.Error(err)
return
}

workTree, err := versionmgr.NewWorkTree(ctx, oct.Repo.FileTreeRepo(), models.NewRootTreeEntry(commit.TreeHash))
if err != nil {
w.Error(err)
Expand All @@ -81,11 +89,11 @@ func (oct ObjectController) DeleteObject(ctx context.Context, w *api.JiaozifsRes

err = workTree.RemoveEntry(ctx, params.Path)
if errors.Is(err, versionmgr.ErrPathNotFound) {
w.Code(http.StatusNotFound)
w.BadRequest(fmt.Sprintf("path %s not found", params.Path))
return
}

err = oct.Repo.WipRepo().UpdateByID(ctx, models.NewUpdateWipParams(params.WipID).SetCurrentTree(workTree.Root().Hash()))
err = oct.Repo.WipRepo().UpdateByID(ctx, models.NewUpdateWipParams(wip.ID).SetCurrentTree(workTree.Root().Hash()))
if err != nil {
w.Error(err)
return
Expand Down Expand Up @@ -123,20 +131,28 @@ func (oct ObjectController) GetObject(ctx context.Context, w *api.JiaozifsRespon
return
}

commit, err := oct.Repo.CommitRepo().Commit(ctx, ref.CommitHash)
if err != nil {
w.Error(err)
return
treeHash := hash.EmptyHash
if !ref.CommitHash.IsEmpty() {
commit, err := oct.Repo.CommitRepo().Commit(ctx, ref.CommitHash)
if err != nil {
w.Error(err)
return
}
treeHash = commit.TreeHash
}

workTree, err := versionmgr.NewWorkTree(ctx, oct.Repo.FileTreeRepo(), models.NewRootTreeEntry(commit.TreeHash))
workTree, err := versionmgr.NewWorkTree(ctx, oct.Repo.FileTreeRepo(), models.NewRootTreeEntry(treeHash))
if err != nil {
w.Error(err)
return
}

blob, name, err := workTree.FindBlob(ctx, params.Path)
if err != nil {
if errors.Is(err, versionmgr.ErrPathNotFound) {
w.BadRequest(fmt.Sprintf("path %s not found", params.Path))
return
}
w.Error(err)
return
}
Expand All @@ -160,7 +176,7 @@ func (oct ObjectController) GetObject(ctx context.Context, w *api.JiaozifsRespon
w.Header().Set("Content-Length", fmt.Sprint(blob.Size))
}

etag := httputil.ETag(blob.Hash.Hex())
etag := httputil.ETag(blob.CheckSum.Hex())
w.Header().Set("ETag", etag)
lastModified := httputil.HeaderTimestamp(blob.CreatedAt)
w.Header().Set("Last-Modified", lastModified)
Expand Down Expand Up @@ -212,44 +228,40 @@ func (oct ObjectController) HeadObject(ctx context.Context, w *api.JiaozifsRespo
return
}

commit, err := oct.Repo.CommitRepo().Commit(ctx, ref.CommitHash)
if err != nil {
w.Error(err)
return
treeHash := hash.EmptyHash
if !ref.CommitHash.IsEmpty() {
commit, err := oct.Repo.CommitRepo().Commit(ctx, ref.CommitHash)
if err != nil {
w.Error(err)
return
}
treeHash = commit.TreeHash
}

fileRepo := oct.Repo.FileTreeRepo()
treeOp, err := versionmgr.NewWorkTree(ctx, fileRepo, models.NewRootTreeEntry(commit.TreeHash))
workTree, err := versionmgr.NewWorkTree(ctx, fileRepo, models.NewRootTreeEntry(treeHash))
if err != nil {
w.Error(err)
return
}

existNodes, missingPath, err := treeOp.MatchPath(ctx, params.Path)
if err != nil {
w.Error(err)
return
}
if len(missingPath) == 0 {
w.Error(versionmgr.ErrPathNotFound)
return
}

objectWithName := existNodes[len(existNodes)-1]

blob, err := fileRepo.Blob(ctx, objectWithName.Node().Hash)
blob, name, err := workTree.FindBlob(ctx, params.Path)
if err != nil {
if errors.Is(err, versionmgr.ErrPathNotFound) {
w.BadRequest(fmt.Sprintf("path %s not found", params.Path))
return
}
w.Error(err)
return
}

//lookup files
etag := httputil.ETag(objectWithName.Node().Hash.Hex())
etag := httputil.ETag(blob.CheckSum.Hex())
w.Header().Set("ETag", etag)
lastModified := httputil.HeaderTimestamp(objectWithName.Node().CreatedAt)
lastModified := httputil.HeaderTimestamp(blob.CreatedAt)
w.Header().Set("Last-Modified", lastModified)
w.Header().Set("Accept-Ranges", "bytes")
w.Header().Set("Content-Type", httputil.ExtensionsByType(objectWithName.Entry().Name))
w.Header().Set("Content-Type", httputil.ExtensionsByType(name))
// for security, make sure the browser and any proxies en route don't cache the response
w.Header().Set("Cache-Control", "no-store, must-revalidate")
w.Header().Set("Expires", "0")
Expand Down Expand Up @@ -315,7 +327,7 @@ func (oct ObjectController) UploadObject(ctx context.Context, w *api.JiaozifsRes
}
defer reader.Close() //nolint

user, err := auth.GetOperator(ctx)
operator, err := auth.GetOperator(ctx)
if err != nil {
w.Error(err)
return
Expand All @@ -327,18 +339,30 @@ func (oct ObjectController) UploadObject(ctx context.Context, w *api.JiaozifsRes
return
}

if user.Name != ownerName { //todo check permission
if operator.Name != ownerName { //todo check permission
w.Forbidden()
return
}

_, err = oct.Repo.RepositoryRepo().Get(ctx, models.NewGetRepoParams().SetOwnerID(owner.ID).SetName(repositoryName))
repository, err := oct.Repo.RepositoryRepo().Get(ctx, models.NewGetRepoParams().SetOwnerID(owner.ID).SetName(repositoryName))
if err != nil {
w.Error(err)
return
}

ref, err := oct.Repo.RefRepo().Get(ctx, models.NewGetRefParams().SetName(params.Branch).SetRepositoryID(repository.ID))
if err != nil {
w.Error(err)
return
}

wip, err := oct.Repo.WipRepo().Get(ctx, models.NewGetWipParams().SetCreatorID(operator.ID).SetRepositoryID(repository.ID).SetRefID(ref.ID))
if err != nil {
w.Error(err)
return
}

stash, err := oct.Repo.WipRepo().Get(ctx, models.NewGetWipParams().SetID(params.WipID))
stash, err := oct.Repo.WipRepo().Get(ctx, models.NewGetWipParams().SetID(wip.ID))
if err != nil {
w.Error(err)
return
Expand All @@ -351,6 +375,7 @@ func (oct ObjectController) UploadObject(ctx context.Context, w *api.JiaozifsRes
return err
}

// todo move write blob out of transaction
blob, err := workingTree.WriteBlob(ctx, oct.BlockAdapter, reader, r.ContentLength, models.DefaultLeafProperty())
if err != nil {
return err
Expand All @@ -361,7 +386,7 @@ func (oct ObjectController) UploadObject(ctx context.Context, w *api.JiaozifsRes
return err
}
response = api.ObjectStats{
Checksum: blob.Hash.Hex(),
Checksum: blob.CheckSum.Hex(),
Mtime: time.Now().Unix(),
Path: params.Path,
PathMode: utils.Uint32(uint32(filemode.Regular)),
Expand All @@ -377,5 +402,5 @@ func (oct ObjectController) UploadObject(ctx context.Context, w *api.JiaozifsRes
return
}

w.JSON(response)
w.JSON(response, http.StatusCreated)
}
17 changes: 11 additions & 6 deletions controller/repository_ctl.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ func (repositoryCtl RepositoryController) ListRepositoryOfAuthenticatedUser(ctx
return
}

repositories, err := repositoryCtl.Repo.RepositoryRepo().List(ctx, models.NewListRepoParams().SetOwnerID(operator.ID))
repositories, err := repositoryCtl.Repo.RepositoryRepo().List(ctx, models.NewListRepoParams().SetOwnerID(operator.ID)) //operator is owner
if err != nil {
w.Error(err)
return
Expand Down Expand Up @@ -131,7 +131,7 @@ func (repositoryCtl RepositoryController) CreateRepository(ctx context.Context,
Name: body.Name,
Description: body.Description,
HEAD: defaultRef.Name,
OwnerID: operator.ID,
OwnerID: operator.ID, // this api only create repo for operator
CreatorID: operator.ID,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
Expand Down Expand Up @@ -174,17 +174,22 @@ func (repositoryCtl RepositoryController) DeleteRepository(ctx context.Context,
return
}

repo, err := repositoryCtl.Repo.RepositoryRepo().Get(ctx, models.NewGetRepoParams().SetName(repositoryName).SetOwnerID(operator.ID))
repo, err := repositoryCtl.Repo.RepositoryRepo().Get(ctx, models.NewGetRepoParams().SetName(repositoryName).SetOwnerID(owner.ID))
if err != nil {
w.Error(err)
return
}

err = repositoryCtl.Repo.RepositoryRepo().Delete(ctx, models.NewDeleteRepoParams().SetID(repo.ID))
affectRows, err := repositoryCtl.Repo.RepositoryRepo().Delete(ctx, models.NewDeleteRepoParams().SetID(repo.ID))
if err != nil {
w.Error(err)
return
}

if affectRows == 0 {
w.NotFound()
return
}
w.OK()
}

Expand Down Expand Up @@ -247,7 +252,7 @@ func (repositoryCtl RepositoryController) UpdateRepository(ctx context.Context,
}

func (repositoryCtl RepositoryController) GetCommitsInRepository(ctx context.Context, w *api.JiaozifsResponse, _ *http.Request, ownerName string, repositoryName string, params api.GetCommitsInRepositoryParams) {
user, err := auth.GetOperator(ctx)
operator, err := auth.GetOperator(ctx)
if err != nil {
w.Error(err)
return
Expand All @@ -259,7 +264,7 @@ func (repositoryCtl RepositoryController) GetCommitsInRepository(ctx context.Con
return
}

if user.Name != ownerName { //todo check public or private
if operator.Name != ownerName { //todo check public or private
w.Forbidden()
return
}
Expand Down
Loading