76 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { actions } from './mastodon-data'
 | 
						|
import { users } from '../tests/users'
 | 
						|
import { pinStatus, postStatus } from '../routes/_api/statuses'
 | 
						|
import { followAccount } from '../routes/_api/follow'
 | 
						|
import { favoriteStatus } from '../routes/_api/favorite'
 | 
						|
import { reblogStatus } from '../routes/_api/reblog'
 | 
						|
import fetch from 'node-fetch'
 | 
						|
import FileApi from 'file-api'
 | 
						|
import path from 'path'
 | 
						|
import fs from 'fs'
 | 
						|
import FormData from 'form-data'
 | 
						|
import { auth } from '../routes/_api/utils'
 | 
						|
 | 
						|
global.File = FileApi.File
 | 
						|
global.FormData = FileApi.FormData
 | 
						|
global.fetch = fetch
 | 
						|
 | 
						|
async function submitMedia (accessToken, filename, alt) {
 | 
						|
  let form = new FormData()
 | 
						|
  form.append('file', fs.createReadStream(path.join(__dirname, '../tests/images/' + filename)))
 | 
						|
  form.append('description', alt)
 | 
						|
  return new Promise((resolve, reject) => {
 | 
						|
    form.submit({
 | 
						|
      host: 'localhost',
 | 
						|
      port: 3000,
 | 
						|
      path: '/api/v1/media',
 | 
						|
      headers: auth(accessToken)
 | 
						|
    }, (err, res) => {
 | 
						|
      if (err) {
 | 
						|
        return reject(err)
 | 
						|
      }
 | 
						|
      let data = ''
 | 
						|
 | 
						|
      res.on('data', chunk => {
 | 
						|
        data += chunk
 | 
						|
      })
 | 
						|
 | 
						|
      res.on('end', () => resolve(JSON.parse(data)))
 | 
						|
    })
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
export async function restoreMastodonData () {
 | 
						|
  console.log('Restoring mastodon data...')
 | 
						|
  let internalIdsToIds = {}
 | 
						|
  for (let action of actions) {
 | 
						|
    console.log(JSON.stringify(action))
 | 
						|
    await new Promise(resolve => setTimeout(resolve, 200)) // sleep because otherwise order may not be preserved
 | 
						|
    let accessToken = users[action.user].accessToken
 | 
						|
 | 
						|
    if (action.post) {
 | 
						|
      let { text, media, sensitive, spoiler, privacy, inReplyTo, internalId } = action.post
 | 
						|
      if (typeof inReplyTo !== 'undefined') {
 | 
						|
        inReplyTo = internalIdsToIds[inReplyTo]
 | 
						|
      }
 | 
						|
      let mediaIds = media && await Promise.all(media.map(async mediaItem => {
 | 
						|
        let mediaResponse = await submitMedia(accessToken, mediaItem, 'kitten')
 | 
						|
        return mediaResponse.id
 | 
						|
      }))
 | 
						|
      let status = await postStatus('localhost:3000', accessToken, text, inReplyTo, mediaIds,
 | 
						|
        sensitive, spoiler, privacy || 'public')
 | 
						|
      if (typeof internalId !== 'undefined') {
 | 
						|
        internalIdsToIds[internalId] = status.id
 | 
						|
      }
 | 
						|
    } else if (action.follow) {
 | 
						|
      await followAccount('localhost:3000', accessToken, users[action.follow].id)
 | 
						|
    } else if (action.favorite) {
 | 
						|
      await favoriteStatus('localhost:3000', accessToken, internalIdsToIds[action.favorite])
 | 
						|
    } else if (action.boost) {
 | 
						|
      await reblogStatus('localhost:3000', accessToken, internalIdsToIds[action.boost])
 | 
						|
    } else if (action.pin) {
 | 
						|
      await pinStatus('localhost:3000', accessToken, internalIdsToIds[action.pin])
 | 
						|
    }
 | 
						|
  }
 | 
						|
  console.log('Restored mastodon data')
 | 
						|
}
 |