"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > إنشاء أداة تنزيل Google Drive في Golang (الجزء الأول)

إنشاء أداة تنزيل Google Drive في Golang (الجزء الأول)

تم النشر بتاريخ 2024-11-08
تصفح:486

Building a Google Drive Downloader in Golang (Part 1)

مقدمة

في هذا البرنامج التعليمي، سنقوم بإنشاء أداة تنزيل قوية تسمح بتنزيل الملفات من Google Drive وموفري الخدمات السحابية الآخرين. باستخدام أنماط التزامن الفعالة في Golang، ستتمكن من إدارة التنزيلات المتعددة بشكل متزامن، ودفق الملفات الكبيرة، وتتبع التقدم في الوقت الفعلي. سواء كنت تقوم بتنزيل بعض الملفات الصغيرة أو التعامل مع مجموعات كبيرة من البيانات، سيعرض هذا المشروع كيفية إنشاء أداة تنزيل قوية وقابلة للتطوير ويمكن توسيعها بسهولة لدعم منصات سحابية متعددة.

إذا كنت تبحث عن طريقة لتبسيط عملية تنزيل الملفات الكبيرة وأتمتتها، فهذا البرنامج التعليمي مثالي لك. وفي النهاية، سيكون لديك برنامج تنزيل مرن وقابل للتخصيص يستند إلى Go ليناسب احتياجاتك.

في عجلة من امرنا؟

إذا كنت تتطلع فقط إلى استخدام برنامج التنزيل هذا مع واجهة مستخدم، فتفضل بزيارة موقع Evolvesdev.com لقراءة المقال كاملاً والذهاب إلى Github الخاص ببرنامج التنزيل. ستجد المستندات لتشغيله بسرعة.

ما ستتعلمه

  • أنماط التزامن Go:
    تعرف على كيفية استخدام Goroutines والقنوات وكائنات المزامنة للتعامل مع تنزيلات الملفات المتزامنة المتعددة بكفاءة.

  • تنزيلات كبيرة الحجم:
    اكتشف كيفية دفق الملفات الكبيرة مع إدارة الذاكرة وموارد النظام بفعالية.

  • تنزيلات الملفات المتزامنة:
    فهم كيفية تنزيل الملفات بشكل متزامن، مما يؤدي إلى تسريع العملية وتحسين الأداء.

  • تحديثات التقدم في الوقت الفعلي:
    قم بتنفيذ تتبع التقدم لتقديم تعليقات في الوقت الفعلي حول حالة التنزيل.

  • التعامل مع الانقطاعات والإلغاءات:
    تعرف على كيفية إلغاء تنزيل واحد أو كل التنزيلات الجارية بأمان.

ملاحظة: سيركز هذا البرنامج التعليمي فقط على منطق التنزيل الأساسي.

إعداد البيئة

أولاً قبل القيام بأي شيء، تأكد من إعداد بيئتك بشكل صحيح لتجنب الأخطاء المحتملة في المستقبل.

المتطلبات الأساسية

  • تثبيت Go
  • AIR لإعادة التحميل التلقائي
  • إنشاء ملف لتشغيل الأوامر المعقدة
  • Goose لعمليات ترحيل PostgreSQL

تكوين ملف Makefile

قم بإنشاء ملف تعريفي في جذر المشروع بما يلي.

# Load environment variables from .env file
include ./.env

# To run the application
run: build
    @./bin/go-downloader

# Build the application
build:
    @go build -tags '!dev' -o bin/go-downloader

# Database migration status
db-status:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) status

# Run database migrations
up:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) up

# Roll back the last database migration
down:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) down

# Reset database migrations
reset:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) reset

نظرة عامة على بنية المجلدات عالية المستوى

go-downloader/
├── api
├── config
├── migrations
├── service
├── setting
├── store
├── types
├── util
├── .env
├── .air.toml
├── Makefile
├── go.mod
├── go.sum
└── main.go

ضبط متغيرات البيئة

قم بإنشاء ملف .env في الجذر أو تعامل مع متغيرات البيئة كيفما تشاء، سنستخدم حزمة joho/godotenv.

GOOGLE_CLIENT_ID
GOOGLE_CLIENT_SECRET
SESSION_SECRET=something-super-secret
APP_URL=http://localhost:3000
POSTGRES_USER
POSTGRES_PASSWORD
POSTGRES_DB

إنشاء خادم ويب

سنبدأ الآن في إنشاء خادم الويب الذي سيتعامل مع جميع الطلبات الواردة.

تنبيه! يبدأ الجزء الرئيسي من هذا الدليل هنا. استعد للتعمق!

طبقة واجهة برمجة التطبيقات

للبدء، قم بإنشاء الملفات التالية داخل مجلد api api.go وroute.go

إعداد ملف Route.go

جميع سيتم تعريف مسارات واجهة برمجة التطبيقات في هذا هنا. قمنا بإنشاء بنية NewRouter التي تأخذ تكوين env، مما يسمح لجميع المسارات والمعالجات بالوصول إلى متغيرات البيئة.

package api

import (
    "github.com/gofiber/fiber/v2"
    "github.com/nilotpaul/go-downloader/config"
)

type Router struct {
    env       config.EnvConfig
}

func NewRouter(env config.EnvConfig) *Router {
    return &Router{
        env:      env,
    }
}

func (h *Router) RegisterRoutes(r fiber.Router) {
    r.Get("/healthcheck", func(c *fiber.Ctx) error {
        return c.JSON("OK")
    })
}

إعداد ملف api.go

هنا، سنضيف جميع البرامج الوسيطة الضرورية، مثل CORS والتسجيل، قبل بدء تشغيل الخادم.

type APIServer struct {
    listenAddr string
    env        config.EnvConfig
}

func NewAPIServer(listenAddr string, env config.EnvConfig) *APIServer {
    return &APIServer{
        listenAddr: listenAddr,
        env:        env,
    }
}

func (s *APIServer) Start() error {
    app := fiber.New(fiber.Config{
        AppName:      "Go Downloader",
    })

    handler := NewRouter()
    handler.RegisterRoutes(app)

    log.Printf("Server started on http://localhost:%s", s.listenAddr)

    return app.Listen(":"   s.listenAddr)
}

نقطة الدخول الرئيسية

هذه هي الحزمة الرئيسية في ملف main.go والتي ستكون بمثابة نقطة دخول إلى الكل.

func main() {
    // Loads all Env vars from .env file.
    env := config.MustLoadEnv()

    log.Fatal(s.Start())
}

هذا يكفي لبدء تشغيل الخادم واختباره.

ابدأ الخادم

air

هذا كل شيء.؟

اختبار

curl http://localhost:3000/healthcheck

يجب أن تكون الاستجابة جيدة مع الحالة 200

إنشاء متجر موفر

نحن بحاجة إلى تنفيذ حل قابل للتطوير لإضافة الدعم لموفري الخدمات السحابية المتعددين إذا لزم الأمر.

العمل على سجل المزود

// Better to keep it in a seperate folder.
// Specific only to OAuth Providers.
type OAuthProvider interface {
    Authenticate(string) error
    GetAccessToken() string
    GetRefreshToken() string
    RefreshToken(*fiber.Ctx, string, bool) (*oauth2.Token, error)
    IsTokenValid() bool
    GetAuthURL(state string) string
    CreateOrUpdateAccount() (string, error)
    CreateSession(c *fiber.Ctx, userID string) error
    UpdateTokens(*GoogleAccount) error
}

type ProviderRegistry struct {
    Providers map[string]OAuthProvider
}

func NewProviderRegistry() *ProviderRegistry {
    return &ProviderRegistry{
        Providers: make(map[string]OAuthProvider),
    }
}

func (r *ProviderRegistry) Register(providerName string, p OAuthProvider) {
    r.Providers[providerName] = p
}

func (r *ProviderRegistry) GetProvider(providerName string) (OAuthProvider, error) {
    p, exists := r.Providers[providerName]
    if !exists {
        return nil, fmt.Errorf("Provider not found")
    }

    return p, nil
}

يعمل ProviderRegistry كخريطة مركزية لاستيعاب جميع موفري OAuth. عندما نقوم بتهيئة مقدمي الخدمات لدينا، سنقوم بتسجيلهم في هذه الخريطة. يتيح لنا ذلك الوصول بسهولة إلى وظائف أي مزود مسجل عبر خدمتنا.

سترى هذا الإجراء لاحقًا.

تهيئة مخزن الموفر

سنقوم بتسجيل مقدمي الخدمة لدينا بناءً على متغيرات البيئة المتوفرة.

func InitStore(env config.EnvConfig) *ProviderRegistry {
    r := NewProviderRegistry()

    if len(env.GoogleClientSecret) != 0 || len(env.GoogleClientID) != 0 {
        googleProvider := NewGoogleProvider(googleProviderConfig{
            googleClientID:     env.GoogleClientID,
            googleClientSecret: env.GoogleClientSecret,
            googleRedirectURL:  env.AppURL   "/callback/google",
        }, env)

        r.Register("google", googleProvider)
    }

    return r
}

اقرأ المقال كاملا هنا.

التفاف

لقد وضعنا الأساس لبرنامج Google Drive Downloader في Go، والذي يغطي المكونات الرئيسية مثل إعداد هيكل المشروع، والتعامل مع Google OAuth، ووضع الأساس للتوسع المستقبلي. على طول الطريق، تطرقنا إلى بعض المواضيع الهامة:

  • عمليات ترحيل قاعدة البيانات مع Goose لضمان إدارة البيانات بشكل سلس وقابل للتطوير.
  • إنشاء سجل موفري الخدمات لتوسيع الدعم بسهولة لموفري خدمات التخزين السحابي الإضافيين في المستقبل.
  • تصميم بنية مرنة تجعل من السهل التعامل مع المنطق الأكثر تعقيدًا في المستقبل.

هذا أكثر من كافٍ لمنشور واحد، حيث كانت الأمور تطول جدًا! سنعود في الجزء الثاني لإنهاء عملنا، حيث سنعمل على وظيفة التنزيل الرئيسية.

حتى ذلك الحين، لا تتردد في استكشاف التنفيذ الحالي في GitHub الخاص بي وترقب الخطوات التالية. تحميل سعيد!

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/evolvedev/building-a-google-drive-downloader-in-golang-part-1-3fmk?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3