Skip to content

Commit 7d9e8b1

Browse files
author
Adam Collins
committed
Merge branch 'develop' into 235-add-links-to-events
2 parents 5bfe474 + 8e55134 commit 7d9e8b1

File tree

10 files changed

+155
-4
lines changed

10 files changed

+155
-4
lines changed

grails-app/controllers/au/org/ala/collectory/DataProviderController.groovy

+36
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package au.org.ala.collectory
22

3+
import grails.converters.JSON
4+
import grails.converters.XML
5+
import grails.web.http.HttpHeaders
6+
37
class DataProviderController extends ProviderGroupController {
48

59
def gbifRegistryService
610
def authService
11+
def iptService
712

813
DataProviderController() {
914
entityName = "DataProvider"
@@ -89,6 +94,37 @@ class DataProviderController extends ProviderGroupController {
8994
)
9095
}
9196

97+
def iptScan = {
98+
def create = params.create != null && params.create.equalsIgnoreCase("true")
99+
def check = params.check == null || !params.check.equalsIgnoreCase("false")
100+
def keyName = params.key ?: 'catalogNumber'
101+
def isShareableWithGBIF = params.isShareableWithGBIF ? params.isShareableWithGBIF.toBoolean(): true
102+
def provider = providerGroupService._get(params.uid)
103+
104+
def username = collectoryAuthService.username()
105+
def admin = collectoryAuthService.userInRole(grailsApplication.config.ROLE_ADMIN)
106+
try {
107+
def updates = provider == null ? null : iptService.scan(provider, create, check, keyName, username, admin, isShareableWithGBIF)
108+
log.info "${updates.size()} data resources to update for ${params.uid}"
109+
response.addHeader HttpHeaders.VARY, HttpHeaders.ACCEPT
110+
withFormat {
111+
text {
112+
render updates.findAll({ dr -> dr.uid != null }).collect({ dr -> dr.uid }).join("\n")
113+
}
114+
xml {
115+
render updates as XML
116+
}
117+
json {
118+
render updates as JSON
119+
}
120+
}
121+
} catch (Exception e){
122+
log.error("Problem scanning IPT endpoint: " + e.getMessage(), e)
123+
render (status: 500, text: "Problem scanning data provider " + params.uid)
124+
return
125+
}
126+
}
127+
92128
/**
93129
* Create a single data provider for a selected GBIF organization
94130
*/

grails-app/controllers/au/org/ala/collectory/LicenceController.groovy

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class LicenceController {
4949
@Produces("application/json")
5050
def index() {
5151
response.setContentType("application/json")
52-
render (Licence.findAll().collect { [name:it.name, url:it.url] } as JSON)
52+
render (Licence.findAll().collect { [name: it.name, url: it.url, imageUrl: it.imageUrl, acronym: it.acronym, version: it.licenceVersion] } as JSON)
5353
}
5454

5555
@JsonIgnoreProperties('metaClass')

grails-app/domain/au/org/ala/collectory/DataResource.groovy

+3
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ class DataResource implements ProviderGroup, Serializable {
106106

107107
static hasMany = [externalIdentifiers: ExternalIdentifier, consumerInstitutions: Institution, consumerCollections: Collection]
108108

109+
String createdByID
110+
109111
static constraints = {
110112
guid(nullable:true, maxSize:256)
111113
uid(blank:false, maxSize:20)
@@ -173,6 +175,7 @@ class DataResource implements ProviderGroup, Serializable {
173175
dataCollectionProtocolDoc(nullable:true)
174176
suitableFor(nullable:true)
175177
suitableForOtherDetail(nullable:true)
178+
createdByID(nullable:true)
176179
}
177180

178181
static transients = ['creativeCommons']

grails-app/migrations/changelog.xml

+10
Original file line numberDiff line numberDiff line change
@@ -449,5 +449,15 @@ liquibase.command.referencePassword: XXXXX
449449
<sqlFile path="5.1.0.3.sql" relativeToChangelogFile="true" encoding="ISO-8859-1" stripComments="1" />
450450
</changeSet>
451451

452+
<changeSet author="djtfmartin" id="20231025-01">
453+
<preConditions onFail="MARK_RAN">
454+
<not>
455+
<columnExists tableName="data_resource" columnName="created_byid" />
456+
</not>
457+
</preConditions>
458+
<addColumn tableName="data_resource">
459+
<column name="created_byid" type="VARCHAR(255 BYTE)"/>
460+
</addColumn>
461+
</changeSet>
452462

453463
</databaseChangeLog>

grails-app/services/au/org/ala/collectory/CrudService.groovy

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class CrudService {
4040
'filed','publicArchiveAvailable','contentTypes','defaultDarwinCoreValues', 'imageMetadata',
4141
'geographicDescription','northBoundingCoordinate','southBoundingCoordinate','eastBoundingCoordinate',
4242
'westBoundingCoordinate','beginDate','endDate','qualityControlDescription','methodStepDescription',
43-
'gbifDoi','repatriationCountry','isPrivate'
43+
'gbifDoi','repatriationCountry','isPrivate','createdByID'
4444
]
4545
static dataResourceNumberProperties = ['harvestFrequency','downloadLimit']
4646
static dataResourceTimestampProperties = ['lastChecked','dataCurrency']
@@ -392,6 +392,8 @@ class CrudService {
392392
externalIdentifiers = p.externalIdentifiers.formatExternalIdentifiers()
393393
}
394394
doi = p.gbifDoi
395+
repatriationCountry = p.repatriationCountry
396+
createdByID = p.createdByID
395397
}
396398
}
397399
return result

grails-app/views/dataProvider/show.gsp

+2-2
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@
181181
function checkIptInstance(){
182182
$('.iptCheck .spinner').removeClass('hide');
183183
$('.iptBtn').attr('disabled','disabled');
184-
var checkUrl = "${raw(createLink(controller: "ipt", action: "scan", params:[format:"json", uid: instance?.uid, check:true, create: false]))}";
184+
var checkUrl = "${raw(createLink(controller: "dataProvider", action: "iptScan", params:[format:"json", uid: instance?.uid, check:true, create: false]))}";
185185
var jqxhr = $.get(checkUrl, function(data) {
186186
$('.iptStatus').html("Success! IPT instance has " + data.length + " resources available." );
187187
$('.iptStatus').removeClass('hide')
@@ -198,7 +198,7 @@
198198
function updateResourcesFromIpt(){
199199
$('.iptUpdate .spinner').removeClass('hide');
200200
$('.iptBtn').attr('disabled','disabled');
201-
var updateUrl = "${raw(createLink(controller: "ipt", action: "scan", params:[format:"json", uid: instance?.uid, create:true, check: false]))}";
201+
var updateUrl = "${raw(createLink(controller: "dataProvider", action: "iptScan", params:[format:"json", uid: instance?.uid, create:true, check: false]))}";
202202
var jqxhr = $.get(updateUrl, function(data) {
203203
console.log(data)
204204
var updateText = "Success! <br/><br/> " + data.length + " resources have been added or updated from this IPT instance."

src/main/docker/Dockerfile

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Use an official Maven runtime as a parent image
2+
FROM gradle:7.6.3-jdk11 as builder
3+
4+
# Set the working directory in the container
5+
WORKDIR /app
6+
7+
# Copy the Gradle build files and settings to the container
8+
COPY .git .
9+
COPY build.gradle .
10+
COPY gradle.properties .
11+
12+
# Copy the source code of the Grails application to the container
13+
COPY src/ src/
14+
COPY gradle/ gradle/
15+
COPY grails-app/ grails-app/
16+
COPY db/ db/
17+
18+
# Build the Grails application using Gradle
19+
RUN gradle assemble
20+
21+
FROM livingatlases/java-11-base:1.0.0
22+
23+
# Lint with:
24+
# docker run --rm -i hadolint/hadolint < Dockerfile
25+
26+
# Args
27+
ARG APP_ARTIFACT=collectory
28+
ARG USER=collectory
29+
ARG WAR_FILE=/app/build/libs/collectory-*.war
30+
ENV MYSQL_HOST=collectory-mysql
31+
ARG DOCKERIZE_ARGS="-wait tcp://$MYSQL_HOST:3306 -timeout 120s"
32+
33+
# Env variables
34+
ENV SERVER_PORT="8080"
35+
ENV WAR_FILE_ENV=${WAR_FILE}
36+
ENV JAVA_OPTS="-Djava.awt.headless=true -Xmx256m -Xms256m -XX:+UseConcMarkSweepGC -Dlog4j2.formatMsgNoLookups=true"
37+
ENV DOCKERIZE_OPTS=${DOCKERIZE_ARGS}
38+
39+
# Directories and perms
40+
RUN mkdir -p /data/$APP_ARTIFACT && \
41+
groupadd -r $USER -g 1000 && useradd -r -g $USER -u 1000 -m $USER && \
42+
chown -R $USER:$USER /data/$APP_ARTIFACT
43+
WORKDIR /opt/atlas/$APP_ARTIFACT
44+
45+
# war
46+
COPY --from=builder $WAR_FILE_ENV /opt/atlas/$APP_ARTIFACT/app.jar
47+
RUN chown -R $USER:$USER /opt/atlas/$APP_ARTIFACT
48+
49+
USER $USER
50+
EXPOSE $SERVER_PORT
51+
# hadolint ignore=DL3025
52+
ENTRYPOINT dockerize $DOCKERIZE_OPTS sh -c "java $JAVA_OPTS -jar app.war"

src/main/docker/container-test.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Run with: container-structure-test test --driver tar --image livingatlases/collectory:latest --config src/main/docker/container-test.yaml
2+
schemaVersion: 2.0.0
3+
fileExistenceTests:
4+
- name: 'war'
5+
path: '/opt/atlas/collectory/app.war'
6+
shouldExist: true
7+
permissions: '-rw-rw-r--'

src/main/docker/docker-compose.yml

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
---
2+
version: '3.8'
3+
4+
services:
5+
collectory:
6+
container_name: living-atlas-collectory
7+
image: atlasoflivingaustralia/collectory:latest
8+
pull_policy: if_not_present
9+
restart: always
10+
11+
ports:
12+
- 9284:8080
13+
volumes:
14+
- /data:/data
15+
16+
mysql:
17+
container_name: living-atlas-collectory-mysql
18+
image: mysql:8
19+
ports:
20+
- 3306
21+
volumes:
22+
- /data/dbs/collectory-mysql-data:/var/lib/mysql
23+
- ./init-db.sh:/docker-entrypoint-initdb.d/init-db.sh
24+
restart: always
25+
environment:
26+
MYSQL_ROOT_PASSWORD: root_password
27+
MYSQL_USER: collectory
28+
MYSQL_PASSWORD: password
29+
MYSQL_DATABASE: collectory
30+
# DB_DUMP_PATH: "some-dump.sql"
31+
32+
networks:
33+
default:
34+
name: living-atlas-collectory

src/main/docker/init-db.sh

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
if [ -n "$DB_DUMP_EXISTS" ]; then
6+
mysql -u root -p"$MYSQL_ROOT_PASSWORD" < "$DB_DUMP_EXISTS"
7+
fi

0 commit comments

Comments
 (0)