⚫︎アプリ名 GSS一括管理くん
⚫︎機能概要
⚫︎その他使いたいもの
・rspec ・vue2, composition API ・stroe, vueX ・typescript
手順: Railsのプロジェクトを作成します。 Google APIと連携するための設定を行います。 CSVデータをMySQLに保存するためのモデルやマイグレーションを作成します。 DockerでMySQLのセットアップを行います。
# Railsプロジェクトの作成
rails new gss_management --api -d mysql
# Gemfileに必要なGemを追加
# google-api-client, aws-sdk-s3を追加
bundle add google-api-client aws-sdk-s3
# Docker用の設定ファイルを追加
touch Dockerfile
touch docker-compose.yml
# MySQL用のコンテナを起動
docker-compose up -d
# データベースを作成
docker-compose run web rake db:create
docker-compose.yml の例:
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: gss_development
ports:
- "3306:3306"
web:
build: .
command: bundle exec rails s -b '0.0.0.0'
volumes:
- ".:/myapp"
ports:
- "3000:3000"
depends_on:
- db
手順: Google Cloud Consoleでプロジェクトを作成し、APIキーを取得。 google-api-clientを使ってGoogle Sheetsのデータを取得。 データをCSV形式で保存し、S3にアップロード。 コード例: Google APIの認証設定:
コードをコピーする
# Google APIのクレデンシャルを保存
touch config/credentials.json
Google Sheets APIのセットアップ:
コードをコピーする
require 'google/apis/sheets_v4'
# Google Sheets APIをセットアップ
service = Google::Apis::SheetsV4::SheetsService.new
service.key = ENV['GOOGLE_API_KEY']
spreadsheet_id = 'your_spreadsheet_id'
range = 'Sheet1!A1:Z1000'
# データを取得
response = service.get_spreadsheet_values(spreadsheet_id, range)
CSV保存とS3アップロード:
コードをコピーする
require 'csv'
require 'aws-sdk-s3'
# CSVファイル作成
csv_data = CSV.generate do |csv|
response.values.each { |row| csv << row }
end
# S3アップロード
s3 = Aws::S3::Resource.new(region: 'ap-northeast-1')
obj = s3.bucket('your_bucket_name').object('gss_data.csv')
obj.put(body: csv_data)
手順: CSVデータをMySQLに保存するモデルとマイグレーションを作成。 CSVをパースし、データベースに保存。 コマンド:
コードをコピーする
# モデルとマイグレーションの作成
rails generate model GssData name:string value:string
rails db:migrate
コード例:
コードをコピーする
CSV.parse(csv_data, headers: true) do |row|
GssData.create!(name: row['name'], value: row['value'])
end
コードをコピーする
# webpackerのセットアップ(既に実行済みであれば不要)
bundle exec rails webpacker:install
bundle exec rails webpacker:install:vue
yarn add @vue/composition-api
mkdir -p app/javascript/components touch app/javascript/components/GssTable.vue
main.js の設定:
```javascript
コードをコピーする
// app/javascript/packs/application.js または main.js
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'
Vue.use(VueCompositionApi)
// 既存のコード...
GssTable.vue の例(Composition API使用):
コードをコピーする
<template>
<v-data-table :items="gssData" :headers="headers"></v-data-table>
</template>
<script>
import { ref, onMounted } from '@vue/composition-api';
import axios from 'axios';
export default {
setup() {
const gssData = ref([]);
const headers = ref([
{ text: 'Name', value: 'name' },
{ text: 'Value', value: 'value' }
]);
onMounted(() => {
axios.get('/api/gss_data')
.then(response => {
gssData.value = response.data;
});
});
return {
gssData,
headers
};
}
};
</script>
コードをコピーする
# Chart.jsのインストール
yarn add chart.js
グラフ表示の例(Composition API使用):
コードをコピーする
<template>
<div>
<canvas ref="chartCanvas"></canvas>
</div>
</template>
## 6. Rspecテスト
手順:
モデルやコントローラーのテストケースをRSpecで作成します。
コマンド:
```bash
コードをコピーする
# RSpecのインストール
bundle add rspec-rails
rails generate rspec:install
# テストの実行
bundle exec rspec
rails generate migration CreateGssSyncTasks name:string status:integer scheduled_at:datetime completed_at:datetime gss_url:string tab_name:string
class CreateGssSyncTasks < ActiveRecord::Migration[6.0]
def change
create_table :gss_sync_tasks do |t|
t.string :name, null: false
t.integer :status, default: 0, null: false
t.datetime :scheduled_at
t.datetime :completed_at
t.string :gss_url, null: false
t.string :tab_name, null: false
t.timestamps
end
end
end
rails db:migrate
class GssSyncTask < ApplicationRecord
enum status: { pending: 0, in_progress: 1, completed: 2, failed: 3 }
validates :name, presence: true
validates :status, inclusion: { in: statuses.keys }
validates :gss_url, presence: true
validates :tab_name, presence: true
end
class GssSyncTasksController < ApplicationController
def create
task = GssSyncTask.create!(
name: "スプレッドシート同期",
status: :pending,
gss_url: "https://docs.google.com/spreadsheets/d/xxxxxxx", # 実際の URL を設定
tab_name: "Sheet1" # 実際のタブ名を設定
)
# ジョブや同期処理を非同期に実行
SpreadsheetSyncJob.perform_async(task.id)
redirect_to tasks_path, notice: 'タスクが作成されました。'
end
end
class SpreadsheetSyncService
def self.sync_spreadsheet(task)
# スプレッドシート URL とタブ名を使用して同期処理を実行
gss_url = task.gss_url
tab_name = task.tab_name
# Google Sheets API などを使って同期処理を実行
result = ::SpreadsheetsImport::UpdateService.new(gss_url, tab_name).execute
if result.success?
task.update!(status: 'completed', completed_at: Time.current)
else
task.update!(status: 'failed')
end
end
end
docker-compose.yml
・・・
sidekiq:
build:
command: bundle exec sidekiq
volumes:
- ".:/app"
depends_on:
- db
environment:
- RAILS_ENV=development
networks:
- app_network
・・・
config/sidekiq.yml
:concurrency: 5
:queues:
- default
- mailers
class GssSyncJob
include Sidekiq::Worker
def perform(task_id)
task = GssSyncTask.find(task_id)
# GSSの更新処理を呼び出す
SpreadsheetSyncService.sync_spreadsheet(task)
end
end