Skip to content

Commit b799600

Browse files
authored
feat(config)!: update config file for better iiif support (DSP-1880) (#511)
* chore(config)!: consistent config * refactor(app): move app init service to app root * refactor(representation): upload service was already there * feat(upload)!: new iiif url config
1 parent fc7ea5c commit b799600

14 files changed

Lines changed: 161 additions & 232 deletions
File renamed without changes.

‎src/app/app-init.service.ts‎

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import { Injectable } from '@angular/core';
2+
import { KnoraApiConfig } from '@dasch-swiss/dsp-js';
3+
import { DspIiifConfig } from './main/declarations/dsp-iiif-config';
4+
5+
@Injectable({
6+
providedIn: 'root'
7+
})
8+
export class AppInitService {
9+
10+
dspApiConfig: KnoraApiConfig;
11+
dspIiifConfig: DspIiifConfig;
12+
13+
config: object;
14+
15+
constructor() {
16+
}
17+
18+
/**
19+
* fetches and initialises the configuration.
20+
*
21+
* @param path path to the config file.
22+
* @param env environment to be used (dev or prod).
23+
*/
24+
Init(path: string, env: { name: string; production: boolean }): Promise<void> {
25+
26+
return new Promise<void>((resolve, reject) => {
27+
fetch(`${path}/config.${env.name}.json`).then(
28+
(response: Response) => response.json()).then(dspAppConfig => {
29+
30+
31+
// check for presence of apiProtocol and apiHost
32+
if (typeof dspAppConfig.apiProtocol !== 'string' || typeof dspAppConfig.apiHost !== 'string') {
33+
throw new Error('config misses required members: apiProtocol and/or apiHost');
34+
}
35+
36+
// make input type safe
37+
const apiPort = (typeof dspAppConfig.apiPort === 'number' ? dspAppConfig.apiPort : null);
38+
const apiPath = (typeof dspAppConfig.apiPath === 'string' ? dspAppConfig.apiPath : '');
39+
const jsonWebToken = (typeof dspAppConfig.jsonWebToken === 'string' ? dspAppConfig.jsonWebToken : '');
40+
const logErrors = (typeof dspAppConfig.logErrors === 'boolean' ? dspAppConfig.logErrors : false);
41+
42+
// init dsp-api configuration
43+
this.dspApiConfig = new KnoraApiConfig(
44+
dspAppConfig.apiProtocol,
45+
dspAppConfig.apiHost,
46+
apiPort,
47+
apiPath,
48+
jsonWebToken,
49+
logErrors
50+
);
51+
52+
const iiifPort = (typeof dspAppConfig.iiifPort === 'number' ? dspAppConfig.iiifPort : null);
53+
const iiifPath = (typeof dspAppConfig.iiifPath === 'string' ? dspAppConfig.iiifPath : '');
54+
55+
// init iiif configuration
56+
this.dspIiifConfig = new DspIiifConfig(
57+
dspAppConfig.iiifProtocol,
58+
dspAppConfig.iiifHost,
59+
iiifPort,
60+
iiifPath
61+
);
62+
63+
// get all options from config
64+
this.config = dspAppConfig;
65+
66+
// set sanitized standard config options
67+
this.config['apiProtocol'] = dspAppConfig.apiProtocol;
68+
this.config['apiHost'] = dspAppConfig.apiHost;
69+
this.config['apiPort'] = apiPort;
70+
this.config['apiPath'] = apiPath;
71+
this.config['jsonWebToken'] = jsonWebToken;
72+
this.config['logErrors'] = logErrors;
73+
this.config['iiifProtocol'] = dspAppConfig.iiifProtocol;
74+
this.config['iiifHost'] = dspAppConfig.iiifHost;
75+
this.config['iiifPort'] = iiifPort;
76+
this.config['iiifPath'] = iiifPath;
77+
this.config['iiifUrl'] = this.dspIiifConfig.iiifUrl;
78+
79+
resolve();
80+
}
81+
).catch((err) => {
82+
reject(err);
83+
});
84+
});
85+
}
86+
}

‎src/app/app.module.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { BrowserModule } from '@angular/platform-browser';
88
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
99
import { KnoraApiConnection } from '@dasch-swiss/dsp-js';
1010
import {
11-
AppInitService,
1211
DspActionModule,
1312
DspApiConfigToken,
1413
DspApiConnectionToken,
@@ -23,6 +22,7 @@ import { PdfViewerModule } from 'ng2-pdf-viewer';
2322
import { environment } from '../environments/environment';
2423
import { AppRoutingModule } from './app-routing.module';
2524
import { AppComponent } from './app.component';
25+
import { AppInitService } from './app-init.service';
2626
import { CookiePolicyComponent } from './main/cookie-policy/cookie-policy.component';
2727
import { DialogHeaderComponent } from './main/dialog/dialog-header/dialog-header.component';
2828
import { DialogComponent } from './main/dialog/dialog.component';
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* configuration to instantiate the iiif url.
3+
*
4+
* @category Config
5+
*/
6+
export class DspIiifConfig {
7+
8+
static readonly PROTOCOL_HTTP = 'http';
9+
static readonly PROTOCOL_HTTPS = 'https';
10+
11+
static readonly DEFAULT_PORT_HTTP = 80;
12+
static readonly DEFAULT_PORT_HTTPS = 443;
13+
14+
/**
15+
* the full IIIF URL
16+
*/
17+
get iiifUrl(): string {
18+
return (
19+
(this.iiifProtocol + '://' + this.iiifHost) +
20+
(this.iiifPort !== null ? ':' + this.iiifPort : '') +
21+
this.iiifPath
22+
);
23+
}
24+
25+
/**
26+
* @param iiifProtocol the protocol of the API (http or https)
27+
* @param iiifHost the DSP-API base URL
28+
* @param iiifPort the port of DSP-API
29+
* @param iiifPath the base path following host and port, if any.
30+
*/
31+
constructor(public iiifProtocol: 'http' | 'https',
32+
public iiifHost: string,
33+
public iiifPort: number | null = null,
34+
public iiifPath: string = '') {
35+
36+
// remove port in case it's the default one
37+
if (iiifProtocol === DspIiifConfig.PROTOCOL_HTTP && iiifPort === DspIiifConfig.DEFAULT_PORT_HTTP) {
38+
this.iiifPort = null;
39+
} else if (iiifProtocol === DspIiifConfig.PROTOCOL_HTTPS && iiifPort === DspIiifConfig.DEFAULT_PORT_HTTPS) {
40+
this.iiifPort = null;
41+
}
42+
43+
}
44+
}

‎src/app/main/services/app-init.service.ts‎

Lines changed: 0 additions & 67 deletions
This file was deleted.

‎src/app/workspace/resource/representation/upload/upload-file.service.spec.ts‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
22
import { TestBed } from '@angular/core/testing';
3-
import { AppInitService, Session, SessionService } from '@dasch-swiss/dsp-ui';
3+
import { Session, SessionService } from '@dasch-swiss/dsp-ui';
4+
import { AppInitService } from 'src/app/app-init.service';
45
import { UploadedFileResponse, UploadFileService } from './upload-file.service';
56

67
describe('UploadFileService', () => {
@@ -15,7 +16,7 @@ describe('UploadFileService', () => {
1516

1617
const appInitSpy = {
1718
config: {
18-
iiifUrl: 'https://sipi.dasch.swiss/'
19+
'iiifUrl': 'https://iiif.dasch.swiss'
1920
}
2021
};
2122

@@ -82,7 +83,7 @@ describe('UploadFileService', () => {
8283
}
8384
);
8485

85-
const httpRequest = httpTestingController.expectOne('https://sipi.dasch.swiss/upload?token=myToken');
86+
const httpRequest = httpTestingController.expectOne('https://iiif.dasch.swiss/upload?token=myToken');
8687

8788
expect(httpRequest.request.method).toEqual('POST');
8889

‎src/app/workspace/resource/representation/upload/upload-file.service.ts‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { HttpClient, HttpParams } from '@angular/common/http';
22
import { Injectable } from '@angular/core';
3-
import { AppInitService, SessionService } from '@dasch-swiss/dsp-ui';
3+
import { SessionService } from '@dasch-swiss/dsp-ui';
44
import { Observable } from 'rxjs';
5+
import { AppInitService } from 'src/app/app-init.service';
56

67
export interface UploadedFile {
78
fileType: string;
@@ -19,7 +20,7 @@ export interface UploadedFileResponse {
1920
})
2021
export class UploadFileService {
2122

22-
iiifHost: string = (this._init.config['iiifUrl'].substr(-1) === '/') ? this._init.config['iiifUrl'] : this._init.config['iiifUrl'] + '/';
23+
iiifUrl: string = (this._init.config['iiifUrl'].substr(-1) === '/') ? this._init.config['iiifUrl'] : this._init.config['iiifUrl'] + '/';
2324

2425
constructor(
2526
private readonly _init: AppInitService,
@@ -32,14 +33,15 @@ export class UploadFileService {
3233
* @param (file)
3334
*/
3435
upload(file: FormData): Observable<UploadedFileResponse> {
35-
const baseUrl = `${this.iiifHost}upload`;
36+
37+
const uploadUrl = `${this.iiifUrl}upload`;
3638

3739
// checks if user is logged in
3840
const jwt = this._session.getSession()?.user.jwt;
3941
const params = new HttpParams().set('token', jwt);
4042

4143
// --> TODO in order to track the progress change below to true and 'events'
4244
const options = { params, reportProgress: false, observe: 'body' as 'body' };
43-
return this._http.post<UploadedFileResponse>(baseUrl, file, options);
45+
return this._http.post<UploadedFileResponse>(uploadUrl, file, options);
4446
}
4547
}

‎src/app/workspace/resource/services/geoname.service.spec.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
22
import { TestBed } from '@angular/core/testing';
3-
import { AppInitService } from 'src/app/main/services/app-init.service';
3+
import { AppInitService } from 'src/app/app-init.service';
44
import { DisplayPlace, GeonameService } from './geoname.service';
55

66
const geonamesGetResponse = {

‎src/app/workspace/resource/services/geoname.service.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { HttpClient } from '@angular/common/http';
22
import { Injectable } from '@angular/core';
33
import { Observable, throwError } from 'rxjs';
44
import { catchError, map, shareReplay } from 'rxjs/operators';
5-
import { AppInitService } from 'src/app/main/services/app-init.service';
5+
import { AppInitService } from 'src/app/app-init.service';
66

77
export interface GIS {
88
longitude: number;

‎src/app/workspace/resource/services/upload-file.service.spec.ts‎

Lines changed: 0 additions & 100 deletions
This file was deleted.

0 commit comments

Comments
 (0)