Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions lib/api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class Api {
minioUser = null,
minioPassword = null,
minioBucket = null,
defaultMediaProvider = null,
}) {
this.jwt = jwt;
this.baseUrl = baseUrl;
Expand All @@ -59,11 +60,13 @@ class Api {
this.usersEntity = usersEntity;
this.accessTokenUserIdKey = accessTokenUserIdKey;
this.softDeletes = softDeletes;
this.minioOptions = {
minioApi,
minioUser,
minioPassword,
minioBucket,
this.mediaOptions = {
[defaultMediaProvider]: {
minioApi,
minioUser,
minioPassword,
minioBucket,
},
};
}

Expand Down Expand Up @@ -246,7 +249,7 @@ class Api {
* @returns {object} The items object
*/
items(name) {
return new Items(name, axios, this.minioOptions);
return new Items(name, axios, this.mediaOptions);
}
}

Expand Down
56 changes: 49 additions & 7 deletions lib/api/items.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ export default class Items {
* @param {object} axios The axios instance to be used for API requests
* @param {object} preProcessorOptions global configuration object
*/
constructor(name, axios, preProcessorOptions) {
constructor(name, axios, mediaOptions) {
this.name = name;
this.axios = axios;
this.preProcessorOptions = preProcessorOptions;
this.mediaOptions = mediaOptions;
}

/**
Expand Down Expand Up @@ -240,11 +240,34 @@ export default class Items {
if (opts.preProcessors) {
await Promise.all(
Object.keys(opts.preProcessors).map(async (prop) => {
payload[prop] = await preProcessors[opts.preProcessors[prop]](
const provider = Object.keys(this.mediaOptions)[0];
const data = await preProcessors[opts.preProcessors[prop]](
payload[prop],
this.axios,
this.preProcessorOptions
this.mediaOptions[provider]
);

if (!data) {
delete payload[prop];
}
delete payload[prop].base64;
const mediaEntity = api.createEntity('media', {
url: data.url,
type: data.type,
provider,
...payload[prop],
});

const foreignKey = mediaEntity['@id'];
delete mediaEntity['@id'];
await this.axios.post(`/api/media`, mediaEntity, {
headers: {
'Content-Type': 'application/ld+json',
Accept: 'application/ld+json',
},
});

payload[prop] = foreignKey;
})
);
}
Expand Down Expand Up @@ -276,15 +299,34 @@ export default class Items {
if (opts.preProcessors) {
await Promise.all(
Object.keys(opts.preProcessors).map(async (prop) => {
payload[prop] = await preProcessors[opts.preProcessors[prop]](
const provider = Object.keys(this.mediaOptions)[0];
const data = await preProcessors[opts.preProcessors[prop]](
payload[prop],
this.axios,
this.preProcessorOptions
this.mediaOptions[provider]
);

if (!payload[prop]) {
if (!data) {
delete payload[prop];
}
delete payload[prop].base64;
const mediaEntity = api.createEntity('media', {
url: data.url,
type: data.type,
provider,
...payload[prop],
});

const foreignKey = mediaEntity['@id'];
delete mediaEntity['@id'];
await this.axios.post(`/api/media`, mediaEntity, {
headers: {
'Content-Type': 'application/ld+json',
Accept: 'application/ld+json',
},
});

payload[prop] = foreignKey;
})
);
}
Expand Down
4 changes: 2 additions & 2 deletions lib/api/preProcessors/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mediaObject from './mediaObject';
import media from './media';

export default {
mediaObject,
media,
};
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,10 @@ export default async function (value, axios, options) {

await uploadFile(client, params);

return `${options.minioBucket}/${fileID}.${fileExtension}`;
return {
url: `${options.minioBucket}/${fileID}.${fileExtension}`,
type: blob.type,
};
} else if (Array.isArray(value)) {
value = await Promise.all(
value.map(async (file) => {
Expand Down
2 changes: 1 addition & 1 deletion lib/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export default function (moduleOptions) {
const templatesToSync = [
'api/items.js',
'api/preProcessors/index.js',
'api/preProcessors/mediaObject.js',
'api/preProcessors/media.js',
];
for (const pathString of templatesToSync) {
this.addTemplate({
Expand Down
12 changes: 11 additions & 1 deletion lib/plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export default async (ctx, inject) => {
minioUser: options.minioUser,
minioPassword: options.minioPassword,
minioBucket: options.minioBucket,
defaultMediaProvider: options.defaultMediaProvider,
});

const authModule = {
Expand Down Expand Up @@ -129,8 +130,17 @@ class Auth {
authError.message = 'Authentication Failure';
authError.data = 'You entered invalid credentials';
throw authError;
}
if (error.message === 'Network Error') {
const networkError = new Error('NetworkError');
networkError.message = 'Network Failure';
networkError.data = 'No connection to the server';
throw networkError;
} else {
throw new Error(error);
const unexpectedError = new Error('UnexpectedError');
unexpectedError.message = 'Unexpected Failure';
unexpectedError.data = 'An unexpected error ocurred';
throw unexpectedError;
}
}
}
Expand Down