Skip to content

Commit

Permalink
Feat/page reordering endpoints (#108)
Browse files Browse the repository at this point in the history
  • Loading branch information
kwajiehao authored Feb 23, 2021
1 parent bf3447a commit 0bdac5f
Show file tree
Hide file tree
Showing 6 changed files with 152 additions and 10 deletions.
69 changes: 59 additions & 10 deletions classes/Directory.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ const axios = require('axios');
const _ = require('lodash')
const validateStatus = require('../utils/axios-utils')

const { BadRequestError } = require('../errors/BadRequestError')

const GITHUB_ORG_NAME = process.env.GITHUB_ORG_NAME
const BRANCH_REF = process.env.BRANCH_REF

Expand Down Expand Up @@ -36,20 +38,56 @@ class Directory {
}
})

if (resp.status !== 200) return {}

const directories = resp.data.map(object => {
const pathNameSplit = object.path.split("/")
const dirName = pathNameSplit[pathNameSplit.length - 1]
if (object.type === 'dir') {
if (resp.status !== 200) {
if (this.dirType instanceof FolderType) throw new BadRequestError(`Path ${this.dirType.getFolderName()} was invalid!`)
return {}
}

if (this.dirType instanceof FolderType) {
// Validation
if (!Array.isArray(resp.data)) {
throw new BadRequestError(`The provided path, ${endpoint}, is not a directory`)
}

const filesOrDirs = resp.data.map((fileOrDir) => {
const {
name,
path,
sha,
size,
content,
type,
} = fileOrDir
return {
path: encodeURIComponent(object.path),
dirName
name,
path,
sha,
size,
content,
type,
}
})

const folderPath = this.dirType.getFolderName()
const pathArr = folderPath.split('/')
if (folderPath.slice(0,1) !== '_' || pathArr.length > 2 || (pathArr.length === 2 && pathArr[1].includes('.'))) {
throw new BadRequestError(`The provided path ${folderPath} is not a valid directory!`)
}
})

return _.compact(filesOrDirs)
}

if (this.dirType instanceof ResourceRoomType) {
const directories = resp.data.map(object => {
const pathNameSplit = object.path.split("/")
const dirName = pathNameSplit[pathNameSplit.length - 1]
if (object.type === 'dir') {
return {
path: encodeURIComponent(object.path),
dirName
}
}
})
return _.compact(directories)
}

Expand All @@ -60,13 +98,24 @@ class Directory {
}
}

class FolderType {
constructor(folderPath) {
this.folderName = folderPath
}

getFolderName() {
return this.folderName
}
}

class ResourceRoomType {
constructor(resourceRoomName) {
this.folderName = `${resourceRoomName}`
}

getFolderName() {
return this.folderName
}
}

module.exports = { Directory, ResourceRoomType }
module.exports = { Directory, FolderType, ResourceRoomType }
51 changes: 51 additions & 0 deletions docs/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ tags:
- name: Authentication
- name: Collections
- name: Collection Pages
- name: Folders
- name: Images
- name: Documents
- name: Pages
Expand Down Expand Up @@ -54,6 +55,34 @@ components:
type: array
items:
type: string
FolderListItem:
type: object
properties:
name:
type: string
description: File or directory name
path:
type: string
description: File or directory path
sha:
type: string
description: SHA of the data object
size:
type: number
description: Size of the file in bytes (this defaults to 0 for directories)
content:
type: string
description: Content of the file in base 64 (this is null for directories)
type:
type: string
description: Either 'dir' or 'file'
FolderListResponse:
properties:
folderPages:
type: array
description: Array of file or directory data types
items:
$ref: "#/components/schemas/FolderListItem"
PageListResponse:
properties:
pages:
Expand Down Expand Up @@ -225,6 +254,28 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/OAuthParams"
/v1/sites/{siteName}/folders:
get:
tags:
- Folders
parameters:
- name: siteName
in: path
required: true
schema:
type: string
- name: path
description: The path of the directory from which we want to retrieve folder contents
in: query
schema:
type: string
responses:
200:
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/FolderListResponse"
/v1/sites/{siteName}/collections:
get:
tags:
Expand Down
12 changes: 12 additions & 0 deletions errors/BadRequestError.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Import base error
const { BaseIsomerError } = require('./BaseError')

class BadRequestError extends BaseIsomerError {
constructor (message) {
super(400, message)
}
}

module.exports = {
BadRequestError,
}
3 changes: 3 additions & 0 deletions middleware/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ auth.get('/v1', noVerify)
auth.get('/v1/sites/:siteName/homepage', verifyJwt)
auth.post('/v1/sites/:siteName/homepage', verifyJwt)

// Folder pages
auth.get('/v1/sites/:siteName/folders', verifyJwt)

// Collection pages
auth.get('/v1/sites/:siteName/collections/:collectionName', verifyJwt)
auth.get('/v1/sites/:siteName/collections/:collectionName/pages', verifyJwt)
Expand Down
25 changes: 25 additions & 0 deletions routes/folders.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const express = require('express');
const router = express.Router();

// Import middleware
const { attachRouteHandlerWrapper } = require('../middleware/routeHandler')

// Import classes
const { Directory, FolderType } = require('../classes/Directory.js');

// List pages and directories in folder
async function listFolderContent (req, res, next) {
const { accessToken } = req
const { siteName } = req.params
const { path } = req.query

const IsomerDirectory = new Directory(accessToken, siteName)
const folderType = new FolderType(path)
IsomerDirectory.setDirType(folderType)
const folderPages = await IsomerDirectory.list()
res.status(200).json({ folderPages })
}

router.get('/:siteName/folders', attachRouteHandlerWrapper(listFolderContent))

module.exports = router;
2 changes: 2 additions & 0 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const sitesRouter = require('./routes/sites')
const pagesRouter = require('./routes/pages')
const collectionsRouter = require('./routes/collections')
const collectionPagesRouter = require('./routes/collectionPages')
const foldersRouter = require('./routes/folders')
const resourceRoomRouter = require('./routes/resourceRoom')
const resourcesRouter = require('./routes/resources')
const resourcePagesRouter = require('./routes/resourcePages')
Expand Down Expand Up @@ -56,6 +57,7 @@ app.use('/v1/sites', sitesRouter)
app.use('/v1/sites', pagesRouter)
app.use('/v1/sites', collectionsRouter)
app.use('/v1/sites', collectionPagesRouter)
app.use('/v1/sites', foldersRouter)
app.use('/v1/sites', resourceRoomRouter)
app.use('/v1/sites', resourcesRouter)
app.use('/v1/sites', resourcePagesRouter)
Expand Down

0 comments on commit 0bdac5f

Please sign in to comment.