Halo, selamat datang di LCBO API?
Jika Anda bertanya-tanya "apa itu LCBO API?", izinkan saya menjelaskannya. Di Ontario, Kanada, semua penjualan minuman beralkohol melalui perusahaan milik pemerintah bernama Liquor Control Board of Ontario (LCBO) yang menangani ritel dan distribusi minuman beralkohol di seluruh provinsi. LCBO memiliki banyak toko ritel dan situs web yang menampung katalog setiap produk, toko, dan bahkan tingkat inventaris. Mereka menerbitkan katalog musiman berisi resep, editorial, dan konten lainnya yang disebut Makanan & Minuman. Mereka juga menyumbangkan pendapatan miliaran dolar ke sistem layanan kesehatan publik kita setiap tahunnya. Ini adalah situasi yang menarik ketika Anda memikirkannya, tempat-tempat lain memiliki sistem serupa tetapi sepengetahuan saya tidak ada yang memiliki luas dan kedalaman seperti LCBO. Nah, sekarang kamu sudah tahu apa itu, keren kan?
Ini mungkin menarik bagi Anda meskipun Anda tidak tinggal di Ontario, Kanada, jika:
Sepanjang keseluruhan proyek ini saya telah berjuang keras dengan gagasan untuk menerima dukungan finansial. Di satu sisi LCBO API membutuhkannya, di sisi lain saya bosan dengan komplikasi yang ditimbulkannya. Nah, sekarang saya punya solusi SEMPURNA untuk masalah ini!
Saat ini saya sedang menjalani pengobatan kanker darah, khususnya limfoma sel b besar yang menyebar. Saya akan segera menulis lebih banyak tentang hal itu di tempat lain, tetapi selama setahun terakhir ini orang-orang dari mana pun telah mendukung saya dengan segala cara yang mereka bisa, dan hal itu telah mengubah saya. Saya ingin kita melakukan sesuatu yang besar untuk menunjukkan bahwa kita juga peduli!
Jika Anda pernah ingin mendukung proyek ini di masa lalu, silakan berdonasi ke Hamilton Health Sciences atas nama LCBO API, mereka menyelamatkan hidup saya.
Donasi ke Ilmu Kesehatan Hamilton
Saya sedang menjalani perawatan di Juravinski Cancer Center, tapi sebenarnya Anda bisa memilih opsi mana saja, atau biarkan default. Tidak masalah apakah jumlahnya kecil atau besar, mereka akan memberi tahu saya saat Anda berdonasi. Saya akan membuat daftar untuk melacak totalnya, mari kita lihat berapa banyak yang bisa kita kumpulkan!
Terakhir, saya ingin memberikan perhatian khusus pada tempat kerja saya, Crowdmark. Mereka sangat baik dan pengertian selama ini, dan saya benar-benar tidak akan bisa melakukan ini tanpa mereka. Kami bekerja tanpa kenal lelah untuk memajukan status quo penilaian di pendidikan tinggi. Jika Anda peduli dengan pendidikan dan pembelajaran, saya mendorong Anda untuk memeriksa kami.
Pada musim gugur tahun 2008, saya adalah seorang pengembang web baru dengan pengalaman beberapa tahun. Saya haus akan tantangan dan pengakuan. Aplikasi menjadi sesuatu yang populer pada saat itu dan saya sangat ingin membuatnya. Saya memutuskan ingin membuat yang mengharuskan saya membuat API ini terlebih dahulu. Saya tidak pernah membuat aplikasi itu?
Jika Anda melihat ke dalam basis kode ini cukup lama, kemungkinan besar Anda akan menemukan saat-saat frustrasi, jalan buntu, hal-hal yang membingungkan, dll. Saya sangat berharap Anda tidak fokus pada hal itu atau pada hal-hal negatif yang mungkin Anda temukan. Aku bukan orang seperti itu lagi, dan aku juga tidak ingin kamu menjadi orang seperti itu. Saya adalah buku terbuka tentang ini! Buka sebuah terbitan dan ajukan pertanyaan kepada saya, saya akan sejujur dan penuh hormat mungkin, saya hanya meminta Anda melakukan hal yang sama.
Saya merilis proyek ini di bawah GNU GPLv3, menurut saya ini adalah opsi paling adil dan bertanggung jawab untuk proyek seperti ini. Jika Anda merasa berbeda, bukalah suatu masalah dan kita dapat berdiskusi secara terbuka mengenai hal tersebut. Saya hanya meminta, dengan hormat, agar Anda tidak menggunakan kembali branding dan desainnya. Saya setuju dengan penggunaan kembali dokumentasi tersebut, tetapi gaya, identitas, dan pencitraan merek harus diubah jika Anda ingin menerapkan versi aplikasi ini yang Anda miliki sendiri.
Bagaimana jika alih-alih aplikasi monolitik yang mencoba melakukan segala sesuatu dalam satu gaya, di satu tempat, kita berpikir lebih besar? Bagaimana jika crawler merupakan proyek terpisah lagi, bertanggung jawab untuk mengumpulkan dan menormalisasi data, yang lain dapat membangun node API di platform apa pun yang mereka inginkan, node tersebut akan mendaftar ke penyedia data dan menerima data yang diperbarui saat tersedia dan menyediakan data tersebut ke pengguna dari semua jenis yang berbeda.
Daripada puluhan server API serupa mencoba melakukan hal yang sama, memperjuangkan sumber daya LCBO.com, kami dapat memfokuskan upaya kami untuk membangun nilai pada data ini daripada memperjuangkan kepemilikan atas data tersebut. Kita bisa melibatkan disiplin ilmu lain untuk menghasilkan nilai baru yang melampaui apa yang sudah terlihat, melibatkan komunitas kerajinan bir dan anggur, mengembangkan hal ini, menjadikannya lebih besar dari sekadar Ontario.
Saya tidak tahu seberapa mungkin hal seperti itu terjadi, tetapi saya tahu jika orang lain tertarik, saya akan dengan senang hati mengadakan diskusi ini.
Selain itu, mungkin kita harus mempertimbangkan untuk membebankan biaya yang wajar kepada pengguna korporat untuk mengakses node API, bahwa uang tersebut dapat digunakan untuk mendanai biaya hosting agar semuanya tetap berkelanjutan, dapat juga digunakan untuk mendanai program dukungan bagi orang-orang yang tidak bisa minum, atau yang tidak mau minum, atau yang ingin minum lebih sedikit, untuk berkontribusi kepada masyarakat dan benar-benar membuat perbedaan.
Namun saya membutuhkan orang lain untuk membantu berbagi beban dalam menjaga dan mengelola semua ini, kesehatan dan kebahagiaan saya dan keluarga adalah prioritas #1, diikuti oleh karier saya, dan kemudian teman-teman dan komunitas saya. Proyek ini tidak dapat lagi menjadi proyek #1 saya, tidak berkelanjutan bagi saya, dan tidak sehat bagi saya. Namun jika Anda terinspirasi oleh pesan ini, silakan hubungi saya, sebaiknya secara terbuka, tetapi secara pribadi pada awalnya juga tidak masalah.
Saya harap ini membuat Anda bersemangat!
Saya tidak dapat menahan diri, saya menulis lebih banyak tentang ide-ide saya tentang ini: doc/lcboapi-propose.md
Sekarang, setelah hal tersebut selesai, kita dapat mulai mencari tahu untuk siapa sebenarnya saya melakukan ini, dan apa yang membuat saya bersemangat dan terinspirasi untuk melakukan hal ini: kesempatan untuk belajar dan berkembang serta membantu orang lain melakukan hal yang sama. Buat kalian yang penasaran, yuk kita lihat kelanjutannya ?
Anda mungkin dapat menjalankan aplikasi secara langsung di lingkungan host Anda, tidak memerlukan sesuatu yang terlalu mewah dalam hal ketergantungan sistem. Saya mengembangkan pada perangkat keras Apple, jika Anda melakukannya juga, Anda mungkin berhasil menggunakan Postgres.app, dan Homebrew untuk menginstal Redis. Jika tidak, Anda dapat menggunakan Docker.
Jika Anda memiliki pengalaman dengan platform lain, silakan buat PR atau isu dan kami dapat berupaya menambahkan platform Anda ke README.
Selain itu, jika hal berikut ini tidak masuk akal bagi Anda, bukalah sebuah terbitan, mungkin kami dapat melakukan screencast untuk mendemonstrasikan prosesnya, atau mungkin seseorang di luar sana yang ahli dalam hal tersebut akan mengambil alih?
Apa yang saya jelaskan di bawah hanyalah salah satu cara untuk menyiapkan lingkungan pengembangan untuk menjalankan LCBO API di komputer Anda. Jika yang lain memiliki perbaikan (ada ruang bagi banyak orang, skrip titik masuk untuk mem-bootstrap database dev misalnya) atau bahkan pendekatan yang berbeda, seperti menggunakan Vagrant + VirtualBox, membuka terbitan atau PR, saya dengan senang hati menambahkannya.
Jika Anda ingin membantu, saya ingin mengaktifkan Anda.
config/secrets.yml
dan .env
Pertama, Anda perlu menyiapkan beberapa konfigurasi yang tidak disediakan di repositori publik. Alasan mengapa hal ini dilakukan adalah untuk melindungi data pribadi seperti kunci API dan token rahasia, tetapi juga karena beberapa pengembang mungkin lebih memilih pengaturan yang sedikit berbeda untuk preferensi pribadi mereka dan hal-hal seperti itu.
Ada beberapa file yang perlu Anda buat, config/secrets.yml
, dan .env
. Ada versi templat di repo di bawah config/secrets.yml.example
dan .env.example
, Anda dapat menyalin file tersebut untuk memulai:
cp config/secrets.yml.example config/secrets.yml
cp .env.example .env
Jika Anda hanya ingin mem-boot aplikasi dan mengaksesnya secara lokal, Anda sebaiknya melakukannya sekarang. Jika Anda ingin dapat menggunakan crawler dan menyimpannya snapshot ke Amazon S3, Anda harus menambahkan kredensial dan bucket AWS Anda ke config/secrets.yml
.
Pengaturan lainnya hanya penting dalam lingkungan produksi, tidak benar-benar digunakan, atau hanya penting jika Anda tidak menyukai preferensi default. Seperti biasa, jika Anda memerlukan klarifikasi, buka dan terbitkan dan saya dengan senang hati membantu.
Pertama, Anda perlu menginstal klien Docker untuk sistem Anda, Anda dapat mengetahuinya di sini. Setelah Anda menginstal Docker, Anda dapat memulai:
Selanjutnya, Anda perlu membuat wadah:
docker-compose build
Setelah selesai, Anda dapat mem-boot semuanya dengan mengeluarkan:
docker-compose up
Pada titik ini, Anda tidak memiliki data apa pun di database, jadi jika Anda memuat aplikasi, http://localhost:3000, aplikasi tersebut tidak akan berbuat banyak, lagipula aplikasi tersebut menyajikan data, dan tidak ada data di dalamnya. Jadi mari kita lakukan sesuatu mengenai hal itu.
Silakan dan matikan wadahnya:
Ctrl-C
Artinya, tekan tombol Control
+ C
secara bersamaan.
Anda dapat mengunduh arsip dump database produksi terbaru dari akun Amazon S3 pribadi saya di sini. Harap dicatat bahwa ada tabel sensitif (email, pengguna, kunci) dan data tersebut telah dikecualikan dari file ini.
Unduh dan ekstrak arsip di direktori tmp
proyek ini:
cd tmp
curl -O https://heycarsten.s3.amazonaws.com/lcboapi-2019-01-21.tgz
tar xzf lcboapi-2019-01-21.tgz
cd ..
Ukuran filenya sekitar 300MiB, jadi mungkin perlu beberapa saat untuk mengunduhnya tergantung pada kecepatan koneksi Anda (ini terjadi pada baris yang dimulai dengan curl
).
Setelah Anda mengunduh dan mengekstrak file database, Anda dapat memuat data ke dalam database:
docker-compose run --rm app rake db:create
docker-compose run --rm app bash -c 'pv tmp/lcboapi-2019-01-21.sql | psql -q -h db -U $POSTGRES_USER $POSTGRES_DB > /dev/null'
Baris pertama, diakhiri dengan rake db:create
akan membuat skema database di Postgres untuk pengembangan dan pengujian, baris kedua akan memuat dump database ke dalam database pengembangan. Bilah kemajuan menunjukkan berapa banyak data yang telah disalurkan ke database, setelah selesai, indeks akan dibuat. Ini mungkin memerlukan waktu tergantung pada mesin Anda, jumlah datanya cukup banyak. Kemudian Anda dapat menjalankan aplikasinya lagi:
docker-compose up
Anda juga dapat dengan aman menghapus arsip dan mengekstrak file SQL dari direktori tmp
Anda juga pada saat ini.
Jika Anda merasa mengetik
docker-compose
berulang kali membosankan, lihat alias shellAnda dapat menambahkan baris alias ke profil shell Anda seperti
alias dc=docker-compose
dan kemudian Anda cukup mengetikdc
daripada harus mengetikdocker-compose
setiap saat. ✅Pikirkan alias lain yang bisa Anda buat untuk memperbaikinya lebih jauh?
Sekarang, navigasikan ke http://localhost:3000/products/438457
Ledakan. Anda menjalankan LCBO API di komputer Anda! ? ? ?
Ketika Anda selesai mengerjakan aplikasi, cukup tekan Ctrl+C
untuk mematikan semuanya. Lain kali Anda ingin mengerjakannya lagi, jalankan docker-compose up
dan Anda siap melakukannya!
Jika Anda menambahkan permata baru ke Gemfile
, Anda perlu menginstal ulang paket dan memperbarui dependensinya. Docker cukup pandai dalam melakukan hal ini, ia dapat mengetahui kapan Gemfile
berubah, dan ia mengetahui cara membangun kembali wadah app
untuk Anda.
Untuk menjalankan konsol Rails dan memeriksa objek di dalam aplikasi:
docker-compose exec app rails c
Setelah berjalan, Anda dapat melakukan hal-hal seperti:
Ambil produk pertama di database:
Product.first
Temukan toko ritel LCBO #25 (toko lokal saya):
Store.find(25)
Jika Anda mengubah kode di aplikasi, Anda harus memuat reload!
perintah di konsol untuk menyegarkan perubahan.
Di dalam folder spec
, Anda akan menemukan rangkaian pengujian untuk LCBO API. Sayangnya ini tidak komprehensif, tapi juga tidak terlalu buruk. Saya telah berjuang sepanjang karir saya untuk mempertahankan rangkaian pengujian yang saya puas. Kita harus meningkatkan tes ini!
Untuk menjalankan rangkaian pengujian:
docker-compose exec app rspec
Anda akan melihat sekumpulan titik hijau .
, masing-masing mewakili kasus uji yang lulus. Itu bagus. Jika terjadi kegagalan Anda akan melihat F
merah, itu buruk... HANYA BERCANDA! Sebenarnya itu bagus! Pengujian memberi Anda kemampuan untuk mengubah berbagai hal dalam basis kode yang ada dan melihat apakah Anda menyebabkan regresi pada fungsi yang ada. Tentu saja tidak ada yang sempurna, tapi saya dapat memberitahu Anda tanpa keraguan, dari pengalaman, tes itu bagus.
Ketika aplikasi menjadi semakin besar dan semakin kompleks, tidak adanya pengujian menjadi mimpi buruk, sehingga mengubah aplikasi dan menambahkan fitur menjadi proses yang sangat rapuh. Hal-hal seperti menggunakan bahasa dengan sistem tipe dan berbagai paradigma pemrograman lain juga dapat membantu dalam hal ini, tetapi menurut saya tidak ada pengganti untuk setidaknya rangkaian tes penerimaan yang solid.
Ini adalah bagian dari LCBO API yang membuat semuanya menjadi mungkin. Perayap untuk situs web yang rumit sulit dibuat dan dipelihara. Versi pertama LCBO API memiliki rangkaian pengujian lengkap untuk crawler, ketika semuanya berubah beberapa tahun yang lalu saya menyerah pada basis kode itu dan hanya membangun sesuatu secepat yang saya bisa dalam versi ini.
Logika perayap terletak di lib/crawler.rb
, dari sana Anda akan melihat berbagai tugas yang terjadi secara berurutan untuk mencakup perayapan lengkap situs web LCBO.
Logika parser terletak di lib/lcbo.rb
dan semua berbagai file di dalamnya lib/lcbo/*
, ini mencakup semua berbagai permintaan yang perlu dilakukan, dan kode yang bertanggung jawab mengubah data dari permintaan tersebut menjadi data terstruktur yang pada akhirnya bisa masuk ke database.
Saya merancang perayap untuk melakukan permintaan secara serial, ini adalah pendekatan yang sangat baik untuk dilakukan saat Anda merayapi satu situs web. Ini sederhana untuk rute yang selalu merupakan rute terbaik untuk diambil jika Anda bisa, dan itu sopan. Kami dapat menjalankan n pekerjaan AWS Lambda dan meng-crawl setiap halaman di LCBO.com dalam beberapa detik, tapi itu tidak sopan, dan kami mungkin akan melakukan DDoS pada situs web mereka untuk sementara, tidak bagus.
/manager
)Ini mencakup aplikasi Ember, saat Anda mendaftar/masuk ke LCBO API dan membuat kunci API, inilah yang berinteraksi dengan Anda. Sudah ketinggalan jaman, saya belum mencoba membuatnya. Saya telah menggunakan Ember sejak hari pertama jadi jika Anda memiliki pertanyaan tentang ini, buatlah masalah. Saya sebenarnya sangat menikmati mendiskusikan bagian LCBO API ini dan bekerja sama dengan Anda semua untuk memperbaikinya.
/static
) Ini berisi situs Perantara, ketika Anda mengunjungi lcboapi.com inilah yang Anda lihat. Ini juga berisi aplikasi React yang sangat kecil (juga ketinggalan jaman) yang merupakan ikon "Cobalah" di sebelah kanan beranda. Ia memiliki Gemfile sendiri dan skrip pembuatan static/generate
, ketika dijalankan ia akan membangun situs dan menyinkronkan perubahan ke folder public
. Di aplikasi Rails, folder public
disajikan sebagai konten statis.
Ada BANYAK jalan buntu dalam basis kode ini, cabang yang mencapai 40-60-80% dari fitur dan kemudian mengalami stagnasi, eksperimen, dll. Seperti biasa jika Anda menemukan sesuatu yang Anda sukai? cukup ajukan masalah dan saya akan membalasnya sesegera mungkin.
Akan sangat keren juga jika kita dapat mengatasi beberapa jalan buntu di sini, saya akan sangat tertarik untuk akhirnya menambahkan JSON:API dan GraphQL. Desain respons API saat ini berasal dari tahun 2008!!! Di satu sisi, saya agak terkejut karena tidak ada seorang pun yang mengeluh tentang hal itu.
Fitur nomor 1 yang paling banyak diminta sejauh ini yang belum pernah saya implementasikan adalah kategori, semacam itu ada di sini, saya lupa kenapa saya tidak pernah mengirimkannya, saya tidak ingat hal terakhir apa yang harus dilakukan, tapi mungkin itu akan menjadi pilihan pertama yang bagus hal yang harus diatasi? Ada juga Produser, dan Origins yang tidak pernah terselesaikan.
Saya juga memiliki sejumlah repo lain dan eksperimen kecil yang saya buat selama bertahun-tahun, saya selalu terpesona oleh gagasan prediksi tingkat inventaris, di suatu tempat ada alat analisis dump kumpulan data yang ditulis dalam Go untuk menganalisis dump CSV untuk inventaris produk tertentu selama satu set waktu. Saya akan dengan senang hati melepaskan barang itu juga jika ada minat.
Saya akan meninggalkannya di sini untuk saat ini dan saya akan menunggu kabar dari Anda. Saya ingin terus menambah basis pengetahuan ini dengan cara apa pun yang ingin dilihat orang (screencast, wawancara, dokumentasi sebaris, dll.) Saya juga ingin Anda melakukan hal yang sama, jika Anda tidak yakin, tanyakan. ❤️