Skip to content

Commit 91132df

Browse files
committed
Add remove repo API.
1 parent 1685c9a commit 91132df

File tree

4 files changed

+45
-6
lines changed

4 files changed

+45
-6
lines changed

api-doc/repos.http

+6
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,9 @@ Content-Type: {{contentType}}
8585
# /:owner/:repo/raw/:ref/*
8686

8787
GET {{baseUrl}}/{{username}}/{{repo2}}/raw/{{ref}}/{{filepath}}
88+
89+
### Remove Repo
90+
91+
@repoTest = test
92+
93+
DELETE {{baseUrl}}/api/repos/{{username}}/{{repoTest}}

src/controller/git/repos/index.js

+26-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const Git = require("nodegit");
22
const PATH = require("path");
33
const FS = require('fs-extra')
44
const Models = require('../../../../conf/sequelize');
5-
const { readFile } = require('../../../utils/fsExtra');
5+
const { readFile, removeDir } = require('../../../utils/fsExtra');
66

77
const { getFiles, repoFilesSort, getEntrysInfo, getFilesCommitInfo, getFileCommit } = require('./util');
88

@@ -155,8 +155,31 @@ module.exports = {
155155
}
156156
},
157157
delete: async (ctx) => {
158-
const { owner, repo } = ctx.params;
159-
ctx.body = { owner, repo };
158+
const { owner } = ctx.params;
159+
let { repo } = ctx.params;
160+
const { reposPath } = ctx.state.conf;
161+
repo = repo.replace(/.git$/, '');
162+
let transaction;
163+
try {
164+
// 托管事务
165+
transaction = await Models.sequelize.transaction();
166+
const namespaces = await Models.namespaces.findOne({ where: { name: owner } });
167+
if (!namespaces.id) ctx.throw(404, 'Owner does not exist!');
168+
await Models.projects.destroy({ where: { namespace_id: namespaces.id, name: repo }});
169+
const projects = Models.projects.findOne({ where: { name: repo, namespace_id: namespaces.id } });
170+
if (!projects.id) ctx.throw(404, 'Repo does not exist!');
171+
await Models.user_interacted_projects.destroy({ where: { project_id: projects.id, creator_id: namespaces.owner_id }});
172+
// remove repo
173+
await removeDir(PATH.join(reposPath, owner, `${repo}.git`));
174+
// transaction commit 事务提交
175+
await transaction.commit();
176+
ctx.body = { message: `Successfully deleted ${repo}!`};
177+
} catch (err) {
178+
// 事务回滚
179+
if (transaction) await transaction.rollback();
180+
ctx.response.status = err.statusCode || err.status || 500;
181+
ctx.body = { message: err.message, ...err }
182+
}
160183
},
161184
reposTree: async (ctx) => {
162185
const { id } = ctx.params;

src/routes/git/repos.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ router
1111
.post('/user/repos', repos.created)
1212
.get('/repos/:id/tree', repos.reposTree)
1313
.get('/repos/:owner/:repo', repos.detail)
14+
.delete('/repos/:owner/:repo', repos.delete)
1415
.get('/repos/:owner/:repo/tags', tags.list)
1516
.get('/repos/:owner/:repo/tags/:tag_name', tags.detail)
1617
.get('/repos/:owner/:repo/readme', repos.readme)
1718
.get('/repos/:owner/:repo/blob/:ref/*', repos.fileDetail)
1819
.get('/orgs/:org/repos', repos.orgReposList)
19-
.post('/orgs/:org/repos', repos.created)
20+
.post('/orgs/:org/repos', repos.created);
2021

2122
module.exports = router;

src/utils/fsExtra.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const fs = require('fs');
2+
const FS = require('fs-extra');
23

34
exports.exists = (path) => {
45
return new Promise((resolve, reject) => {
@@ -17,10 +18,18 @@ exports.existsRepo = (repoNamePath) => {
1718
}
1819

1920

20-
exports.readFile = async (path, charset = 'utf8') => {
21+
exports.readFile = (path, charset = 'utf8') => {
2122
return new Promise((resolve, reject) => {
2223
fs.readFile(path, charset, (err, data) => {
2324
err ? reject(err) : resolve(data);
2425
});
2526
});
26-
};
27+
};
28+
29+
exports.removeDir = (srcpath) => {
30+
return new Promise((resolve, reject) => {
31+
FS.remove(srcpath, err => {
32+
err ? reject(err) : resolve();
33+
})
34+
});
35+
}

0 commit comments

Comments
 (0)