From 6766f532483a4120c08d61d580ad2b65b1b3d81f Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Sat, 2 May 2020 15:40:11 -0500 Subject: [PATCH] drop /pacosako prefix on APIs and serve static files --- README.md | 38 +++++++++++++++++++++++--------------- index.js | 17 ++++++++++++----- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index db60f27..d6df9d2 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ The following data is stored in the database but not included in any REST API: ## REST APIs -### `GET /pacosako/api/games` +### `GET /api/games` Returns the list of active games. A game is considered "active" if the `timestamp` field indicates that @@ -104,7 +104,7 @@ The objects in the `games` array include all of the game object fields described above *except* the `board` field. -### `GET /pacosako/api/games/poll/:afterTime` +### `GET /api/games/poll/:afterTime` Parameters: @@ -112,7 +112,7 @@ Parameters: Any record with a `modified` field less than or equal to this value is excluded from the results. -Equivalent to the `GET /pacosako/api/games` API with two exceptions. +Equivalent to the `GET /api/games` API with two exceptions. First, it excludes games with older `modified` times from the results. Second, if there are no results which match this criteria then the server waits up to one minute for the situation to change @@ -124,9 +124,9 @@ then the server will respond immediately with the new information. The `afterTime` parameter will normally match the `modified` field from the most recent successful response to either -`GET /pacosako/api/games` or `GET /pacosako/api/games/poll/:afterTime`. +`GET /api/games` or `GET /api/games/poll/:afterTime`. -### `GET /pacosako/api/game/:gameId` +### `GET /api/game/:gameId` Parameters: @@ -136,12 +136,12 @@ On success this API returns the complete game object for the given `gameId`, which must be a 16-character hexadecimal string. If there is no record matching the given gameId then a 404 status code is returned. -### `GET /pacosako/api/meta/:gameId` +### `GET /api/meta/:gameId` -This API is identical to `GET /pacosako/api/game/:gameId` except that the +This API is identical to `GET /api/game/:gameId` except that the `board` field is omitted from the response. -### `GET /pacosako/api/game/:gameId/poll/:afterTime` +### `GET /api/game/:gameId/poll/:afterTime` Parameters: @@ -150,7 +150,7 @@ Parameters: * `afterTime`: Integer. The response must be a game object with a `modified` field strictly greater than this value. -Equivalent to the `GET /pacosako/api/game/:gameId` API except that +Equivalent to the `GET /api/game/:gameId` API except that if there is no record with a matching `gameId` or the record has a `modified` field less than or equal to the `afterTime` parameter then the server waits up to one minute for the situation to change @@ -163,14 +163,14 @@ this API does not return a 404 status code when the `gameId` does not exist. The `afterTime` parameter will normally match the `modified` field from the most recent successful response to either -`GET /pacosako/api/game/:gameId` or `GET /pacosako/api/game/:gameId/poll/:afterTime`. +`GET /api/game/:gameId` or `GET /api/game/:gameId/poll/:afterTime`. -### `GET /pacosako/api/meta/:gameId/poll/:afterTime` +### `GET /api/meta/:gameId/poll/:afterTime` -This API is identical to `GET /pacosako/api/game/:gameId/poll/:afterTime` +This API is identical to `GET /api/game/:gameId/poll/:afterTime` except that the `board` field is omitted from the response. -### `POST /pacosako/api/game/:gameId` +### `POST /api/game/:gameId` Parameters: @@ -202,7 +202,15 @@ Otherwise the POST request succeeds with a status code of 200 and the response body consists of a `success` field with the value `true` and the `modified` field of the new version of the record. -### `POST /pacosako/api/meta/:gameId` +### `POST /api/meta/:gameId` -This is an alias for the `POST /pacosako/api/game/:gameId` API. +This is an alias for the `POST /api/game/:gameId` API. Either API can be used to update any field, including `board`. + +## Static Files + +If a directory named `public` exists in the current directory +then the contents of the `public` directory are served as static files +for any request which does not match one of the REST APIs listed above. +This allows this package to serve as a standalone server for both the REST APIs +and any client-side resources. diff --git a/index.js b/index.js index 654c971..eb267a7 100644 --- a/index.js +++ b/index.js @@ -431,12 +431,19 @@ const app = express(); app.use(cors()); -app.get('/pacosako/api/games/poll/:afterTime', catchExceptionsJson(getGameListHandler)); -app.get('/pacosako/api/games', catchExceptionsJson(getGameListHandler)); +app.get('/api/games/poll/:afterTime', catchExceptionsJson(getGameListHandler)); +app.get('/api/games', catchExceptionsJson(getGameListHandler)); -app.get('/pacosako/api/:type(game|meta)/:gameId/poll/:afterTime', catchExceptionsJson(getGameHandler)); -app.get('/pacosako/api/:type(game|meta)/:gameId', catchExceptionsJson(getGameHandler)); -app.post('/pacosako/api/:type(game|meta)/:gameId', express.json(), catchExceptionsJson(postGameHandler)); +app.get('/api/:type(game|meta)/:gameId/poll/:afterTime', catchExceptionsJson(getGameHandler)); +app.get('/api/:type(game|meta)/:gameId', catchExceptionsJson(getGameHandler)); +app.post('/api/:type(game|meta)/:gameId', express.json(), catchExceptionsJson(postGameHandler)); + +if (fs.statSync('public').isDirectory()) { + app.use(express.static('public', { + fallthrough: false, + maxAge: 0, + })); +} var config = { port: process.env.OPENSHIFT_NODEJS_PORT || process.env.VCAP_APP_PORT || process.env.PORT || process.argv[2] || 8765 };