Skip to content

Commit eb6282d

Browse files
committed
Adds the ability to fetch schemas
1 parent 7fab312 commit eb6282d

File tree

14 files changed

+187
-8
lines changed

14 files changed

+187
-8
lines changed

dist/api.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ router.use(cors());
99
router.use('/config', connectionMiddleware_1.addConnectionToRequest, require('./api/config'));
1010
router.use('/plugins', connectionMiddleware_1.addConnectionToRequest, require('./api/plugins'));
1111
router.use('/query', connectionMiddleware_1.addConnectionToRequest, require('./api/query'));
12+
router.use('/schemas', connectionMiddleware_1.addConnectionToRequest, require('./api/schemas'));
1213
router.use('/tables', connectionMiddleware_1.addConnectionToRequest, require('./api/tables'));
1314
router.use('/users', connectionMiddleware_1.addConnectionToRequest, require('./api/users'));
1415
module.exports = router;

dist/api/schemas.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
"use strict";
2+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4+
return new (P || (P = Promise))(function (resolve, reject) {
5+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8+
step((generator = generator.apply(thisArg, _arguments || [])).next());
9+
});
10+
};
11+
var __generator = (this && this.__generator) || function (thisArg, body) {
12+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14+
function verb(n) { return function (v) { return step([n, v]); }; }
15+
function step(op) {
16+
if (f) throw new TypeError("Generator is already executing.");
17+
while (_) try {
18+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19+
if (y = 0, t) op = [op[0] & 2, t.value];
20+
switch (op[0]) {
21+
case 0: case 1: t = op; break;
22+
case 4: _.label++; return { value: op[1], done: false };
23+
case 5: _.label++; y = op[1]; op = [0]; continue;
24+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
25+
default:
26+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30+
if (t[2]) _.ops.pop();
31+
_.trys.pop(); continue;
32+
}
33+
op = body.call(thisArg, _);
34+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36+
}
37+
};
38+
Object.defineProperty(exports, "__esModule", { value: true });
39+
var Router = require('express').Router;
40+
var router = new Router();
41+
var schemas = require('../lib/sql').schemas;
42+
var RunQuery = require('../lib/connectionPool');
43+
var schemas_1 = require("../lib/constants/schemas");
44+
router.get('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
45+
var data, query, payload, error_1;
46+
return __generator(this, function (_a) {
47+
switch (_a.label) {
48+
case 0:
49+
_a.trys.push([0, 2, , 3]);
50+
return [4 /*yield*/, RunQuery(req.headers.pg, schemas.list)];
51+
case 1:
52+
data = (_a.sent()).data;
53+
query = req.query;
54+
payload = data;
55+
if (!(query === null || query === void 0 ? void 0 : query.includeSystemSchemas))
56+
payload = removeSystemSchemas(data);
57+
return [2 /*return*/, res.status(200).json(payload)];
58+
case 2:
59+
error_1 = _a.sent();
60+
console.log('throwing error');
61+
res.status(500).json({ error: 'Database error', status: 500 });
62+
return [3 /*break*/, 3];
63+
case 3: return [2 /*return*/];
64+
}
65+
});
66+
}); });
67+
var removeSystemSchemas = function (data) {
68+
return data.filter(function (x) { return !schemas_1.DEFAULT_SYSTEM_SCHEMAS.includes(x.schema_name); });
69+
};
70+
module.exports = router;

dist/lib/constants/schemas.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
exports.DEFAULT_SYSTEM_SCHEMAS = void 0;
4+
exports.DEFAULT_SYSTEM_SCHEMAS = [
5+
'information_schema',
6+
'pg_catalog',
7+
'pg_toast_temp_1',
8+
'pg_temp_1',
9+
'pg_toast',
10+
];

dist/lib/interfaces/schemas.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });

dist/lib/sql/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ module.exports = {
2727
sequences: {
2828
list: fs.readFileSync(path.join(__dirname, '/sequences/list.sql')).toString(),
2929
},
30+
schemas: {
31+
list: fs.readFileSync(path.join(__dirname, '/schemas/list.sql')).toString(),
32+
},
3033
types: {
3134
list: fs.readFileSync(path.join(__dirname, '/types/list.sql')).toString(),
3235
},

dist/lib/sql/schemas/list.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
SELECT
2+
catalog_name,
3+
schema_name,
4+
schema_owner,
5+
default_character_set_catalog,
6+
default_character_set_schema,
7+
default_character_set_name,
8+
sql_path
9+
FROM
10+
information_schema.schemata

package.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,6 @@
4444
"url": "https://github.com/supabase/pg-api/issues"
4545
},
4646
"homepage": "https://github.com/supabase/pg-api#readme",
47-
"babel": {
48-
"presets": [
49-
"@babel/preset-env"
50-
],
51-
"plugins": [
52-
"@babel/plugin-transform-runtime"
53-
]
54-
},
5547
"nodemonConfig": {
5648
"exec": "npm run dev",
5749
"watch": [

src/api.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ router.use(cors())
88
router.use('/config', addConnectionToRequest, require('./api/config'))
99
router.use('/plugins', addConnectionToRequest, require('./api/plugins'))
1010
router.use('/query', addConnectionToRequest, require('./api/query'))
11+
router.use('/schemas', addConnectionToRequest, require('./api/schemas'))
1112
router.use('/tables', addConnectionToRequest, require('./api/tables'))
1213
router.use('/users', addConnectionToRequest, require('./api/users'))
1314

src/api/schemas.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const { Router } = require('express')
2+
const router = new Router()
3+
const { schemas } = require('../lib/sql')
4+
const RunQuery = require('../lib/connectionPool')
5+
import { DEFAULT_SYSTEM_SCHEMAS } from '../lib/constants/schemas'
6+
import { Schema } from '../lib/interfaces/schemas'
7+
8+
/**
9+
* @param {boolean} [includeSystemSchemas=false] - Return system schemas as well as user schemas
10+
*/
11+
interface GetSchemasQueryParams {
12+
includeSystemSchemas: boolean
13+
}
14+
router.get('/', async (req, res) => {
15+
try {
16+
const { data } = await RunQuery(req.headers.pg, schemas.list)
17+
const query: GetSchemasQueryParams = req.query
18+
let payload: Schema[] = data
19+
if (!query?.includeSystemSchemas) payload = removeSystemSchemas(data)
20+
21+
return res.status(200).json(payload)
22+
} catch (error) {
23+
console.log('throwing error')
24+
res.status(500).json({ error: 'Database error', status: 500 })
25+
}
26+
})
27+
28+
29+
const removeSystemSchemas = (data: Schema[]) => {
30+
return data.filter((x) => !DEFAULT_SYSTEM_SCHEMAS.includes(x.schema_name))
31+
}
32+
33+
34+
35+
module.exports = router

src/lib/constants/schemas.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const DEFAULT_SYSTEM_SCHEMAS: string[] = [
2+
'information_schema',
3+
'pg_catalog',
4+
'pg_toast_temp_1',
5+
'pg_temp_1',
6+
'pg_toast',
7+
]

0 commit comments

Comments
 (0)