Nuxt.js で環境によって使う Repository を切り替える

デモ用環境で使う想定で、以下のようにして使う Repository を切り替えてみた。

(前提となるコードは Nuxt.js で Repository を使う を参照)

repositories/mocks/PostRepository.js

const posts = [
  {
    // 省略
  },
]

export default $axios => {
  return {
    async all() {
      return await new Promise(resolve => resolve(posts))
    },
    build() {
      return {
        id: null,
        // 省略
      };
    },
    async find(id) {
      id = parseInt(id, 10)
      const post = posts.find(x => x.id === id)
      return await new Promise(resolve => resolve(post))
      // 見つからない場合は考慮しない
    },
    async create(post) {
      post.id = posts.reduce((acc, x) => (x.id > acc ? x.id : acc), 0) + 1
      posts.unshift(post)
      return await new Promise(resolve => resolve(post))
      // validation error は考慮しない
    },
    async update(post) {
      const index = posts.findIndex((x) => x.id === post.id);
      posts.splice(index, 1, post);
      return await new Promise((resolve) => resolve(post));
      // validation error は考慮しない
    },
    async destroy(id) {
      const index = posts.findIndex((x) => x.id === id);
      posts.splice(index, 1);
      await new Promise((resolve) => resolve());
      // validation error は考慮しない
    },
  }
}

plugins/mock_repositories.js

// plugins/repositories.js とは import 元が違うだけ
import PostRepository from '@/repositories/mocks/PostRepository'

export default ({ $axios }, inject) => {
  const posts = PostRepository($axios)
  const repositories = { posts }
  inject('repositories', repositories)
}

nuxt.config.js

plugins: [
  process.env.HOGE
    ? '@/plugins/mock_repositories'
    : '@/plugins/repositories',
],