· 6 years ago · Mar 24, 2019, 08:22 PM
1const StoryblokClient = require('storyblok-js-client')
2
3const Storyblok = new StoryblokClient({
4 oauthToken: PROTECTED_VAR
5})
6
7const sourceSpaceId = SOURCE_SPACE_ID
8const targetSpaceId = TARGET_SPACE_ID
9
10const Sync = {
11 getAll(page) {
12 return Storyblok.get('spaces/' + sourceSpaceId + '/stories', {
13 per_page: 25,
14 story_only: 1,
15 page: page
16 })
17 },
18
19 async processAllStories(){
20 var targetFolders = await Storyblok.get(`spaces/${targetSpaceId}/stories`, {
21 folder_only: 1,
22 per_page: 1000,
23 sort_by: 'slug:asc'
24 })
25
26 var folderMapping = {}
27
28 for (var i = 0; i < targetFolders.data.stories.length; i++) {
29 var folder = targetFolders.data.stories[i]
30 folderMapping[folder.full_slug] = folder.id
31 }
32
33 var page = 1
34 var res = await this.getAll(page)
35 var all = res.data.stories
36 var total = res.total
37 var lastPage = Math.ceil((res.total / 25))
38
39 while (page < lastPage){
40 page++
41 res = await this.getAll(page)
42 res.data.stories.forEach((story) => {
43 all.push(story)
44 })
45 }
46
47 for (var i = 0; i < all.length; i++) {
48 console.log('starting update ' + all[i].full_slug)
49
50 var storyResult = await Storyblok.get('spaces/' + sourceSpaceId + '/stories/' + all[i].id)
51 var sourceStory = storyResult.data.story
52 var slugs = sourceStory.full_slug.split('/')
53 var folderId = 0
54
55 if (slugs.length > 1) {
56 slugs.pop()
57 var folderSlug = slugs.join('/')
58
59 if (folderMapping[folderSlug]) {
60 folderId = folderMapping[folderSlug]
61 } else {
62 console.log('the folder does not exist ' + folderSlug)
63 continue;
64 }
65 }
66
67 sourceStory.parent_id = folderId
68
69 try {
70 var existingStory = await Storyblok.get('spaces/' + targetSpaceId + '/stories', {with_slug: all[i].full_slug})
71
72 if (existingStory.data.stories.length == 1) {
73 var updateResult = await Storyblok.put('spaces/' + targetSpaceId + '/stories/' + existingStory.data.stories[0].id, {
74 story: sourceStory,
75 force_update: '1'
76 })
77 console.log('updated ' + existingStory.data.stories[0].full_slug)
78 } else {
79 var updateResult = await Storyblok.post('spaces/' + targetSpaceId + '/stories', {
80 story: sourceStory
81 })
82 console.log('created ' + sourceStory.full_slug)
83 }
84 } catch(e) {
85 console.log(e)
86 }
87 }
88
89 return all
90 }
91}
92
93exports.handler = async function (event, context) {
94 await Sync.processAllStories()
95
96 return {
97 statusCode: '200',
98 body: JSON.stringify({success: 'Stories synced.'})
99 }
100}