Merge branch 'master' of https://github.com/DSpace/dspace-angular into testing

# Conflicts:
#	package.json
This commit is contained in:
Giuseppe Digilio
2016-12-22 18:27:26 +01:00
14 changed files with 805 additions and 111 deletions

View File

@@ -1,12 +1,15 @@
var util = require('util');
var { Router } = require('express');
const util = require('util');
const { Router } = require('express');
// Our API for demos only
import { fakeDataBase } from './db';
import { fakeDemoRedisCache } from './cache';
import { COLLECTIONS } from "./collections";
import { ITEMS } from "./items";
import { METADATA } from "./metadata";
// you would use cookies/token etc
var USER_ID = 'f9d98cf1-1b96-464e-8755-bcc2a5c09077'; // hardcoded as an example
const USER_ID = 'f9d98cf1-1b96-464e-8755-bcc2a5c09077'; // hardcoded as an example
// Our API for demos only
export function serverApi(req, res) {
@@ -27,80 +30,155 @@ export function serverApi(req, res) {
}
// todo API
let COLLECTION_COUNT = 2;
let ITEM_COUNT = 2;
var COUNT = 4;
var TODOS = [
{ id: 0, value: 'finish example', created_at: new Date(), completed: false },
{ id: 1, value: 'add tests', created_at: new Date(), completed: false },
{ id: 2, value: 'include development environment', created_at: new Date(), completed: false },
{ id: 3, value: 'include production environment', created_at: new Date(), completed: false }
];
export function createTodoApi() {
function toJSONAPIResponse(req, data, included?) {
let result = {
"data": data,
"links": {
"self": req.protocol + '://' + req.get('host') + req.originalUrl
}
};
if (included && Array.isArray(included) && included.length > 0) {
Object.assign(result, {
"included": included
});
}
return result;
}
var router = Router()
export function createMockApi() {
router.route('/todos')
let router = Router();
router.route('/collections')
.get(function(req, res) {
console.log('GET');
// 70ms latency
setTimeout(function() {
res.json(TODOS);
res.json(toJSONAPIResponse(req, COLLECTIONS));
}, 0);
})
.post(function(req, res) {
console.log('POST', util.inspect(req.body, { colors: true }));
var todo = req.body;
if (todo) {
TODOS.push({
value: todo.value,
created_at: new Date(),
completed: todo.completed,
id: COUNT++
});
return res.json(todo);
}
return res.end();
// })
// .post(function(req, res) {
// console.log('POST', util.inspect(req.body, { colors: true }));
// let collection = req.body;
// if (collection) {
// COLLECTIONS.push({
// value: collection.value,
// created_at: new Date(),
// completed: collection.completed,
// id: COLLECTION_COUNT++
// });
// return res.json(collection);
// }
//
// return res.end();
});
router.param('todo_id', function(req, res, next, todo_id) {
router.param('collection_id', function(req, res, next, collection_id) {
// ensure correct prop type
var id = Number(req.params.todo_id);
let id = req.params.collection_id;
try {
var todo = TODOS[id];
req.todo_id = id;
req.todo = TODOS[id];
req.collection_id = id;
req.collection = COLLECTIONS.find((collection) => {
return collection.id = id;
});
next();
} catch (e) {
next(new Error('failed to load todo'));
next(new Error('failed to load collection'));
}
});
router.route('/todos/:todo_id')
router.route('/collections/:collection_id')
.get(function(req, res) {
console.log('GET', util.inspect(req.todo, { colors: true }));
console.log('GET', util.inspect(req.collection, { colors: true }));
res.json(toJSONAPIResponse(req, req.collection));
// })
// .put(function(req, res) {
// console.log('PUT', util.inspect(req.body, { colors: true }));
//
// let index = COLLECTIONS.indexOf(req.collection);
// let collection = COLLECTIONS[index] = req.body;
//
// res.json(collection);
// })
// .delete(function(req, res) {
// console.log('DELETE', req.collection_id);
//
// let index = COLLECTIONS.indexOf(req.collection);
// COLLECTIONS.splice(index, 1);
//
// res.json(req.collection);
});
res.json(req.todo);
})
.put(function(req, res) {
console.log('PUT', util.inspect(req.body, { colors: true }));
var index = TODOS.indexOf(req.todo);
var todo = TODOS[index] = req.body;
router.route('/items')
.get(function(req, res) {
console.log('GET');
// 70ms latency
setTimeout(function() {
res.json(toJSONAPIResponse(req, ITEMS));
}, 0);
res.json(todo);
})
.delete(function(req, res) {
console.log('DELETE', req.todo_id);
// })
// .post(function(req, res) {
// console.log('POST', util.inspect(req.body, { colors: true }));
// let item = req.body;
// if (item) {
// ITEMS.push({
// value: item.value,
// created_at: new Date(),
// completed: item.completed,
// id: ITEM_COUNT++
// });
// return res.json(item);
// }
//
// return res.end();
});
var index = TODOS.indexOf(req.todo);
TODOS.splice(index, 1);
router.param('item_id', function(req, res, next, item_id) {
// ensure correct prop type
let id = req.params.item_id;
try {
req.item_id = id;
req.item = ITEMS.find((item) => {
return item.id === id;
});
next();
} catch (e) {
next(new Error('failed to load item'));
}
});
res.json(req.todo);
router.route('/items/:item_id')
.get(function(req, res) {
console.log('GET', util.inspect(req.item, { colors: true }));
const metadataIds: string[] = req.item.relationships.metadata.data.map(obj => obj.id);
const itemMetadata: any[] = METADATA.filter((metadatum) => {
return metadataIds.indexOf(metadatum.id) >= 0
});
res.json(toJSONAPIResponse(req, req.item, itemMetadata));
// })
// .put(function(req, res) {
// console.log('PUT', util.inspect(req.body, { colors: true }));
//
// let index = ITEMS.indexOf(req.item);
// let item = ITEMS[index] = req.body;
//
// res.json(item);
// })
// .delete(function(req, res) {
// console.log('DELETE', req.item_id);
//
// let index = ITEMS.indexOf(req.item);
// ITEMS.splice(index, 1);
//
// res.json(req.item);
});
return router;
};
}

View File

@@ -0,0 +1,42 @@
export const COLLECTIONS = [
{
"id": "9e32a2e2-6b91-4236-a361-995ccdc14c60",
"type": "collections",
"attributes": {
"name": "A Test Collection",
"handle": "123456789/5179",
"copyrightText": "<p>© 2005-2016 JOHN DOE SOME RIGHTS RESERVED</p>",
"introductoryText": "<p class='lead'>An introductory text dolor sit amet, consectetur adipiscing elit. Duis laoreet lorem erat, eget auctor est ultrices quis. Nullam ac tincidunt quam. In nec nisl odio. In egestas aliquam tincidunt.</p>\r\n<p>Integer vitae diam id dolor pharetra dignissim in sed enim. Vivamus pulvinar tristique sem a iaculis. Aenean ultricies dui vel facilisis laoreet. Integer porta erat eu ultrices rhoncus. Sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum.</p>",
"shortDescription": "A collection for testing purposes",
"sidebarText": "<p>Some news sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum. Donec sed ultricies erat, nec sollicitudin mauris. Duis varius nulla quis quam vulputate, at hendrerit turpis rutrum. Integer nec facilisis sapien. Fusce fringilla malesuada lectus id pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae</p>"
},
"relationships": {
"items": {
"data": [
{ "type": "items", "id": "21539b1d-9ef1-4eda-9c77-49565b5bfb78" },
{ "type": "items", "id": "be8325f7-243b-49f4-8a4b-df2b793ff3b5" }
]
}
}
},
{
"id": "598ce822-c357-46f3-ab70-63724d02d6ad",
"type": "collections",
"attributes": {
"name": "Another Test Collection",
"handle": "123456789/6547",
"copyrightText": "<p>© 2005-2016 JOHN DOE SOME RIGHTS RESERVED</p>",
"introductoryText": "<p class='lead'>Another introductory text dolor sit amet, consectetur adipiscing elit. Duis laoreet lorem erat, eget auctor est ultrices quis. Nullam ac tincidunt quam. In nec nisl odio. In egestas aliquam tincidunt.</p>\r\n<p>Integer vitae diam id dolor pharetra dignissim in sed enim. Vivamus pulvinar tristique sem a iaculis. Aenean ultricies dui vel facilisis laoreet. Integer porta erat eu ultrices rhoncus. Sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum.</p>",
"shortDescription": "Another collection for testing purposes",
"sidebarText": "<p>Some more news sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum. Donec sed ultricies erat, nec sollicitudin mauris. Duis varius nulla quis quam vulputate, at hendrerit turpis rutrum. Integer nec facilisis sapien. Fusce fringilla malesuada lectus id pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae</p>"
},
"relationships": {
"items": {
"data": [
{ "type": "items", "id": "21539b1d-9ef1-4eda-9c77-49565b5bfb78" },
{ "type": "items", "id": "be8325f7-243b-49f4-8a4b-df2b793ff3b5" }
]
}
}
}
];

128
src/backend/items.ts Normal file
View File

@@ -0,0 +1,128 @@
export const ITEMS = [
{
"id": "21539b1d-9ef1-4eda-9c77-49565b5bfb78",
"type": "items",
"attributes": {
"name": "Do Open-Access Articles Have a Greater Research Impact?",
"handle": "123456789/8871",
"lastModified": "2016-10-14 10:41:12.886",
"isArchived": true,
"isWithdrawn": false
},
"relationships": {
"collections": {
"data": [
{ "type": "collections", "id": "9e32a2e2-6b91-4236-a361-995ccdc14c60" },
{ "type": "collections", "id": "598ce822-c357-46f3-ab70-63724d02d6ad" }
]
},
"metadata": {
"data": [
{
"type": "metadata",
"id": "d58a3098-b390-4cd6-8f52-b088b3daa637",
},
{
"type": "metadata",
"id": "56660730-0e0d-47ec-864a-bda2327d5716",
},
{
"type": "metadata",
"id": "b9d4ae74-2758-4964-a95e-eecd35b62f26",
},
{
"type": "metadata",
"id": "311529ea-e339-4d8f-9292-813ebe515f03",
},
{
"type": "metadata",
"id": "fa875444-3faf-482a-b099-77233bda914d",
},
{
"type": "metadata",
"id": "ddbb161b-6e52-4a90-9096-c8eae8cec4c9",
},
{
"type": "metadata",
"id": "ba51287d-a2c9-409b-8129-060b693a7570",
},
{
"type": "metadata",
"id": "e5c1c9d4-b4e2-4bdc-9153-6b769742b33f",
},
{
"type": "metadata",
"id": "4c125844-1eca-47aa-98f8-61c51a9c962f",
},
{
"type": "metadata",
"id": "362c753c-a44d-468d-b256-486470b8c1e1",
},
{
"type": "metadata",
"id": " 69a02355-37bb-479f-9496-c8743fcacf3c",
},
{
"type": "metadata",
"id": "ffbd75d5-bf3a-47ff-af22-490240f6fcc6",
}
]
}
},
},
{
"id": "be8325f7-243b-49f4-8a4b-df2b793ff3b5",
"type": "items",
"attributes": {
"name": "Another Test Item",
"handle": "123456789/9978",
"lastModified": "2016-05-27 03:00:20.063",
"isArchived": true,
"isWithdrawn": false
},
"relationships": {
"collections": {
"data": [
{ "type": "collections", "id": "9e32a2e2-6b91-4236-a361-995ccdc14c60" },
{ "type": "collections", "id": "598ce822-c357-46f3-ab70-63724d02d6ad" }
]
},
"metadata": {
"data": [
{
"type": "metadata",
"id": "981c725e-53f3-4749-89ee-ef042f23c3c3",
},
{
"type": "metadata",
"id": "521df61d-c541-4180-beb8-ac0a1bd1e852",
},
{
"type": "metadata",
"id": "551a216d-5350-4b15-9398-9bc2e95e7a3d",
},
{
"type": "metadata",
"id": " eb17dce4-3892-47fe-b014-6ff8e17a93ef",
},
{
"type": "metadata",
"id": "3e840957-cb1b-4521-8f5d-fb5f6956f303",
},
{
"type": "metadata",
"id": "ae0bc880-481b-4425-aa5b-354b38d24e4f",
},
{
"type": "metadata",
"id": "8dc89ac4-d606-4f1a-8524-8f70a6b371de",
},
{
"type": "metadata",
"id": "13185eb9-dc05-4bd7-9c2d-5322a2ac5326",
}
]
}
}
}
];

182
src/backend/metadata.ts Normal file
View File

@@ -0,0 +1,182 @@
export const METADATA = [
{
"type": "metadata",
"id": "d58a3098-b390-4cd6-8f52-b088b3daa637",
"attributes": {
"key": "dc.contributor.author",
"value": "Antelman, Kristin",
"language": "en"
}
},
{
"type": "metadata",
"id": "56660730-0e0d-47ec-864a-bda2327d5716",
"attributes": {
"key": "dc.date.accessioned",
"value": "2016-10-14T10:41:13Z",
"language": null
}
},
{
"type": "metadata",
"id": "b9d4ae74-2758-4964-a95e-eecd35b62f26",
"attributes": {
"key": "dc.date.available",
"value": "2016-10-14T10:41:13Z",
"language": null
}
},
{
"type": "metadata",
"id": "311529ea-e339-4d8f-9292-813ebe515f03",
"attributes": {
"key": "dc.date.issued",
"value": "2004-09-01",
"language": "en"
}
},
{
"type": "metadata",
"id": "fa875444-3faf-482a-b099-77233bda914d",
"attributes": {
"key": "dc.identifier.uri",
"value": "http://hdl.handle.net/123456789/8871",
"language": null
}
},
{
"type": "metadata",
"id": "ddbb161b-6e52-4a90-9096-c8eae8cec4c9",
"attributes": {
"key": "dc.description.abstract",
"value": "Although many authors believe that their work has a greater research impact if it is freely available, studies to demonstrate that impact are few. This study looks at articles in four disciplines at varying stages of adoption of open access—philosophy, political science, electrical and electronic engineering and mathematics—to see whether they have a greater impact as measured by citations in the ISI Web of Science database when their authors make them freely available on the Internet. The finding is that, across all four disciplines, freely available articles do have a greater research impact. Shedding light on this category of open access reveals that scholars in diverse disciplines are adopting open-access practices and being rewarded for it.",
"language": "en"
}
},
{
"type": "metadata",
"id": "ba51287d-a2c9-409b-8129-060b693a7570",
"attributes": {
"key": "dc.publisher",
"value": "College & Research Libraries News",
"language": "en"
}
},
{
"type": "metadata",
"id": "e5c1c9d4-b4e2-4bdc-9153-6b769742b33f",
"attributes": {
"key": "dc.subject",
"value": "Publishing",
"language": "en"
}
},
{
"type": "metadata",
"id": "4c125844-1eca-47aa-98f8-61c51a9c962f",
"attributes": {
"key": "dc.subject",
"value": "Intellectual Property",
"language": "en"
}
},
{
"type": "metadata",
"id": "362c753c-a44d-468d-b256-486470b8c1e1",
"attributes": {
"key": "dc.subject",
"value": "Open Access",
"language": "en"
}
},
{
"type": "metadata",
"id": " 69a02355-37bb-479f-9496-c8743fcacf3c",
"attributes": {
"key": "dc.title",
"value": "Do Open-Access Articles Have a Greater Research Impact?",
"language": "en"
}
},
{
"type": "metadata",
"id": "ffbd75d5-bf3a-47ff-af22-490240f6fcc6",
"attributes": {
"key": "dc.type",
"value": "(not specified)",
"language": "en"
}
},
{
"type": "metadata",
"id": "981c725e-53f3-4749-89ee-ef042f23c3c3",
"attributes": {
"key": "dc.contributor.author",
"value": "John Doe",
"language": "en"
}
},
{
"type": "metadata",
"id": "521df61d-c541-4180-beb8-ac0a1bd1e852",
"attributes": {
"key": "dc.date.accessioned",
"value": "2016-05-27T07:45:04Z",
"language": null
}
},
{
"type": "metadata",
"id": "551a216d-5350-4b15-9398-9bc2e95e7a3d",
"attributes": {
"key": "dc.date.available",
"value": "2016-05-27T07:45:04Z",
"language": null
}
},
{
"type": "metadata",
"id": " eb17dce4-3892-47fe-b014-6ff8e17a93ef",
"attributes": {
"key": "dc.date.issued",
"value": "2016-05-27",
"language": "en"
}
},
{
"type": "metadata",
"id": "3e840957-cb1b-4521-8f5d-fb5f6956f303",
"attributes": {
"key": "dc.identifier.uri",
"value": "http://hdl.handle.net/123456789/9978",
"language": null
}
},
{
"type": "metadata",
"id": "ae0bc880-481b-4425-aa5b-354b38d24e4f",
"attributes": {
"key": "dc.description.abstract",
"value": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas lacus velit, lacinia eu ultrices nec, auctor in sem. Donec interdum convallis ornare. Aliquam et tortor risus. Praesent ut feugiat eros, eu consequat nibh. Morbi id quam eu mi pellentesque consequat vel vitae sem. Praesent sed velit ullamcorper, efficitur odio non, aliquet urna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque eu placerat urna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla non aliquet mauris. Nulla quis posuere lorem. Pellentesque tempus maximus ipsum ac pretium. Nunc hendrerit tempus sem, vitae luctus erat consectetur vestibulum. Nulla sodales felis in dictum sagittis.\n\nNullam porta magna quis magna vulputate elementum. Pellentesque dictum lorem id nisl tincidunt condimentum. Sed est dolor, dapibus sit amet augue at, malesuada cursus quam. Pellentesque elit felis, malesuada dictum congue tristique, iaculis euismod ligula. Donec dignissim dolor eu lacus pulvinar porttitor. Sed quis semper augue, dictum sollicitudin eros. \n\nMauris congue lectus at turpis viverra scelerisque. Praesent at urna rhoncus, condimentum odio ac, sagittis libero. Nulla aliquam ornare bibendum. Duis quis ornare urna. Suspendisse semper tincidunt neque nec consequat. Sed enim diam, mollis eu neque vitae, lacinia varius risus. Fusce nec sem tempor, efficitur lectus sed, porta sem. Pellentesque sollicitudin ut dui vitae malesuada.",
"language": "en"
}
},
{
"type": "metadata",
"id": "8dc89ac4-d606-4f1a-8524-8f70a6b371de",
"attributes": {
"key": "dc.title",
"value": "Another Test Item",
"language": "en"
}
},
{
"type": "metadata",
"id": "13185eb9-dc05-4bd7-9c2d-5322a2ac5326",
"attributes": {
"key": "dc.type",
"value": "(not specified)",
"language": "en"
}
}
];

20
src/index-aot.html Normal file
View File

@@ -0,0 +1,20 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>DSpace</title>
<meta name="viewport" content="width=device-width,minimum-scale=1">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<link rel="stylesheet" href="/styles/main.css">
<base href="/">
</head>
<body>
<ds-app>
Loading DSpace ...
</ds-app>
<script async src="/build.js"></script>
</body>
</html>

View File

@@ -73,13 +73,13 @@ app.use(cacheControl, express.static(path.join(ROOT, 'dist/client'), { index: fa
/////////////////////////
// ** Example API
// Notice API should be in a separate process
import { serverApi, createTodoApi } from './backend/api';
import { serverApi, createMockApi } from './backend/api';
// Our API for demos only
app.get('/data.json', serverApi);
app.use('/api', createTodoApi());
app.use('/api', createMockApi());
function ngApp(req, res) {
res.render('index', {
res.render('index-aot', {
req,
res,
// time: true, // use this to determine what part of your app is slow only in development

View File

@@ -66,10 +66,10 @@ app.use(cacheControl, express.static(path.join(ROOT, 'dist/client'), { index: fa
/////////////////////////
// ** Example API
// Notice API should be in aseparate process
import { serverApi, createTodoApi } from './backend/api';
import { serverApi, createMockApi } from './backend/api';
// Our API for demos only
app.get('/data.json', serverApi);
app.use('/api', createTodoApi());
app.use('/api', createMockApi());
function ngApp(req, res) {
res.render('index', {