21 पॉइंट द्वारा xguru 2025-07-14 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • केवल Go standard library के साथ, 1,000 लाइनों से कम कोड में बनाया गया अत्यंत छोटा BaaS(Backend-as-a-Service)
  • Firebase/Supabase/Pocketbase जैसे मुख्य बैकएंड फ़ीचर्स को लोकल फ़ाइल आधारित रूप में प्रदान करता है
    • versioned records वाले CSV का उपयोग करने वाला फ़ाइल-आधारित डेटा स्टोरेज
    • JSON लौटाने वाला REST API
    • session cookie और Basic Auth आधारित प्रमाणीकरण
    • RBAC और owner-आधारित permission system का समर्थन
    • schema validation
    • Go template आधारित template rendering

यह कैसे काम करता है

  • डेटा स्टोरेज

    • सभी डेटा को human-readable CSV फ़ाइलों में, हर row में एक record के रूप में स्टोर किया जाता है
    • पहला column record ID और दूसरा column version number के लिए तय है
    • स्टोरेज तरीका append-only है, यानी मौजूदा record को overwrite नहीं किया जाता; हर update पर हमेशा नई version row जोड़ी जाती है
    • read operation के समय हमेशा record का सबसे नया version ही उपयोग किया जाता है
    • तेज़ lookup और update के लिए, हर resource के latest version records के file offset की memory index बनाए रखी जाती है
      s1,1,_permissions,_id,text,,,^.+$  
      s2,1,_permissions,_v,number,1,,  
      s3,1,_permissions,resource,text,,,^.+$  
      s4,1,_permissions,action,text,,,^.+$  
      s5,1,_permissions,field,text,,,^.*$  
      s6,1,_permissions,role,text,,,^.*$  
      s7,1,_users,_id,text,,,^.+$  
      s8,1,_users,_v,number,1,,  
      s9,1,_users,salt,text,,,  
      s10,1,_users,password,text,,,^.+$  
      s11,1,_users,roles,list,,,  
      s12,1,todo,_id,text,,,^.+$  
      s13,1,todo,_v,number,1,,  
      s14,1,todo,description,text,0,0,".+"  
      s15,1,todo,completed,number,0,1,""  
      
  • यूज़र और permission management

    • user authentication जानकारी और role सूची _users.csv फ़ाइल में स्टोर की जाती है
      admin,1,salt,5V5R4S...====,"admin"  
      alice,1,salt,PXHQWN...====,  
      
    • संरचना सभी resources जैसी ही CSV है, लेकिन collection name _users है
    • API के जरिए user creation संभव नहीं है; फ़ाइल को सीधे edit करना ज़रूरी है
  • permission management

    • resource-वार access control rules को _permissions.csv में define किया जाता है
      p1,1,todo,read,,*,"कोई भी authenticated user ToDo पढ़ सकता है"  
      p2,1,todo,create,,*,"कोई भी authenticated user नया ToDo जोड़ सकता है"  
      p3,1,todo,update,owner,"admin,editor","admin/editor ToDo अपडेट कर सकते हैं"  
      p4,1,todo,delete,owner,"admin,editor","admin/editor ToDo हटा सकते हैं"  
      
    • हर row एक permission rule को दर्शाती है

REST API

  • _schemas.csv में define किए गए resources (collections) के आधार पर REST API अपने-आप उपलब्ध कराया जाता है
  • GET /api/{resource}?sort_by={field} : उस resource के सभी records प्राप्त करें, sorting संभव है
  • GET /api/{resource}/{id} : किसी विशेष ID वाला एकल record प्राप्त करें
  • POST /api/{resource} : नया record बनाएँ, "create" permission आवश्यक
  • PUT /api/{resource}/{id} : मौजूदा record संशोधित करें, "update" permission आवश्यक
  • DELETE /api/{resource}/{id} : विशेष record हटाएँ, "delete" permission आवश्यक
  • GET /api/events/{resource} : उस resource के server-side events (SSE) real-time stream को subscribe करें, "read" permission आवश्यक
  • प्रमाणीकरण तरीका

    • API request authentication के लिए Basic Auth या session cookie समर्थित है
    • session cookie बनाना:
      • POST /api/login पर body में username और password भेजकर request करें
      • response में session cookie शामिल होगी, जिससे बाद की requests अपने-आप authenticate होंगी
    • logout:
      • /api/logout कॉल करने पर session invalid हो जाता है और cookie हट जाती है

static files और templates

  • static directory में मौजूद HTML, CSS, JavaScript जैसी static files को सीधे serve किया जा सकता है
  • इसके अलावा, Go के html/template package का उपयोग करके HTML template rendering भी समर्थित है
    • template files templates directory में होती हैं, और URL से access करने पर अपने-आप render होती हैं
  • template में उपयोग किए जा सकने वाले data और functions
    • .User: वर्तमान authenticated user की जानकारी (authenticate न होने पर nil)
    • .Store: Pennybase का store instance (resource lookup और listing में उपयोग)
    • .Request: वर्तमान HTTP request object
    • .ID: जिस resource ID को access किया जा रहा है (यदि लागू हो)
    • .Authorize: किसी विशेष resource पर action permission जाँचने वाला function

hooks फ़ीचर

  • एक single hook function के जरिए behavior को extend किया जा सकता है
  • hook function सभी resources के create, update, delete operations पर अपने-आप कॉल होती है
  • काम करने का सिद्धांत

    • hook function नीचे दिए गए चार arguments के साथ काम करती है:
      • trigger: action का प्रकार (जैसे create, update, delete)
      • resource: जिस resource पर काम हो रहा है उसका नाम
      • user: request करने वाले user की जानकारी
      • res: बदला जा रहा resource data
    • hooking point पर अतिरिक्त validation या data modification किया जा सकता है
      • उदाहरण के तौर पर, message resource बनाते समय author और creation time अपने-आप भरे जा सकते हैं
      • hook function अगर error return करती है, तो वह action तुरंत रुक जाता है और client को error response भेजा जाता है
      • इसका उपयोग अतिरिक्त permission checks, data auto-correction, external event triggers जैसे विभिन्न custom logic लागू करने में किया जा सकता है

सीमाएँ और ध्यान देने योग्य बातें

  • सभी user/permission/schema management के लिए CSV फ़ाइलों को सीधे edit करना आवश्यक है
  • बड़े डेटा, जटिल permission branching, या high-performance distributed environments के लिए उपयुक्त नहीं
  • बिना किसी external library के, केवल standard Go code पर चलता है (सीखने/सरल उपयोग के लिए)
  • MIT license, source code और structure का स्वतंत्र रूप से उपयोग किया जा सकता है
  • contributions का स्वागत है, लेकिन code simplicity/clarity बनाए रखना ज़रूरी है। आगे नए features जोड़ने से अधिक bug fixes पर ध्यान रखा जाएगा

1 टिप्पणियां

 
nemorize 2025-07-14

वाह...