diff --git a/public/partials/admin/user.htm b/public/partials/admin/user.htm index 71b0066..86e93c6 100644 --- a/public/partials/admin/user.htm +++ b/public/partials/admin/user.htm @@ -1,9 +1,15 @@

- + {{userInfo.username}} - +

ID
@@ -16,12 +22,47 @@
{{userInfo.accessTokens.github}}
Github
- +
Github Repositories
-
{{userInfo.repositories.length}}
+
+ {{userInfo.repositories.length}} +
+ +
    +
  • +
    +
    + {{repo.name}} +
    +
    + + {{::repo.size | + humanFileSize}} +
    +
    +
  • +
- +

Repositories {{repositories.length}}

diff --git a/public/script/admin.js b/public/script/admin.js index 7a6e0b6..b5ff453 100644 --- a/public/script/admin.js +++ b/public/script/admin.js @@ -231,6 +231,16 @@ angular ); }; + $scope.getGitHubRepositories = (force) => { + $http + .get(`/api/user/${$scope.userInfo.username}/all_repositories`, { + params: { force: "1" }, + }) + .then((res) => { + $scope.userInfo.repositories = res.data; + }); + }; + let timeClear = null; $scope.$watch( "query", diff --git a/src/database/users/users.schema.ts b/src/database/users/users.schema.ts index d816cfe..731d92f 100644 --- a/src/database/users/users.schema.ts +++ b/src/database/users/users.schema.ts @@ -19,7 +19,12 @@ const UserSchema = new Schema({ ], isAdmin: { type: Boolean, default: false }, photo: String, - repositories: [String], + repositories: [ + { + type: String, + ref: "Repository", + }, + ], default: { terms: [String], options: { diff --git a/src/routes/admin.ts b/src/routes/admin.ts index f68d315..ab0b188 100644 --- a/src/routes/admin.ts +++ b/src/routes/admin.ts @@ -9,6 +9,7 @@ import Repository from "../Repository"; import User from "../User"; import { ensureAuthenticated } from "./connection"; import { handleError, getUser, isOwnerOrAdmin, getRepo } from "./route-utils"; +import RepositoryModel from "../database/repositories/repositories.model"; const router = express.Router(); @@ -206,7 +207,14 @@ router.get( "/users/:username", async (req: express.Request, res: express.Response) => { try { - const model = await UserModel.findOne({ username: req.params.username }); + const model = await UserModel.findOne({ + username: req.params.username, + }).populate({ + path: "repositories", + model: "Repository", + foreignField: "_id", + localField: "repositories", + }); if (!model) { req.logout((error) => console.error(error)); throw new AnonymousError("user_not_found", { diff --git a/src/routes/user.ts b/src/routes/user.ts index 387baef..74238b2 100644 --- a/src/routes/user.ts +++ b/src/routes/user.ts @@ -1,7 +1,9 @@ import * as express from "express"; import config from "../../config"; import { ensureAuthenticated } from "./connection"; -import { handleError, getUser } from "./route-utils"; +import { handleError, getUser, isOwnerOrAdmin } from "./route-utils"; +import UserModel from "../database/users/users.model"; +import User from "../User"; const router = express.Router(); @@ -117,22 +119,40 @@ router.get( } ); +async function getAllRepositories(user: User, force: boolean) { + const repos = await user.getGitHubRepositories({ + force, + }); + return repos.map((x) => { + return { + fullName: x.fullName, + id: x.id, + }; + }); +} router.get( "/all_repositories", async (req: express.Request, res: express.Response) => { try { const user = await getUser(req); - const repos = await user.getGitHubRepositories({ - force: req.query.force == "1", - }); - res.json( - repos.map((x) => { - return { - fullName: x.fullName, - id: x.id, - }; - }) - ); + res.json(await getAllRepositories(user, req.query.force == "1")); + } catch (error) { + handleError(error, res, req); + } + } +); +router.get( + "/:username/all_repositories", + async (req: express.Request, res: express.Response) => { + try { + const loggedUser = await getUser(req); + isOwnerOrAdmin([req.params.username], loggedUser); + const model = await UserModel.findOne({ username: req.params.username }); + if (!model) { + throw new Error("User not found"); + } + const user = new User(model); + res.json(await getAllRepositories(user, req.query.force == "1")); } catch (error) { handleError(error, res, req); }