Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.cocobase.buzz/llms.txt

Use this file to discover all available pages before exploring further.

Python SDK

Complete guide to using Cocobase with Python applications and Cloud Functions.

Installation

pip install cocobase

Quick Start

Initialize Cocobase

from cocobase_client.client import CocoBaseClient

db = CocoBaseClient(
    api_key="YOUR_API_KEY",
    project_id="YOUR_PROJECT_ID",  # required for cloud functions
    base_url="https://api.cocobase.buzz"  # Optional
)

Basic Operations

# List documents
docs = db.list_documents("posts")

# Get single document
doc = db.get_document("posts", "doc-id")

# Create document
created = db.create_document("posts", {
    "title": "My First Post",
    "content": "Hello World!"
})

# Update document
db.update_document("posts", "doc-id", {
    "title": "Updated Title"
})

# Delete document
db.delete_document("posts", "doc-id")

Querying Data

Simple Filters

# Find active users older than 18
query = QueryBuilder().eq("status", "active").gt("age", 18)
users = db.list_documents("users", query=query)

Query Builder

from cocobase_client.query import QueryBuilder

query = (QueryBuilder()
    .eq("status", "active")
    .gt("age", 18)
    .contains("email", "@gmail.com")
    .limit(10))

users = db.list_documents("users", query=query)

Operators Reference

Comparison Operators

OperatorFilter KeyExample
Equalfield{"status": "active"}
Greater Thanfield__gt{"age__gt": 18}
Greater or Equalfield__gte{"age__gte": 18}
Less Thanfield__lt{"age__lt": 65}
Less or Equalfield__lte{"age__lte": 65}
Not Equalfield__ne{"status__ne": "deleted"}

String Operators

OperatorFilter KeyExample
Containsfield__contains{"title__contains": "python"}
Starts Withfield__startswith{"email__startswith": "admin"}
Ends Withfield__endswith{"domain__endswith": ".com"}

Array Operators

OperatorFilter KeyExample
In Arrayfield__in{"status__in": "active,pending"}
Not In Arrayfield__notin{"status__notin": "deleted,archived"}

Sorting and Pagination

Sorting

# Sort by creation date (newest first)
query = QueryBuilder().from_dict({"sort": "createdAt", "order": "desc"})
posts = db.list_documents("posts", query=query)

Pagination

# Get page 3 (20 items per page)
query = QueryBuilder().limit(20).offset(40)
posts = db.list_documents("posts", query=query)

Working with Dataclasses

Define Your Types

from dataclasses import dataclass
from typing import Optional

@dataclass
class Book:
    title: str
    author: str
    price: float
    published_at: Optional[str] = None

    @classmethod
    def from_dict(cls, data: dict) -> "Book":
        return cls(
            title=data["title"],
            author=data["author"],
            price=data["price"],
            published_at=data.get("publishedAt")
        )

    def to_dict(self) -> dict:
        return {
            "title": self.title,
            "author": self.author,
            "price": self.price,
            "publishedAt": self.published_at
        }

Create with Dataclasses

new_book = Book(
    title="Clean Code",
    author="Robert Martin",
    price=45.99
)

created = db.create_document("books", new_book.to_dict())

Parse Response to Dataclass

doc = db.get_document("books", "doc-id")
book = Book.from_dict(doc.data)
print(book.title)

Authentication

Email/Password

# Register
result = db.auth.register(
    "user@example.com",
    "securePassword123",
    {"username": "johndoe"}  # optional extra data
)

# Login
result = db.auth.login("user@example.com", "securePassword123")

# Logout
db.auth.logout()

# Get current user
current_user = db.auth.get_current_user()

# Check authentication
if db.auth.is_authenticated():
    print("Logged in")

OAuth

# Google OAuth
user = db.auth.login_with_google(
    id_token="google-id-token",
    platform="web"  # or "mobile", "ios", "android"
)

# GitHub OAuth
user = db.auth.login_with_github(
    code="github-auth-code",
    redirect_uri="https://yourapp.com/callback",
    platform="web"
)

Advanced Auth

Register with Files

result = db.auth.register_with_files(
    email="john@example.com",
    password="password123",
    data={"username": "johndoe"},
    files={"avatar": avatar_file}
)

Update User

updated_user = db.auth.update_user(
    data={"bio": "Updated bio"},
    email="newemail@example.com"
)

Update User with Files

updated_user = db.auth.update_user_with_files(
    data={"bio": "Updated bio"},
    files={"avatar": new_avatar_file}
)

Two-Factor Authentication (2FA)

# Enable 2FA
db.auth.enable_2fa()

# Disable 2FA
db.auth.disable_2fa()

# Verify 2FA login
user = db.auth.verify_2fa_login(
    email="user@example.com",
    code="123456"
)

Role Checking

if db.auth.has_role("admin"):
    print("User is an admin")

List Users

users = db.auth.list_users({"limit": 10, "offset": 0})

Get User by ID

user = db.auth.get_user_by_id("user-id")

Cloud Functions

The Python SDK is primarily used in Cocobase Cloud Functions.

Basic Cloud Function

def main():
    from cocobase_client.client import CocoBaseClient
    from cocobase_client.query import QueryBuilder

    db = CocoBaseClient()  # Auto-configured in cloud environment

    # Your function logic here
    query = QueryBuilder().limit(10)
    docs = db.list_documents("posts", query=query)

    return {
        "success": True,
        "count": len(docs)
    }

Triggered Cloud Function

def main(event):
    from cocobase_client.client import CocoBaseClient

    db = CocoBaseClient()

    # Access trigger data
    document = event.get("document")
    trigger_type = event.get("type")

    if trigger_type == "created":
        docs = db.list_documents("users")
        db.create_document("logs", {
            "action": "user_created",
            "userId": document.get("id")
        })

    return {"success": True}

Scheduled Cloud Function

def main():
    from cocobase_client.client import CocoBaseClient
    from cocobase_client.query import QueryBuilder
    from datetime import datetime, timedelta

    db = CocoBaseClient()

    # Clean up old documents
    cutoff = (datetime.now() - timedelta(days=30)).isoformat()

    query = QueryBuilder().from_dict({"createdAt__lt": cutoff}).limit(100)
    old_docs = db.list_documents("logs", query=query)

    for doc in old_docs:
        db.delete_document("logs", doc.id)

    return {
        "success": True,
        "deleted": len(old_docs)
    }

Error Handling

from cocobase_client.exceptions import CocobaseError

try:
    doc = db.get_document("posts", "non-existent-id")
except CocobaseError as e:
    print(f"Error: {e}")

Best Practices

1. Use Dataclasses for Type Safety

# Good
@dataclass
class Post:
    title: str
    content: str

post = Post.from_dict(doc.data)
print(post.title)

# Avoid
print(doc.data["title"])

2. Always Handle Errors

try:
    doc = db.get_document("posts", post_id)
    return doc
except CocobaseError as e:
    logger.error(f"Failed to get post: {e}")
    raise

3. Use Environment Variables

import os

db = CocoBaseClient(
    api_key=os.environ.get("COCOBASE_API_KEY")
)

4. Always Set Limits

from cocobase_client.query import QueryBuilder

# Good
query = QueryBuilder().limit(20)
docs = db.list_documents("posts", query=query)

# Bad - could return thousands
docs = db.list_documents("posts")

Next Steps