146 lines
3.1 KiB
JavaScript
146 lines
3.1 KiB
JavaScript
![]() |
import 'dotenv/config'
|
||
|
import axios from 'axios'
|
||
|
|
||
|
const strapiHost = 'https://posts.freesewing.org'
|
||
|
const languages = ['en', 'de', 'fr', 'es', 'nl']
|
||
|
const anon = '6143bb25941e4d1efd882b35' // A FreeSewing maker
|
||
|
const joost = '60fade591972003530e03b39' // joostdecock
|
||
|
|
||
|
const uris = {
|
||
|
showcaseposts: `${strapiHost}/showcaseposts?_limit=-1`,
|
||
|
// blogposts: `${strapiHost}/blogposts?_limit=-1&dev_ne=true`,
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* This script will connect to Strapi and make sure there's a
|
||
|
* localized version for each:
|
||
|
*
|
||
|
* - blog post
|
||
|
* - showcase post
|
||
|
* - maker
|
||
|
* - author
|
||
|
*
|
||
|
* And this for all non-Enlgish languages:
|
||
|
*
|
||
|
* - Dutch
|
||
|
* - German
|
||
|
* - Spanish
|
||
|
* - French
|
||
|
*
|
||
|
* But only if a translated version does not exist yet.
|
||
|
*
|
||
|
* When that's the case, it will just copy over the English
|
||
|
* and add a (translated) [in English] to the title of posts.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* We need to login and get the JWT token
|
||
|
*/
|
||
|
const login = async () => {
|
||
|
let result
|
||
|
const data = {
|
||
|
email: process.env.FS_STRAPI_USERNAME,
|
||
|
password: process.env.FS_STRAPI_PASSWORD,
|
||
|
}
|
||
|
try {
|
||
|
result = await axios.post(`${strapiHost}/admin/login`, data)
|
||
|
if (result?.data?.data?.token) return result.data.data.token
|
||
|
}
|
||
|
catch(err) {
|
||
|
console.log(err)
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Helper method for Authorization header
|
||
|
*/
|
||
|
const bearer = token => ({
|
||
|
headers: { Authorization: 'Bearer ' + token }
|
||
|
})
|
||
|
|
||
|
/*
|
||
|
* Helper method to load content from Strapi
|
||
|
* Exported because it's re-used by the Algolia indexing script
|
||
|
*/
|
||
|
const getContent = async (lang, type) => {
|
||
|
const items = {}
|
||
|
let res
|
||
|
try {
|
||
|
res = await axios.get(`${uris[type]}&_locale=${lang}`)
|
||
|
if (res.data) return res.data
|
||
|
}
|
||
|
catch (err) {
|
||
|
console.log(err)
|
||
|
}
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Adds maker to showcase post
|
||
|
*/
|
||
|
const addMaker = (content, lang, token, makers) => {
|
||
|
const promises = []
|
||
|
for (const item of content) {
|
||
|
promises.push(axios.put(
|
||
|
`${strapiHost}/showcaseposts/${item.id}`,
|
||
|
{
|
||
|
maker: makers[item.slug]
|
||
|
},
|
||
|
bearer(token)
|
||
|
)
|
||
|
.then(res => {
|
||
|
})
|
||
|
.catch(err => console.log(err))
|
||
|
)
|
||
|
}
|
||
|
|
||
|
return Promise.all(promises)
|
||
|
}
|
||
|
|
||
|
const addAuthors = async (type, token) => {
|
||
|
const english = await getContent('en', type)
|
||
|
const makers = {}
|
||
|
for (const item of english) {
|
||
|
makers[item.slug] = (item.maker.id === joost)
|
||
|
? anon
|
||
|
: item.maker.id
|
||
|
}
|
||
|
|
||
|
for (const lang of languages) {
|
||
|
const content = await getContent(lang, type)
|
||
|
if (type === 'showcaseposts') await addMaker(content, lang, token, makers)
|
||
|
}
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
const getToWork = async () => {
|
||
|
if (!process.env.FS_STRAPI_USERNAME || !process.env.FS_STRAPI_PASSWORD) {
|
||
|
console.log(`
|
||
|
You need to set the following environment variables to run this script:
|
||
|
|
||
|
- FS_STRAPI_USERNAME
|
||
|
- FS_STRAPi_PASSWORD
|
||
|
`)
|
||
|
process.exit()
|
||
|
}
|
||
|
const token = await login()
|
||
|
if (!token) {
|
||
|
console.log('Failed to login to strapi')
|
||
|
process.exit()
|
||
|
}
|
||
|
const translations = languages.length - 1
|
||
|
for (const type of Object.keys(uris)) {
|
||
|
console.log(`Loading ${type} from Strapi`)
|
||
|
await addAuthors(type, token)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
getToWork()
|