Skip to content

Commit b067b81

Browse files
authored
Merge pull request #20 from blue-core-lod/t19-sinopia-templates
Support for Loading and Editing Sinopia Resource Templates
2 parents 3c809a1 + 2262a11 commit b067b81

File tree

10 files changed

+87
-44
lines changed

10 files changed

+87
-44
lines changed

src/Config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class Config {
7474
}
7575

7676
static get templateSearchPath() {
77-
return "/api/search/sinopia_templates/_search"
77+
return "/profile"
7878
}
7979

8080
static get sinopiaDomainName() {

src/actionCreators/authenticate.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,5 @@ export const signOut = (keycloak) => (dispatch) => {
3737

3838
const toUser = (keycloakUser) => ({
3939
username: keycloakUser.preferred_username,
40-
groups: [], // This needs to be a separate call to the api
40+
groups: ["blue core"], // This needs to be a separate call to the api
4141
})

src/actionCreators/resources.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ import { addResourceHistory } from "actionCreators/history"
4343
import _ from "lodash"
4444
import { setCurrentComponent } from "actions/index"
4545
import { loadRelationships } from "./relationships"
46+
import { useKeycloak } from "../KeycloakContext"
47+
4648

4749
/**
4850
* A thunk that loads an existing resource from Sinopia API and adds to state.
@@ -101,14 +103,14 @@ export const loadResource =
101103
}
102104

103105
export const loadResourceForEditor =
104-
(uri, errorKey, { asNewResource = false } = {}) =>
106+
(uri, errorKey, { asNewResource = false } = {}, keycloak) =>
105107
(dispatch) =>
106108
dispatch(loadResource(uri, errorKey, { asNewResource })).then((result) =>
107-
dispatch(dispatchResourceForEditor(result, uri, { asNewResource }))
109+
dispatch(dispatchResourceForEditor(result, uri, { asNewResource }, keycloak))
108110
)
109111

110112
export const dispatchResourceForEditor =
111-
(result, uri, { asNewResource = false } = {}) =>
113+
(result, uri, { asNewResource = false } = {}, keycloak) =>
112114
(dispatch) => {
113115
if (!result) return false
114116
const [response, resource] = result
@@ -121,13 +123,14 @@ export const dispatchResourceForEditor =
121123
)
122124
dispatch(setCurrentResource(resource.key))
123125
if (!asNewResource) {
124-
dispatch(addUserResourceHistory(uri))
126+
dispatch(addUserResourceHistory(uri, keycloak))
125127
dispatch(
126128
addResourceHistory(
127129
resource.uri,
128130
resource.subjectTemplate.class,
129131
response.group,
130-
response.timestamp
132+
response.timestamp,
133+
keycloak
131134
)
132135
)
133136
dispatch(loadResourceFinished(resource.key))
@@ -308,11 +311,11 @@ export const saveResource =
308311

309312
dispatch(clearErrors(errorKey))
310313

311-
return putResource(resource, currentUser, group, editGroups, keycloak)
314+
return putResource(resource, currentUser, group, editGroups, null, keycloak)
312315
.then(() => {
313316
dispatch(setResourceGroup(resourceKey, group, editGroups))
314317
dispatch(saveResourceFinished(resourceKey))
315-
dispatch(addUserResourceHistory(resource.uri))
318+
dispatch(addUserResourceHistory(resource.uri, keycloak))
316319
dispatch(
317320
addResourceHistory(
318321
resource.uri,

src/actionCreators/user.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ const addHistory = (historyType, payload, keycloak) => (dispatch, getState) => {
4040
export const addTemplateHistory = (templateId) => (dispatch) =>
4141
dispatch(addHistory("template", templateId))
4242

43-
export const addResourceHistory = (uri) => (dispatch) =>
44-
dispatch(addHistory("resource", uri))
43+
export const addResourceHistory = (uri, keycloak) => (dispatch) =>
44+
dispatch(addHistory("resource", uri, keycloak))
4545

4646
export const addSearchHistory =
4747
(authorityUri, query, keycloak) => (dispatch) => {

src/components/editor/actions/SaveAndPublishButton.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import useAlerts from "hooks/useAlerts"
2828
const SaveAndPublishButton = (props) => {
2929
const dispatch = useDispatch()
3030
const errorKey = useAlerts()
31-
const keycloak = useKeycloak()
31+
const { keycloak } = useKeycloak()
3232

3333
const resourceKey = useSelector((state) => selectCurrentResourceKey(state))
3434
// selectPickSubject and shallowEqual prevents rerender from unrelated changed.

src/components/templates/ResourceTemplateRow.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const ResourceTemplateRow = ({ row }) => {
3131
isLoadingEdit,
3232
isLoadingView,
3333
} = useResource(errorKey, {
34-
resourceURI: row.uri,
34+
resourceURI: row.originalURI,
3535
resourceTemplateId: row.id,
3636
})
3737

src/hooks/useResource.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ import {
1717
setCurrentPreviewResource,
1818
} from "actions/resources"
1919
import { useHistory } from "react-router-dom"
20+
import { useKeycloak } from "../KeycloakContext"
2021

2122
const useResource = (
2223
errorKey,
2324
{ resourceTemplateId = null, resourceURI = null }
2425
) => {
2526
const dispatch = useDispatch()
2627
const history = useHistory()
28+
const { keycloak } = useKeycloak()
2729
const errors = useSelector((state) => selectErrors(state, errorKey))
2830
const resourceKey = useSelector((state) => selectCurrentResourceKey(state))
2931
// These are resources that are already loaded
@@ -52,7 +54,12 @@ const useResource = (
5254
if (event) event.preventDefault()
5355
setStatus("loading copy")
5456
dispatch(
55-
loadResourceForEditor(resourceURI, errorKey, { asNewResource: true })
57+
loadResourceForEditor(
58+
resourceURI,
59+
errorKey,
60+
{ asNewResource: true },
61+
keycloak
62+
)
5663
).then((result) => {
5764
setStatus("ready")
5865
if (result) setNavigateEditor(true)
@@ -67,10 +74,12 @@ const useResource = (
6774
setNavigateEditor(true)
6875
} else {
6976
setStatus("loading edit")
70-
dispatch(loadResourceForEditor(resourceURI, errorKey)).then((result) => {
71-
setStatus("ready")
72-
if (result) setNavigateEditor(true)
73-
})
77+
dispatch(loadResourceForEditor(resourceURI, errorKey, {}, keycloak)).then(
78+
(result) => {
79+
setStatus("ready")
80+
if (result) setNavigateEditor(true)
81+
}
82+
)
7483
}
7584
}
7685

src/sinopiaApi.js

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,7 @@ export const fetchResourceRelationships = (uri) => {
105105
}
106106

107107
// Fetches list of groups
108-
export const getGroups = () => {
109-
return Promise.resolve([{ id: "blue core",
110-
label: "Blue Core" }])
111-
}
108+
export const getGroups = () => Promise.resolve([{ id: "blue core", label: "Blue Core" }])
112109

113110
// Publishes (saves) a new resource
114111
export const postResource = (
@@ -252,17 +249,17 @@ const saveBodyForResource = (resource, user, group, editGroups) => {
252249

253250
return jsonldFromDataset(dataset).then((jsonld) =>
254251
JSON.stringify({
255-
data: jsonld,
256-
user,
257-
group,
258-
editGroups,
259-
templateId: resource.subjectTemplate.id,
260-
types: [resource.subjectTemplate.class],
261-
bfAdminMetadataRefs: resource.bfAdminMetadataRefs,
262-
sinopiaLocalAdminMetadataForRefs: resource.localAdminMetadataForRefs,
263-
bfItemRefs: resource.bfItemRefs,
264-
bfInstanceRefs: resource.bfInstanceRefs,
265-
bfWorkRefs: resource.bfWorkRefs,
252+
data: JSON.stringify(jsonld),
253+
// user,
254+
// group,
255+
// editGroups,
256+
// templateId: resource.subjectTemplate.id,
257+
// types: [resource.subjectTemplate.class],
258+
// bfAdminMetadataRefs: resource.bfAdminMetadataRefs,
259+
// sinopiaLocalAdminMetadataForRefs: resource.localAdminMetadataForRefs,
260+
// bfItemRefs: resource.bfItemRefs,
261+
// bfInstanceRefs: resource.bfInstanceRefs,
262+
// bfWorkRefs: resource.bfWorkRefs,
266263
})
267264
)
268265
}

src/sinopiaSearch.js

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ const aggregationsToResult = (aggs) => {
165165

166166
export const getTemplateSearchResults = (query, options = {}) => {
167167
const body = getTemplateSearchResultsBody(query, options)
168-
return fetchTemplateSearchResults(body, templateHitsToResult).then(
168+
return fetchTemplateSearchResults(query, templateHitsToResult).then(
169169
(searchResults) => {
170170
if (Config.useResourceTemplateFixtures) {
171171
const newResults = searchResults.results.filter(
@@ -243,11 +243,10 @@ const fetchTemplateSearchResults = async (body, hitsToResultFunc) => {
243243
}
244244
}
245245

246-
const url = `${Config.searchHost}${Config.templateSearchPath}`
246+
const url = `${Config.searchHost}${Config.templateSearchPath}?${body}`
247247
return fetch(url, {
248-
method: "POST",
248+
method: "GET",
249249
headers: { "Content-Type": "application/json" },
250-
body: JSON.stringify(body),
251250
})
252251
.then((resp) => {
253252
if (resp.status >= 300) {
@@ -267,7 +266,7 @@ const fetchTemplateSearchResults = async (body, hitsToResultFunc) => {
267266
error: json.error.reason || json.error,
268267
}
269268
}
270-
return hitsToResultFunc(json.hits)
269+
return hitsToResultFunc(json.results)
271270
})
272271
.catch((err) => ({
273272
totalHits: 0,
@@ -276,9 +275,46 @@ const fetchTemplateSearchResults = async (body, hitsToResultFunc) => {
276275
}))
277276
}
278277

278+
const templateModFromBlueCore = (hit) => {
279+
// Formats Blue Core Template Result for editor's expectations
280+
let resourceAuthor = "Unknown"
281+
let resourceId = "Unknown"
282+
let resourceDate = "Unknown"
283+
let resourceLabel = "Unknown"
284+
let resourceRemark = ""
285+
let resourceURI = "Unknown"
286+
hit.data.map((row) => {
287+
if (row["@id"] === hit.uri) {
288+
resourceAuthor =
289+
row["http://sinopia.io/vocabulary/hasAuthor"][0]["@value"]
290+
resourceDate = row["http://sinopia.io/vocabulary/hasDate"][0]["@value"]
291+
resourceLabel =
292+
row["http://www.w3.org/2000/01/rdf-schema#label"][0]["@value"]
293+
resourceId =
294+
row["http://sinopia.io/vocabulary/hasResourceId"][0]["@value"]
295+
resourceURI = row["http://sinopia.io/vocabulary/hasClass"][0]["@id"]
296+
resourceRemark = row["http://sinopia.io/vocabulary/hasRemark"]
297+
? row["http://sinopia.io/vocabulary/hasRemark"][0]["@value"]
298+
: ""
299+
}
300+
})
301+
const bcURI = `${Config.sinopiaApiBase}/resources/${hit.id}`
302+
return {
303+
author: resourceAuthor,
304+
date: resourceDate,
305+
group: "blue core", // hardcoded for now
306+
id: resourceId,
307+
originalURI: hit.uri,
308+
remark: resourceRemark,
309+
resourceLabel: resourceLabel,
310+
resourceURI: resourceURI,
311+
uri: bcURI,
312+
}
313+
}
314+
279315
const templateHitsToResult = (hits) => ({
280-
totalHits: hits.total.value,
281-
results: hits.hits.map((row) => row._source),
316+
totalHits: hits.length,
317+
results: hits.map((row) => templateModFromBlueCore(row)),
282318
})
283319

284320
const templateLookupToResult = (hits) => ({

src/utilities/SinopiaApiHelper.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const checkResp = (resp) => {
1616
})
1717
.catch((err) => {
1818
if (err.name === "ApiError") throw err
19-
throw new Error(`Sinopia API returned ${resp.statusText}`)
19+
throw new Error(`Blue Core API returned ${resp.statusText}`)
2020
})
2121
}
2222

@@ -50,6 +50,4 @@ export const templateIdFor = (resource) => {
5050
return resourceIdProperty.values[0].literal
5151
}
5252

53-
export const getJwt = (keycloak) => {
54-
return keycloak.token
55-
}
53+
export const getJwt = (keycloak) => keycloak.token

0 commit comments

Comments
 (0)