Added SEO and added several features.

This commit is contained in:
David Ball 2024-07-29 04:11:42 +00:00
parent 644d9743a9
commit a69dcea800
38 changed files with 721 additions and 11 deletions

15
config/cron-tasks.ts Normal file
View File

@ -0,0 +1,15 @@
export default {
/**
* Simple example.
* Every monday at 1am.
*/
myJob: {
task: ({ strapi }) => {
// Add your own logic here (e.g. send a queue of email, create a database backup, etc.).
},
options: {
rule: "0 0 1 * * 1",
},
},
};

View File

@ -1 +1,5 @@
export default () => ({});
export default () => ({
seo: {
enabled: true,
},
});

View File

@ -1,9 +1,15 @@
import cronTasks from "./cron-tasks";
export default ({ env }) => ({
host: env('HOST', '0.0.0.0'),
port: env.int('PORT', 1337),
app: {
keys: env.array('APP_KEYS'),
},
cron: {
enabled: true,
tasks: cronTasks,
},
webhooks: {
populateRelations: env.bool('WEBHOOKS_POPULATE_RELATIONS', false),
},

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "dashersupply-strapi-docker",
"version": "0.1.0",
"version": "0.2.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "dashersupply-strapi-docker",
"version": "0.1.0",
"version": "0.2.0",
"license": "MIT",
"dependencies": {
"@strapi/plugin-cloud": "4.25.4",

View File

@ -1,7 +1,7 @@
{
"name": "dashersupply-strapi-docker",
"private": true,
"version": "0.1.0",
"version": "0.2.0",
"description": "A Strapi application",
"scripts": {
"develop": "strapi develop",
@ -12,10 +12,11 @@
},
"devDependencies": {},
"dependencies": {
"@strapi/strapi": "4.25.4",
"@strapi/plugin-users-permissions": "4.25.4",
"@strapi/plugin-i18n": "4.25.4",
"@strapi/plugin-cloud": "4.25.4",
"@strapi/strapi": "4.25.5",
"@strapi/plugin-users-permissions": "4.25.5",
"@strapi/plugin-i18n": "4.25.5",
"@strapi/plugin-cloud": "4.25.5",
"@strapi/plugin-seo": "1.9.9",
"pg": "8.8.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",

View File

@ -0,0 +1,98 @@
{
"kind": "singleType",
"collectionName": "amazon_pa_api_configs",
"info": {
"singularName": "amazon-pa-api-config",
"pluralName": "amazon-pa-api-configs",
"displayName": "Amazon PA API Config",
"description": ""
},
"options": {
"draftAndPublish": false
},
"pluginOptions": {},
"attributes": {
"accessKey": {
"type": "string"
},
"secretKey": {
"type": "string"
},
"partnerType": {
"type": "enumeration",
"enum": [
"Associates"
]
},
"partnerTag": {
"type": "string",
"regex": "^[A-Za-z0-9\\-]+-\\d{2}$"
},
"marketplace": {
"type": "enumeration",
"enum": [
"https://www.amazon.com",
"https://www.amazon.co.uk",
"https://www.amazon.com.au",
"https://www.amazon.com.be",
"https://www.amazon.com.br",
"https://www.amazon.ca",
"https://www.amazon.eg",
"https://www.amazon.fr",
"https://www.amazon.de",
"https://www.amazon.in",
"https://www.amazon.it",
"https://www.amazon.co.jp",
"https://www.amazon.com.mx",
"https://www.amazon.nl",
"https://www.amazon.pl",
"https://www.amazon.sg",
"https://www.amazon.sa",
"https://www.amazon.es",
"https://www.amazon.se",
"https://www.amazon.com.tr",
"https://www.amazon.ae"
]
},
"service": {
"type": "enumeration",
"enum": [
"ProductAdvertisingAPIv1"
]
},
"host": {
"type": "enumeration",
"enum": [
"webservices.amazon.com.au",
"webservices.amazon.com.be",
"webservices.amazon.com.br",
"webservices.amazon.ca",
"webservices.amazon.eg",
"webservices.amazon.fr",
"webservices.amazon.de",
"webservices.amazon.in",
"webservices.amazon.it",
"webservices.amazon.co.jp",
"webservices.amazon.com.mx",
"webservices.amazon.nl",
"webservices.amazon.pl",
"webservices.amazon.sg",
"webservices.amazon.sa",
"webservices.amazon.es",
"webservices.amazon.se",
"webservices.amazon.com.tr",
"webservices.amazon.ae",
"webservices.amazon.co.uk",
"webservices.amazon.com"
]
},
"region": {
"type": "enumeration",
"enum": [
"us-east-1",
"us-west-2",
"eu-west-1"
]
}
}
}

View File

@ -0,0 +1,7 @@
/**
* amazon-pa-api-config controller
*/
import { factories } from '@strapi/strapi'
export default factories.createCoreController('api::amazon-pa-api-config.amazon-pa-api-config');

View File

@ -0,0 +1,7 @@
/**
* amazon-pa-api-config router
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreRouter('api::amazon-pa-api-config.amazon-pa-api-config');

View File

@ -0,0 +1,7 @@
/**
* amazon-pa-api-config service
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreService('api::amazon-pa-api-config.amazon-pa-api-config');

View File

@ -0,0 +1,55 @@
{
"kind": "collectionType",
"collectionName": "amazon_pa_api_updates",
"info": {
"singularName": "amazon-pa-api-update",
"pluralName": "amazon-pa-api-updates",
"displayName": "Amazon PA-API Updates",
"description": ""
},
"options": {
"draftAndPublish": false
},
"pluginOptions": {},
"attributes": {
"scheduledStartTime": {
"type": "datetime"
},
"taskStartedTime": {
"type": "datetime"
},
"taskEndedTime": {
"type": "datetime"
},
"taskStatus": {
"type": "enumeration",
"enum": [
"Scheduled",
"Started",
"Finished",
"Error"
]
},
"signedRequest": {
"type": "string"
},
"jsonRequestPayload": {
"type": "json"
},
"jsonResponse": {
"type": "json"
},
"productsAffected": {
"type": "relation",
"relation": "manyToMany",
"target": "api::product.product",
"inversedBy": "amazonPAAPIUpdates"
},
"jobSummary": {
"type": "text"
},
"log": {
"type": "text"
}
}
}

View File

@ -0,0 +1,7 @@
/**
* amazon-pa-api-update controller
*/
import { factories } from '@strapi/strapi'
export default factories.createCoreController('api::amazon-pa-api-update.amazon-pa-api-update');

View File

@ -0,0 +1,7 @@
/**
* amazon-pa-api-update router
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreRouter('api::amazon-pa-api-update.amazon-pa-api-update');

View File

@ -0,0 +1,7 @@
/**
* amazon-pa-api-update service
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreService('api::amazon-pa-api-update.amazon-pa-api-update');

View File

@ -4,7 +4,8 @@
"info": {
"singularName": "brand",
"pluralName": "brands",
"displayName": "Brand"
"displayName": "Brand",
"description": ""
},
"options": {
"draftAndPublish": true
@ -48,11 +49,12 @@
"type": "blocks"
},
"logoImage": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images"
],
"type": "media",
"multiple": false,
"pluginOptions": {
"i18n": {
"localized": true
@ -64,6 +66,16 @@
"relation": "oneToMany",
"target": "api::product.product",
"mappedBy": "brand"
},
"seo": {
"type": "component",
"repeatable": false,
"pluginOptions": {
"i18n": {
"localized": true
}
},
"component": "shared.seo"
}
}
}

View File

@ -70,6 +70,16 @@
"relation": "manyToMany",
"target": "api::product.product",
"mappedBy": "categories"
},
"seo": {
"type": "component",
"repeatable": false,
"pluginOptions": {
"i18n": {
"localized": true
}
},
"component": "shared.seo"
}
}
}

View File

@ -0,0 +1,19 @@
{
"kind": "singleType",
"collectionName": "google_ad_senses",
"info": {
"singularName": "google-ad-sense",
"pluralName": "google-ad-senses",
"displayName": "Google AdSense",
"description": ""
},
"options": {
"draftAndPublish": false
},
"pluginOptions": {},
"attributes": {
"adsTxt": {
"type": "string"
}
}
}

View File

@ -0,0 +1,7 @@
/**
* google-ad-sense controller
*/
import { factories } from '@strapi/strapi'
export default factories.createCoreController('api::google-ad-sense.google-ad-sense');

View File

@ -0,0 +1,7 @@
/**
* google-ad-sense router
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreRouter('api::google-ad-sense.google-ad-sense');

View File

@ -0,0 +1,7 @@
/**
* google-ad-sense service
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreService('api::google-ad-sense.google-ad-sense');

View File

@ -0,0 +1,20 @@
{
"kind": "singleType",
"collectionName": "google_analyticss",
"info": {
"singularName": "google-analytics",
"pluralName": "google-analyticss",
"displayName": "Google Analytics",
"description": ""
},
"options": {
"draftAndPublish": false
},
"pluginOptions": {},
"attributes": {
"gTag": {
"type": "string",
"regex": "^[G][-][A-Z0-9]+$"
}
}
}

View File

@ -0,0 +1,7 @@
/**
* google-analytics controller
*/
import { factories } from '@strapi/strapi'
export default factories.createCoreController('api::google-analytics.google-analytics');

View File

@ -0,0 +1,7 @@
/**
* google-analytics router
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreRouter('api::google-analytics.google-analytics');

View File

@ -0,0 +1,7 @@
/**
* google-analytics service
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreService('api::google-analytics.google-analytics');

View File

@ -0,0 +1,83 @@
{
"kind": "collectionType",
"collectionName": "marketplaces",
"info": {
"singularName": "marketplace",
"pluralName": "marketplaces",
"displayName": "Marketplace",
"description": ""
},
"options": {
"draftAndPublish": true
},
"pluginOptions": {
"i18n": {
"localized": true
}
},
"attributes": {
"name": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "string"
},
"slug": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "string"
},
"shortDescription": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "blocks"
},
"description": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "blocks"
},
"logoImage": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images"
],
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"disclaimer": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "blocks"
},
"seo": {
"type": "component",
"repeatable": false,
"pluginOptions": {
"i18n": {
"localized": true
}
},
"component": "shared.seo"
}
}
}

View File

@ -0,0 +1,7 @@
/**
* marketplace controller
*/
import { factories } from '@strapi/strapi'
export default factories.createCoreController('api::marketplace.marketplace');

View File

@ -0,0 +1,7 @@
/**
* marketplace router
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreRouter('api::marketplace.marketplace');

View File

@ -0,0 +1,7 @@
/**
* marketplace service
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreService('api::marketplace.marketplace');

View File

@ -73,6 +73,33 @@
"relation": "manyToMany",
"target": "api::tag.tag",
"inversedBy": "products"
},
"components": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "dynamiczone",
"components": [
"product.amazon-site-stripe-details"
]
},
"amazonPAAPIUpdates": {
"type": "relation",
"relation": "manyToMany",
"target": "api::amazon-pa-api-update.amazon-pa-api-update",
"mappedBy": "productsAffected"
},
"seo": {
"type": "component",
"repeatable": false,
"pluginOptions": {
"i18n": {
"localized": true
}
},
"component": "shared.seo"
}
}
}

View File

@ -0,0 +1,69 @@
{
"kind": "singleType",
"collectionName": "sites",
"info": {
"singularName": "site",
"pluralName": "sites",
"displayName": "Site",
"description": ""
},
"options": {
"draftAndPublish": true
},
"pluginOptions": {
"i18n": {
"localized": true
}
},
"attributes": {
"siteName": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "string"
},
"categoriesCallout": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "blocks"
},
"siteUrl": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "string",
"regex": "^https{0,1}:\\/\\/[A-Za-z0-9\\.\\-_]+$"
},
"metaDescription": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "text"
},
"brandsCallout": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "blocks"
},
"marketplacesCallout": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "blocks"
}
}
}

View File

@ -0,0 +1,7 @@
/**
* site controller
*/
import { factories } from '@strapi/strapi'
export default factories.createCoreController('api::site.site');

View File

@ -0,0 +1,7 @@
/**
* site router
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreRouter('api::site.site');

View File

@ -0,0 +1,7 @@
/**
* site service
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreService('api::site.site');

View File

@ -0,0 +1,16 @@
{
"collectionName": "components_product_amazon_site_stripe_details",
"info": {
"displayName": "Amazon Attributes",
"description": ""
},
"options": {},
"attributes": {
"asin": {
"type": "string"
},
"siteStripeUrl": {
"type": "text"
}
}
}

View File

@ -0,0 +1,17 @@
{
"collectionName": "components_product_merchant_offers",
"info": {
"displayName": "Merchant Offer"
},
"options": {},
"attributes": {
"merchantName": {
"type": "string"
},
"offerPrice": {
"type": "component",
"repeatable": true,
"component": "product.offer-price"
}
}
}

View File

@ -0,0 +1,21 @@
{
"collectionName": "components_product_offer_prices",
"info": {
"displayName": "Offer Price",
"description": ""
},
"options": {},
"attributes": {
"newPrice": {
"type": "decimal",
"min": 0
},
"usedPrice": {
"type": "decimal",
"min": 0
},
"quoteDate": {
"type": "datetime"
}
}
}

View File

@ -0,0 +1,21 @@
{
"collectionName": "components_product_reviews_data",
"info": {
"displayName": "Reviews Data"
},
"options": {},
"attributes": {
"reviewCount": {
"type": "integer",
"min": 0
},
"reviewRating": {
"type": "decimal",
"max": 5,
"min": 0
},
"updatedDate": {
"type": "datetime"
}
}
}

View File

@ -0,0 +1,37 @@
{
"collectionName": "components_shared_meta_socials",
"info": {
"displayName": "metaSocial",
"icon": "project-diagram"
},
"options": {},
"attributes": {
"socialNetwork": {
"type": "enumeration",
"enum": [
"Facebook",
"Twitter"
],
"required": true
},
"title": {
"type": "string",
"required": true,
"maxLength": 60
},
"description": {
"type": "string",
"maxLength": 65,
"required": true
},
"image": {
"allowedTypes": [
"images",
"files",
"videos"
],
"type": "media",
"multiple": false
}
}
}

View File

@ -0,0 +1,53 @@
{
"collectionName": "components_shared_seos",
"info": {
"displayName": "seo",
"icon": "search"
},
"options": {},
"attributes": {
"metaTitle": {
"required": true,
"type": "string",
"maxLength": 60
},
"metaDescription": {
"type": "string",
"required": true,
"maxLength": 160,
"minLength": 50
},
"metaImage": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images",
"files",
"videos"
]
},
"metaSocial": {
"type": "component",
"repeatable": true,
"component": "shared.meta-social"
},
"keywords": {
"type": "text",
"regex": "[^,]+"
},
"metaRobots": {
"type": "string",
"regex": "[^,]+"
},
"structuredData": {
"type": "json"
},
"metaViewport": {
"type": "string"
},
"canonicalURL": {
"type": "string"
}
}
}