Adds License and LicenseUrl to AssetInfo and Publish/Edit Forms #935
|
@ -1,6 +1,7 @@
|
|||
select {
|
||||
margin: 0;
|
||||
display: inline-block;
|
||||
background: $base-color;
|
||||
background: $background-color;
|
||||
border: 0;
|
||||
color: $text-color;
|
||||
}
|
||||
|
|
|
@ -7,9 +7,6 @@ const ChannelSelectDropdown = ({ selectedChannel, handleSelection, loggedInChann
|
|||
id='channel-name-select'
|
||||
value={selectedChannel}
|
||||
onChange={handleSelection}>
|
||||
{ loggedInChannelName && (
|
||||
<option value={loggedInChannelName} >{loggedInChannelName}</option>
|
||||
)}
|
||||
<option value={LOGIN}>Existing</option>
|
||||
<option value={CREATE}>New</option>
|
||||
</select>
|
||||
|
|
|
@ -1,23 +1,28 @@
|
|||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
import React from 'react';
|
||||
import RowLabeled from '@components/RowLabeled';
|
||||
import Label from '@components/Label';
|
||||
import { LICENSES } from '@clientConstants/publish_license_urls';
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
|
||||
const PublishLicenseInput = ({ handleSelect }) => {
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
const PublishLicenseInput = ({ handleSelect, license }) => {
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
return (
|
||||
<RowLabeled
|
||||
label={
|
||||
<Label value={'License:'} />
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
<Label value={'License'} />
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
}
|
||||
content={
|
||||
<select
|
||||
type='text'
|
||||
name='license'
|
||||
id='publish-license'
|
||||
value={license}
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
onChange={handleSelect}
|
||||
>
|
||||
<option value=''>Unspecified</option>
|
||||
<option value='Public Domain'>Public Domain</option>
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
<option value='Creative Commons'>Creative Commons</option>
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
{
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
LICENSES.map(function(item, i){
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
return <option key={item + 'license key'} value={item}>{item}</option>;
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
})
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
}
|
||||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
||||
</select>
|
||||
}
|
||||
/>
|
||||
|
|
|||
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
We should have a more suitable alias to use instead of the We should have a more suitable alias to use instead of the `../../`
|
32
client/src/components/PublishLicenseUrlInput/index.jsx
Normal file
|
@ -0,0 +1,32 @@
|
|||
alias alias
alias alias
|
||||
import React from 'react';
|
||||
alias alias
|
||||
import RowLabeled from '@components/RowLabeled';
|
||||
alias alias
|
||||
import Label from '@components/Label';
|
||||
alias alias
|
||||
import { CC_LICENSES } from '@clientConstants/publish_license_urls';
|
||||
alias alias
|
||||
|
||||
alias alias
|
||||
const PublishLicenseUrlInput = ({ handleSelect, licenseUrl }) => {
|
||||
alias alias
|
||||
return (
|
||||
alias alias
|
||||
<RowLabeled
|
||||
alias alias
|
||||
label={
|
||||
alias alias
|
||||
<Label value={'License Url'} />
|
||||
alias alias
|
||||
}
|
||||
alias alias
|
||||
content={
|
||||
alias alias
|
||||
<select
|
||||
alias alias
|
||||
type='text'
|
||||
alias alias
|
||||
name='licenseUrl'
|
||||
alias alias
|
||||
id='publish-license-url'
|
||||
alias alias
|
||||
value={licenseUrl}
|
||||
alias alias
|
||||
onChange={handleSelect}
|
||||
alias alias
|
||||
>
|
||||
alias alias
|
||||
<option value=''>Unspecified</option>
|
||||
alias alias
|
||||
{
|
||||
alias alias
|
||||
CC_LICENSES.map(function(item, i){
|
||||
alias alias
|
||||
return <option key={item.url} value={item.url}>{item.value}</option>
|
||||
alias alias
|
||||
})
|
||||
alias alias
|
||||
}
|
||||
alias alias
|
||||
</select>
|
||||
alias alias
|
||||
}
|
||||
alias alias
|
||||
/>
|
||||
alias alias
|
||||
);
|
||||
alias alias
|
||||
};
|
||||
alias alias
|
||||
|
||||
alias alias
|
||||
export default PublishLicenseUrlInput;
|
||||
alias alias
|
33
client/src/constants/publish_license_urls.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
export const CC_LICENSES = [
|
||||
{
|
||||
value: 'CC Attr. 4.0 Int',
|
||||
url: 'https://creativecommons.org/licenses/by/4.0/legalcode',
|
||||
},
|
||||
{
|
||||
value: 'CC Attr-ShareAlike 4.0 Int',
|
||||
url: 'https://creativecommons.org/licenses/by-sa/4.0/legalcode',
|
||||
},
|
||||
{
|
||||
value: 'CC Attr-NoDerivatives 4.0 Int',
|
||||
url: 'https://creativecommons.org/licenses/by-nd/4.0/legalcode',
|
||||
},
|
||||
{
|
||||
value: 'CC Attr-NonComm 4.0 Int',
|
||||
url: 'https://creativecommons.org/licenses/by-nc/4.0/legalcode',
|
||||
},
|
||||
{
|
||||
value: 'CC Attr-NonComm-ShareAlike 4.0 Int',
|
||||
url: 'https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode',
|
||||
},
|
||||
{
|
||||
value: 'CC Attr-NonComm-NoDerivatives 4.0 Int',
|
||||
url: 'https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode',
|
||||
},
|
||||
];
|
||||
|
||||
export const LICENSES = ['Public Domain', 'Other', 'Copyright', 'Creative Commons'];
|
||||
|
||||
export const PUBLIC_DOMAIN = 'Public Domain';
|
||||
export const OTHER = 'other';
|
||||
export const COPYRIGHT = 'copyright';
|
||||
export const CREATIVE_COMMONS = 'Creative Commons';
|
|
@ -7,7 +7,7 @@ import AssetShareButtons from '@components/AssetShareButtons';
|
|||
import ClickToCopy from '@components/ClickToCopy';
|
||||
import siteConfig from '@config/siteConfig.json';
|
||||
import createCanonicalLink from '@globalutils/createCanonicalLink';
|
||||
import AssetInfoFooter from '../../components/AssetInfoFooter/index';
|
||||
import AssetInfoFooter from '@components/AssetInfoFooter/index';
|
||||
import { createPermanentURI } from '@clientutils/createPermanentURI';
|
||||
import ReactMarkdown from 'react-markdown';
|
||||
|
||||
|
@ -18,7 +18,20 @@ class AssetInfo extends React.Component {
|
|||
render () {
|
||||
const { editable, asset } = this.props;
|
||||
const { claimViews, claimData } = asset;
|
||||
const { channelName, claimId, channelShortId, description, name, fileExt, contentType, host, certificateId } = claimData;
|
||||
const {
|
||||
channelName,
|
||||
claimId,
|
||||
channelShortId,
|
||||
description,
|
||||
name,
|
||||
fileExt,
|
||||
contentType,
|
||||
host,
|
||||
certificateId,
|
||||
license,
|
||||
licenseUrl,
|
||||
transactionTime
|
||||
} = claimData;
|
||||
|
||||
const canonicalUrl = createCanonicalLink({ asset: { ...claimData, shortId: asset.shortId }});
|
||||
const assetCanonicalUrl = `${host}${canonicalUrl}`;
|
||||
|
@ -55,7 +68,7 @@ class AssetInfo extends React.Component {
|
|||
{editable && (
|
||||
<RowLabeled
|
||||
label={<Label value={'Edit'} />}
|
||||
content={<Link to={`/edit${canonicalUrl}`}>{name}</Link>}
|
||||
content={<Link className='link--primary' to={`/edit${canonicalUrl}`}>{name}</Link>}
|
||||
/>
|
||||
)}
|
||||
{channelName && (
|
||||
|
@ -71,19 +84,35 @@ class AssetInfo extends React.Component {
|
|||
}
|
||||
/>
|
||||
)}
|
||||
{claimViews ? (
|
||||
<RowLabeled
|
||||
label={
|
||||
<Label value={'Views'} />
|
||||
}
|
||||
content={
|
||||
<span className='text'>
|
||||
{claimViews}
|
||||
</span>
|
||||
}
|
||||
/>
|
||||
) : null}
|
||||
|
||||
<SpaceBetween>
|
||||
{claimViews ? (
|
||||
<RowLabeled
|
||||
label={
|
||||
<Label value={'Views'} />
|
||||
}
|
||||
content={
|
||||
<span className='text'>
|
||||
{claimViews}
|
||||
</span>
|
||||
}
|
||||
/>
|
||||
) : null}
|
||||
{license && (
|
||||
<RowLabeled
|
||||
label={
|
||||
<Label value={'License'} />
|
||||
}
|
||||
content={
|
||||
<div className='text'>
|
||||
{licenseUrl ? (
|
||||
<a className={'link--primary'} href={licenseUrl} target={'_blank'}>{license}</a>
|
||||
) : (
|
||||
<span>{license}</span> )}
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
)}
|
||||
</SpaceBetween>
|
||||
<RowLabeled
|
||||
label={
|
||||
<Label value={'Share'} />
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
import {connect} from 'react-redux';
|
||||
import {updateMetadata, toggleMetadataInputs} from '../../actions/publish';
|
||||
import { connect } from 'react-redux';
|
||||
import { updateMetadata, toggleMetadataInputs } from '../../actions/publish';
|
||||
import View from './view';
|
||||
|
||||
const mapStateToProps = ({ publish }) => {
|
||||
return {
|
||||
showMetadataInputs: publish.showMetadataInputs,
|
||||
description : publish.metadata.description,
|
||||
license : publish.metadata.license,
|
||||
nsfw : publish.metadata.nsfw,
|
||||
isUpdate : publish.isUpdate,
|
||||
description: publish.metadata.description,
|
||||
license: publish.metadata.license,
|
||||
licenseUrl: publish.metadata.licenseUrl,
|
||||
nsfw: publish.metadata.nsfw,
|
||||
isUpdate: publish.isUpdate,
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -17,10 +18,13 @@ const mapDispatchToProps = dispatch => {
|
|||
onMetadataChange: (name, value) => {
|
||||
dispatch(updateMetadata(name, value));
|
||||
},
|
||||
onToggleMetadataInputs: (value) => {
|
||||
onToggleMetadataInputs: value => {
|
||||
dispatch(toggleMetadataInputs(value));
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(View);
|
||||
export default connect(
|
||||
mapStateToProps,
|
||||
mapDispatchToProps
|
||||
)(View);
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import React from 'react';
|
||||
import PublishDescriptionInput from '@components/PublishDescriptionInput';
|
||||
import PublishLicenseInput from '@components/PublishLicenseInput';
|
||||
import PublishLicenseUrlInput from '@components/PublishLicenseUrlInput';
|
||||
import PublishNsfwInput from '@components/PublishNsfwInput';
|
||||
import ButtonSecondary from '@components/ButtonSecondary';
|
||||
import Row from '@components/Row';
|
||||
|
||||
class PublishMetadataInputs extends React.Component {
|
||||
constructor (props) {
|
||||
|
@ -25,22 +25,32 @@ class PublishMetadataInputs extends React.Component {
|
|||
const name = event.target.name;
|
||||
const selectedOption = event.target.selectedOptions[0].value;
|
||||
this.props.onMetadataChange(name, selectedOption);
|
||||
if (name === 'license' && selectedOption !== 'Creative Commons'){
|
||||
this.props.onMetadataChange('licenseUrl', '');
|
||||
}
|
||||
}
|
||||
render () {
|
||||
const { showMetadataInputs, description, isUpdate, nsfw } = this.props;
|
||||
const { showMetadataInputs, description, isUpdate, nsfw, license, licenseUrl } = this.props;
|
||||
return (
|
||||
<div>
|
||||
{(showMetadataInputs || isUpdate) && (
|
||||
{(showMetadataInputs || isUpdate) && (
|
||||
<React.Fragment>
|
||||
<PublishDescriptionInput
|
||||
description={this.props.description}
|
||||
description={description}
|
||||
handleInput={this.handleInput}
|
||||
/>
|
||||
<PublishLicenseInput
|
||||
handleSelect={this.handleSelect}
|
||||
license={license}
|
||||
/>
|
||||
{ (this.props.license === 'Creative Commons') && (
|
||||
<PublishLicenseUrlInput
|
||||
handleSelect={this.handleSelect}
|
||||
licenseUrl={licenseUrl}
|
||||
/>
|
||||
)}
|
||||
<PublishNsfwInput
|
||||
nsfw={this.props.nsfw}
|
||||
nsfw={nsfw}
|
||||
handleInput={this.handleInput}
|
||||
/>
|
||||
</React.Fragment>
|
||||
|
|
|
@ -9,7 +9,7 @@ class EditPage extends React.Component {
|
|||
onHandleShowPageUri(match.params);
|
||||
setUpdateTrue();
|
||||
if (asset) {
|
||||
['title', 'description', 'license', 'nsfw'].forEach(meta => updateMetadata(meta, asset.claimData[meta]));
|
||||
['title', 'description', 'license', 'licenseUrl', 'nsfw'].forEach(meta => updateMetadata(meta, asset.claimData[meta]));
|
||||
}
|
||||
setHasChanged(false);
|
||||
}
|
||||
|
|
|
@ -19,40 +19,42 @@ if (siteConfig) {
|
|||
|
||||
// create initial state
|
||||
const initialState = {
|
||||
disabled : disabledConfig,
|
||||
disabledMessage : disabledMessageConfig,
|
||||
publishInChannel : false,
|
||||
selectedChannel : LOGIN,
|
||||
disabled: disabledConfig,
|
||||
disabledMessage: disabledMessageConfig,
|
||||
publishInChannel: false,
|
||||
selectedChannel: LOGIN,
|
||||
showMetadataInputs: false,
|
||||
status : {
|
||||
status : null,
|
||||
status: {
|
||||
status: null,
|
||||
message: null,
|
||||
},
|
||||
error: {
|
||||
file : null,
|
||||
url : null,
|
||||
file: null,
|
||||
url: null,
|
||||
channel: null,
|
||||
},
|
||||
file : null,
|
||||
claim : '',
|
||||
file: null,
|
||||
claim: '',
|
||||
metadata: {
|
||||
title : '',
|
||||
title: '',
|
||||
description: '',
|
||||
license : '',
|
||||
nsfw : false,
|
||||
license: '',
|
||||
licenseUrl: '',
|
||||
nsfw: false,
|
||||
},
|
||||
isUpdate : false,
|
||||
isUpdate: false,
|
||||
hasChanged: false,
|
||||
thumbnail : null,
|
||||
thumbnail: null,
|
||||
thumbnailChannel,
|
||||
thumbnailChannelId,
|
||||
};
|
||||
|
||||
export default function (state = initialState, action) {
|
||||
export default function(state = initialState, action) {
|
||||
switch (action.type) {
|
||||
case actions.FILE_SELECTED:
|
||||
return Object.assign({}, state.isUpdate ? state : initialState, { // note: clears to initial state
|
||||
file : action.data,
|
||||
return Object.assign({}, state.isUpdate ? state : initialState, {
|
||||
// note: clears to initial state
|
||||
file: action.data,
|
||||
hasChanged: true,
|
||||
});
|
||||
case actions.FILE_CLEAR:
|
||||
|
@ -66,13 +68,13 @@ export default function (state = initialState, action) {
|
|||
});
|
||||
case actions.CLAIM_UPDATE:
|
||||
return Object.assign({}, state, {
|
||||
claim : action.data,
|
||||
claim: action.data,
|
||||
hasChanged: true,
|
||||
});
|
||||
case actions.SET_PUBLISH_IN_CHANNEL:
|
||||
return Object.assign({}, state, {
|
||||
publishInChannel: action.channel,
|
||||
hasChanged : true,
|
||||
hasChanged: true,
|
||||
});
|
||||
case actions.PUBLISH_STATUS_UPDATE:
|
||||
return Object.assign({}, state, {
|
||||
|
@ -96,7 +98,7 @@ export default function (state = initialState, action) {
|
|||
case actions.THUMBNAIL_NEW:
|
||||
return {
|
||||
...state,
|
||||
thumbnail : action.data,
|
||||
thumbnail: action.data,
|
||||
hasChanged: true,
|
||||
};
|
||||
case actions.SET_UPDATE_TRUE:
|
||||
|
@ -112,4 +114,4 @@ export default function (state = initialState, action) {
|
|||
default:
|
||||
return state;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,9 +1,16 @@
|
|||
export const createPublishMetadata = (claim, { type }, { title, description, license, nsfw }, publishInChannel, selectedChannel) => {
|
||||
export const createPublishMetadata = (
|
||||
claim,
|
||||
{ type },
|
||||
{ title, description, license, licenseUrl, nsfw },
|
||||
publishInChannel,
|
||||
selectedChannel
|
||||
) => {
|
||||
let metadata = {
|
||||
name: claim,
|
||||
title,
|
||||
description,
|
||||
license,
|
||||
licenseUrl,
|
||||
nsfw,
|
||||
type,
|
||||
};
|
||||
|
|
|
@ -6,7 +6,7 @@ const {
|
|||
|
||||
const getterMethods = {
|
||||
generated_extension() {
|
||||
logger.info('trying to generate extension', this.content_type);
|
||||
logger.debug('trying to generate extension', this.content_type);
|
||||
if (customFileExtensions.hasOwnProperty(this.content_type)) {
|
||||
return customFileExtensions[this.content_type];
|
||||
} else {
|
||||
|
@ -136,6 +136,14 @@ export default (sequelize, { BOOLEAN, DATE, DECIMAL, ENUM, INTEGER, STRING, TEXT
|
|||
type: STRING,
|
||||
set() {},
|
||||
},
|
||||
license: {
|
||||
type: STRING,
|
||||
set() {},
|
||||
},
|
||||
license_url: {
|
||||
type: STRING,
|
||||
set() {},
|
||||
},
|
||||
},
|
||||
{
|
||||
freezeTableName: true,
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
const chainquery = require('chainquery').default;
|
||||
const logger = require('winston');
|
||||
const getClaimData = require('server/utils/getClaimData');
|
||||
const { returnPaginatedChannelClaims } = require('./channelPagination.js');
|
||||
|
||||
const getChannelClaims = async (channelName, channelLongId, page) => {
|
||||
logger.debug(`getChannelClaims: ${channelName}, ${channelLongId}, ${page}`);
|
||||
let channelShortId = await chainquery.claim.queries.getShortClaimIdFromLongClaimId(
|
||||
channelLongId,
|
||||
channelName
|
||||
|
|
|
@ -1,6 +1,17 @@
|
|||
const logger = require('winston');
|
||||
const { details, publishing } = require('@config/siteConfig');
|
||||
const createPublishParams = (filePath, name, title, description, license, nsfw, thumbnail, channelName, channelClaimId) => {
|
||||
const createPublishParams = (
|
||||
filePath,
|
||||
name,
|
||||
title,
|
||||
description,
|
||||
license,
|
||||
licenseUrl,
|
||||
nsfw,
|
||||
thumbnail,
|
||||
channelName,
|
||||
channelClaimId
|
||||
) => {
|
||||
// provide defaults for title
|
||||
if (title === null || title.trim() === '') {
|
||||
title = name;
|
||||
|
@ -11,19 +22,24 @@ const createPublishParams = (filePath, name, title, description, license, nsfw,
|
|||
}
|
||||
// provide default for license
|
||||
if (license === null || license.trim() === '') {
|
||||
license = ''; // default to empty string
|
||||
license = ''; // default to empty string
|
||||
}
|
||||
// provide default for licenseUrl
|
||||
if (licenseUrl === null || licenseUrl.trim() === '') {
|
||||
licenseUrl = ''; // default to empty string
|
||||
}
|
||||
// create the basic publish params
|
||||
const publishParams = {
|
||||
name,
|
||||
file_path: filePath,
|
||||
bid : publishing.fileClaimBidAmount,
|
||||
metadata : {
|
||||
bid: publishing.fileClaimBidAmount,
|
||||
metadata: {
|
||||
description,
|
||||
title,
|
||||
author : details.title,
|
||||
author: details.title,
|
||||
language: 'en',
|
||||
license,
|
||||
licenseUrl,
|
||||
nsfw,
|
||||
},
|
||||
claim_address: publishing.primaryClaimAddress,
|
||||
|
|
|
@ -1,27 +1,28 @@
|
|||
const logger = require('winston');
|
||||
const { details, publishing } = require('@config/siteConfig');
|
||||
|
||||
const createThumbnailPublishParams = (thumbnailFilePath, claimName, license, nsfw) => {
|
||||
const createThumbnailPublishParams = (thumbnailFilePath, claimName, license, licenseUrl, nsfw) => {
|
||||
if (!thumbnailFilePath) {
|
||||
return;
|
||||
}
|
||||
logger.debug(`Creating Thumbnail Publish Parameters`);
|
||||
// create the publish params
|
||||
return {
|
||||
name : `${claimName}-thumb`,
|
||||
name: `${claimName}-thumb`,
|
||||
file_path: thumbnailFilePath,
|
||||
bid : publishing.fileClaimBidAmount,
|
||||
metadata : {
|
||||
title : `${claimName} thumbnail`,
|
||||
bid: publishing.fileClaimBidAmount,
|
||||
metadata: {
|
||||
title: `${claimName} thumbnail`,
|
||||
description: `a thumbnail for ${claimName}`,
|
||||
author : details.title,
|
||||
language : 'en',
|
||||
author: details.title,
|
||||
language: 'en',
|
||||
license,
|
||||
licenseUrl,
|
||||
nsfw,
|
||||
},
|
||||
claim_address: publishing.primaryClaimAddress,
|
||||
channel_name : publishing.thumbnailChannel,
|
||||
channel_id : publishing.thumbnailChannelId,
|
||||
channel_name: publishing.thumbnailChannel,
|
||||
channel_id: publishing.thumbnailChannelId,
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
const logger = require('winston');
|
||||
|
||||
const { details: { host }, publishing: { disabled, disabledMessage } } = require('@config/siteConfig');
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
const {
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
details: { host },
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
publishing: { disabled, disabledMessage },
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
} = require('@config/siteConfig');
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
|
||||
const { sendGATimingEvent } = require('../../../../utils/googleAnalytics.js');
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
const { sendGATimingEvent } = require('server/utils/googleAnalytics.js');
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
const isApprovedChannel = require('@globalutils/isApprovedChannel');
|
||||
const { publishing: { publishOnlyApproved, approvedChannels } } = require('@config/siteConfig');
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
const {
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
publishing: { publishOnlyApproved, approvedChannels },
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
} = require('@config/siteConfig');
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
|
||||
const { handleErrorResponse } = require('../../../utils/errorHandlers.js');
|
||||
|
||||
|
@ -55,6 +60,7 @@ const claimPublish = ({ body, files, headers, ip, originalUrl, user, tor }, res)
|
|||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
fileType,
|
||||
gaStartTime,
|
||||
license,
|
||||
licenseUrl,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
name,
|
||||
nsfw,
|
||||
thumbnail,
|
||||
|
@ -69,18 +75,34 @@ const claimPublish = ({ body, files, headers, ip, originalUrl, user, tor }, res)
|
|||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
// validate the body and files of the request
|
||||
try {
|
||||
// validateApiPublishRequest(body, files);
|
||||
({name, nsfw, license, title, description, thumbnail} = parsePublishApiRequestBody(body));
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
({fileName, filePath, fileExtension, fileType, thumbnailFileName, thumbnailFilePath, thumbnailFileType} = parsePublishApiRequestFiles(files));
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
({channelName, channelId, channelPassword} = body);
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
({
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
name,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
nsfw,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
license,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
licenseUrl,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
title,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
description,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
thumbnail,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
} = parsePublishApiRequestBody(body));
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
({
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
fileName,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
filePath,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
fileExtension,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
fileType,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
thumbnailFileName,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
thumbnailFilePath,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
thumbnailFileType,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
} = parsePublishApiRequestFiles(files));
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
({ channelName, channelId, channelPassword } = body);
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
} catch (error) {
|
||||
return res.status(400).json({success: false, message: error.message});
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
return res.status(400).json({ success: false, message: error.message });
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
}
|
||||
// check channel authorization
|
||||
authenticateUser(channelName, channelId, channelPassword, user)
|
||||
.then(({ channelName, channelClaimId }) => {
|
||||
if (publishOnlyApproved && !isApprovedChannel({ longId: channelClaimId }, approvedChannels)) {
|
||||
const error = {
|
||||
name : UNAPPROVED_CHANNEL,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
name: UNAPPROVED_CHANNEL,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
message: 'This spee.ch instance only allows publishing to approved channels',
|
||||
};
|
||||
throw error;
|
||||
|
@ -88,14 +110,25 @@ const claimPublish = ({ body, files, headers, ip, originalUrl, user, tor }, res)
|
|||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
|
||||
return Promise.all([
|
||||
checkClaimAvailability(name),
|
||||
createPublishParams(filePath, name, title, description, license, nsfw, thumbnail, channelName, channelClaimId),
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
createThumbnailPublishParams(thumbnailFilePath, name, license, nsfw),
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
createPublishParams(
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
filePath,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
name,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
title,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
description,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
license,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
licenseUrl,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
nsfw,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
thumbnail,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
channelName,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
channelClaimId
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
),
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
createThumbnailPublishParams(thumbnailFilePath, name, license, licenseUrl, nsfw),
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
]);
|
||||
})
|
||||
.then(([ claimAvailable, publishParams, thumbnailPublishParams ]) => {
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
.then(([claimAvailable, publishParams, thumbnailPublishParams]) => {
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
if (!claimAvailable) {
|
||||
const error = {
|
||||
name : CLAIM_TAKEN,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
name: CLAIM_TAKEN,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
message: 'That claim name is already taken',
|
||||
};
|
||||
throw error;
|
||||
|
@ -110,14 +143,20 @@ const claimPublish = ({ body, files, headers, ip, originalUrl, user, tor }, res)
|
|||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
.then(publishResults => {
|
||||
logger.info('Publish success >', publishResults);
|
||||
claimData = publishResults;
|
||||
({claimId} = claimData);
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
({ claimId } = claimData);
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
|
||||
if (channelName) {
|
||||
return chainquery.claim.queries.getShortClaimIdFromLongClaimId(claimData.certificateId, channelName);
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
logger.info(`api/claim/publish: claimData.certificateId ${claimData.certificateId}`);
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
return chainquery.claim.queries.getShortClaimIdFromLongClaimId(
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
claimData.certificateId,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
channelName
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
);
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
} else {
|
||||
return chainquery.claim.queries.getShortClaimIdFromLongClaimId(claimId, name, claimData).catch(() => {
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
return claimId.slice(0, 1);
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
});
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
return chainquery.claim.queries
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
.getShortClaimIdFromLongClaimId(claimId, name, claimData)
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
.catch(() => {
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
return claimId.slice(0, 1);
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
});
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
}
|
||||
})
|
||||
.then(shortId => {
|
||||
|
@ -131,13 +170,13 @@ const claimPublish = ({ body, files, headers, ip, originalUrl, user, tor }, res)
|
|||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
message: 'publish completed successfully',
|
||||
data : {
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
data: {
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
name,
|
||||
claimId,
|
||||
url : `${host}${canonicalUrl}`, // for backwards compatability with app
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
showUrl : `${host}${canonicalUrl}`,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
url: `${host}${canonicalUrl}`, // for backwards compatability with app
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
showUrl: `${host}${canonicalUrl}`,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
serveUrl: `${host}${canonicalUrl}${fileExtension}`,
|
||||
pushTo : canonicalUrl,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
pushTo: canonicalUrl,
|
||||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
||||
claimData,
|
||||
},
|
||||
});
|
||||
|
|
|||
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
Would you mind cleaning up this path while you're here? Would you mind cleaning up this path while you're here?
|
|
@ -1,15 +1,26 @@
|
|||
const parsePublishApiRequestBody = ({name, nsfw, license, title, description, thumbnail}) => {
|
||||
const parsePublishApiRequestBody = ({
|
||||
name,
|
||||
nsfw,
|
||||
license,
|
||||
licenseUrl,
|
||||
title,
|
||||
description,
|
||||
thumbnail,
|
||||
}) => {
|
||||
// validate name
|
||||
if (!name) {
|
||||
throw new Error('no name field found in request');
|
||||
}
|
||||
const invalidNameCharacters = /[^A-Za-z0-9,-]/.exec(name);
|
||||
if (invalidNameCharacters) {
|
||||
throw new Error('The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and "-"');
|
||||
throw new Error(
|
||||
'The claim name you provided is not allowed. Only the following characters are allowed: A-Z, a-z, 0-9, and "-"'
|
||||
);
|
||||
}
|
||||
// optional parameters
|
||||
nsfw = (nsfw === 'true');
|
||||
nsfw = nsfw === 'true';
|
||||
license = license || null;
|
||||
licenseUrl = licenseUrl || null;
|
||||
title = title || null;
|
||||
description = description || null;
|
||||
thumbnail = thumbnail || null;
|
||||
|
@ -18,6 +29,7 @@ const parsePublishApiRequestBody = ({name, nsfw, license, title, description, th
|
|||
name,
|
||||
nsfw,
|
||||
license,
|
||||
licenseUrl,
|
||||
title,
|
||||
description,
|
||||
thumbnail,
|
||||
|
|
|
@ -19,10 +19,11 @@ const createCanonicalLink = require('@globalutils/createCanonicalLink');
|
|||
route to update a claim through the daemon
|
||||
*/
|
||||
|
||||
const updateMetadata = ({ nsfw, license, title, description }) => {
|
||||
const updateMetadata = ({ nsfw, license, licenseUrl, title, description }) => {
|
||||
const update = {};
|
||||
if (nsfw) update['nsfw'] = nsfw;
|
||||
if (license) update['license'] = license;
|
||||
if (licenseUrl) update['license_url'] = licenseUrl;
|
||||
if (title) update['title'] = title;
|
||||
if (description) update['description'] = description;
|
||||
return update;
|
||||
|
@ -65,6 +66,7 @@ const claimUpdate = ({ body, files, headers, ip, originalUrl, user, tor }, res)
|
|||
thumbnail,
|
||||
fileExtension,
|
||||
license,
|
||||
licenseUrl,
|
||||
name,
|
||||
nsfw,
|
||||
thumbnailFileName,
|
||||
|
@ -127,10 +129,11 @@ const claimUpdate = ({ body, files, headers, ip, originalUrl, user, tor }, res)
|
|||
description: claimRecord.description,
|
||||
nsfw: claimRecord.nsfw,
|
||||
license: claimRecord.license,
|
||||
licenseUrl: claimRecord.license_url,
|
||||
language: 'en',
|
||||
author: details.title,
|
||||
},
|
||||
updateMetadata({ title, description, nsfw, license })
|
||||
updateMetadata({ title, description, nsfw, license, licenseUrl })
|
||||
);
|
||||
const publishParams = {
|
||||
name,
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
const logger = require('winston');
|
||||
const transformImage = require('./transformImage');
|
||||
const isValidQueryObject = require('../../../utils/isValidQueryObj');
|
||||
|
||||
const isValidQueryObject = require('server/utils/isValidQueryObj');
|
||||
const {
|
||||
serving: { dynamicFileSizing },
|
||||
} = require('@config/siteConfig');
|
||||
const { enabled: dynamicEnabled } = dynamicFileSizing;
|
||||
|
||||
const serveFile = async ({ filePath, fileType }, res, originalUrl) => {
|
||||
const queryObject = {};
|
||||
// TODO: replace quick/dirty try catch with better practice
|
||||
|
|
|
@ -59,5 +59,8 @@ module.exports = async (data, chName = null, chShortId = null) => {
|
|||
host,
|
||||
pending: Boolean(dataVals.height === 0),
|
||||
blocked: blocked,
|
||||
license: dataVals.license,
|
||||
licenseUrl: dataVals.license_url,
|
||||
transactionTime: dataVals.transaction_time,
|
||||
};
|
||||
};
|
||||
|
|
|
@ -39,6 +39,9 @@ module.exports = () => {
|
|||
moduleAliases['@clientutils'] = resolve(`${DEFAULT_ROOT}/utils`);
|
||||
// moduleAliases['@serverutils'] = resolve('server/utils');
|
||||
|
||||
// aliases for constants
|
||||
moduleAliases['@clientConstants'] = resolve(`${DEFAULT_ROOT}/constants`);
|
||||
|
||||
// create specific aliases for locally defined components in the following folders
|
||||
moduleAliases = addAliasesForCustomComponentFolder('containers', moduleAliases);
|
||||
moduleAliases = addAliasesForCustomComponentFolder('components', moduleAliases);
|
||||
|
@ -53,7 +56,6 @@ module.exports = () => {
|
|||
moduleAliases['@sagas'] = resolve(`${DEFAULT_ROOT}/sagas`);
|
||||
moduleAliases['@app'] = resolve(`${DEFAULT_ROOT}/app.js`);
|
||||
|
||||
|
||||
// return finished aliases
|
||||
return moduleAliases;
|
||||
};
|
||||
|
|
We should have a more suitable alias to use instead of the
../../