Compare commits
16 Commits
nominatim_
...
master
Author | SHA1 | Date |
---|---|---|
|
deaf1d9838 | 4 hours ago |
|
4ec91bc1d8 | 4 days ago |
|
9c41e925d2 | 4 days ago |
|
c1c65cdc87 | 4 days ago |
|
ef749702c0 | 4 days ago |
|
37dc2913d8 | 7 days ago |
|
455b8b1071 | 7 days ago |
![]() |
d9d08ae4c0 | 1 week ago |
![]() |
402411f7b9 | 1 week ago |
|
2b37533d9d | 2 weeks ago |
|
dc3e7544b4 | 2 weeks ago |
|
2bd8ffd591 | 2 weeks ago |
|
597cef0c22 | 2 weeks ago |
|
5b4615da67 | 2 weeks ago |
|
868b09f7ef | 2 weeks ago |
|
8a161cb2c7 | 2 weeks ago |
@ -1,3 +1,3 @@
|
|||||||
from .FriendAddDTO import FriendAddDTO
|
from .FriendAddDTO import FriendAddDTO
|
||||||
from .user import UserDTO, UserRegisterDTO
|
from .user import UserDTO, UserRegisterDTO, UserAdminDTO
|
||||||
from .pin import PinDTO, PinShareDTO
|
from .pin import PinDTO, PinShareDTO
|
@ -0,0 +1,16 @@
|
|||||||
|
from pydantic import BaseModel
|
||||||
|
from typing import List
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
class SystemConfig(BaseModel):
|
||||||
|
max_image_size: int # en octets
|
||||||
|
max_images_per_pin: int
|
||||||
|
max_images_per_user: int
|
||||||
|
allowed_image_types: List[str] # types MIME
|
||||||
|
max_pins_per_user: int
|
||||||
|
max_friends_per_user: int
|
||||||
|
|
||||||
|
class DBConfig(BaseModel):
|
||||||
|
config: SystemConfig
|
||||||
|
updated_at: datetime
|
||||||
|
updated_by: str # ID de l'utilisateur qui a fait la dernière modification
|
@ -1,13 +1,28 @@
|
|||||||
from typing import Optional, List
|
from typing import Optional, List
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel, Field, field_validator
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
class Pin(BaseModel):
|
class Pin(BaseModel):
|
||||||
id: Optional[str]
|
id: Optional[str]
|
||||||
title: str
|
title: str = Field(..., min_length=3)
|
||||||
description: str
|
description: str = Field(..., min_length=3)
|
||||||
location: list
|
location: list = Field(..., min_items=2)
|
||||||
complete_address: str
|
complete_address: str = Field(..., min_length=3)
|
||||||
files: Optional[List[str]] = [] # Liste des IDs d'images
|
files: Optional[List[str]] = [] # Liste des IDs d'images
|
||||||
user_id: str
|
is_poi: bool = False
|
||||||
date: Optional[datetime] = None
|
user_id: Optional[str] = None
|
||||||
|
date: Optional[datetime] = None
|
||||||
|
|
||||||
|
@field_validator('location')
|
||||||
|
@classmethod
|
||||||
|
def validate_location(cls, v):
|
||||||
|
if not v or len(v) == 0:
|
||||||
|
raise ValueError('La location ne peut pas être vide')
|
||||||
|
return v
|
||||||
|
|
||||||
|
@field_validator('user_id')
|
||||||
|
@classmethod
|
||||||
|
def validate_user_id(cls, v, info):
|
||||||
|
if not info.data.get('is_poi') and not v:
|
||||||
|
raise ValueError('user_id est requis lorsque is_poi est False')
|
||||||
|
return v
|
@ -0,0 +1,233 @@
|
|||||||
|
from fastapi import APIRouter, HTTPException, status, Depends
|
||||||
|
from bson import ObjectId
|
||||||
|
import pymongo
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
import app.config as config
|
||||||
|
from app.models import User, HTTPError
|
||||||
|
from app.models.config import SystemConfig, DBConfig
|
||||||
|
from app.routes.auth import users_collection
|
||||||
|
from app.routes.utils import get_admin_user
|
||||||
|
from app.dto import UserAdminDTO
|
||||||
|
|
||||||
|
# Database setup
|
||||||
|
client = pymongo.MongoClient(config.MONGODB_URL, username=config.MONGODB_USERNAME, password=config.MONGODB_PASSWORD)
|
||||||
|
db = client[config.MONGODB_DATABASE]
|
||||||
|
|
||||||
|
pins_collection = db["pins"]
|
||||||
|
images_collection = db["images"]
|
||||||
|
friends_collection = db["friends"]
|
||||||
|
pin_permissions_collection = db["pin_permissions"]
|
||||||
|
config_collection = db["config"]
|
||||||
|
|
||||||
|
admin_router = APIRouter(
|
||||||
|
prefix="/admin",
|
||||||
|
tags=["Admin"]
|
||||||
|
)
|
||||||
|
|
||||||
|
def serialize_mongo_doc(doc):
|
||||||
|
"""Convertit un document MongoDB en dictionnaire sérialisable"""
|
||||||
|
if doc is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
result = {}
|
||||||
|
for key, value in doc.items():
|
||||||
|
if isinstance(value, ObjectId):
|
||||||
|
result[key] = str(value)
|
||||||
|
elif isinstance(value, dict):
|
||||||
|
result[key] = serialize_mongo_doc(value)
|
||||||
|
elif isinstance(value, list):
|
||||||
|
result[key] = [serialize_mongo_doc(item) if isinstance(item, dict) else str(item) if isinstance(item, ObjectId) else item for item in value]
|
||||||
|
else:
|
||||||
|
result[key] = value
|
||||||
|
return result
|
||||||
|
|
||||||
|
def load_config():
|
||||||
|
"""Charge la configuration depuis la base de données ou utilise les valeurs par défaut"""
|
||||||
|
db_config = config_collection.find_one({"_id": "system_config"})
|
||||||
|
|
||||||
|
if db_config:
|
||||||
|
# Mettre à jour les variables de configuration
|
||||||
|
config.MAX_IMAGE_SIZE = db_config["config"]["max_image_size"]
|
||||||
|
config.MAX_IMAGES_PER_PIN = db_config["config"]["max_images_per_pin"]
|
||||||
|
config.MAX_IMAGES_PER_USER = db_config["config"]["max_images_per_user"]
|
||||||
|
config.ALLOWED_MIME_TYPES = db_config["config"]["allowed_image_types"]
|
||||||
|
config.MAX_PINS_PER_USER = db_config["config"]["max_pins_per_user"]
|
||||||
|
config.MAX_FRIENDS_PER_USER = db_config["config"]["max_friends_per_user"]
|
||||||
|
else:
|
||||||
|
# Créer la configuration par défaut dans la base de données
|
||||||
|
default_config = DBConfig(
|
||||||
|
config=SystemConfig(**config.DEFAULT_CONFIG),
|
||||||
|
updated_at=datetime.now(),
|
||||||
|
updated_by="system"
|
||||||
|
)
|
||||||
|
config_collection.insert_one({
|
||||||
|
"_id": "system_config",
|
||||||
|
**default_config.model_dump()
|
||||||
|
})
|
||||||
|
|
||||||
|
# Charger la configuration au démarrage
|
||||||
|
load_config()
|
||||||
|
|
||||||
|
@admin_router.get(
|
||||||
|
path="/stats",
|
||||||
|
responses={401: {"model": HTTPError}, 403: {"model": HTTPError}}
|
||||||
|
)
|
||||||
|
async def get_stats(admin_user: User = Depends(get_admin_user)):
|
||||||
|
# Statistiques générales
|
||||||
|
total_users = users_collection.count_documents({})
|
||||||
|
total_pins = pins_collection.count_documents({})
|
||||||
|
total_images = images_collection.count_documents({})
|
||||||
|
total_friends = friends_collection.count_documents({"status": "accepted"})
|
||||||
|
|
||||||
|
# Statistiques des 30 derniers jours
|
||||||
|
thirty_days_ago = datetime.now() - timedelta(days=30)
|
||||||
|
new_users = users_collection.count_documents({
|
||||||
|
"created_at": {"$gte": thirty_days_ago}
|
||||||
|
})
|
||||||
|
new_pins = pins_collection.count_documents({
|
||||||
|
"created_at": {"$gte": thirty_days_ago}
|
||||||
|
})
|
||||||
|
new_images = images_collection.count_documents({
|
||||||
|
"metadata.created_at": {"$gte": thirty_days_ago.isoformat()}
|
||||||
|
})
|
||||||
|
|
||||||
|
# Top utilisateurs
|
||||||
|
top_users = list(users_collection.aggregate([
|
||||||
|
{"$lookup": {
|
||||||
|
"from": "pins",
|
||||||
|
"let": { "user_id": { "$toString": "$_id" } },
|
||||||
|
"pipeline": [
|
||||||
|
{ "$match": { "$expr": { "$eq": ["$user_id", "$$user_id"] } } }
|
||||||
|
],
|
||||||
|
"as": "pins"
|
||||||
|
}},
|
||||||
|
{"$project": {
|
||||||
|
"username": 1,
|
||||||
|
"pin_count": {"$size": "$pins"}
|
||||||
|
}},
|
||||||
|
{"$sort": {"pin_count": -1}},
|
||||||
|
{"$limit": 5}
|
||||||
|
]))
|
||||||
|
|
||||||
|
# Top pins (les plus partagés)
|
||||||
|
top_pins = list(pin_permissions_collection.aggregate([
|
||||||
|
{"$group": {
|
||||||
|
"_id": "$pin_id",
|
||||||
|
"share_count": {"$sum": 1}
|
||||||
|
}},
|
||||||
|
{"$sort": {"share_count": -1}},
|
||||||
|
{"$limit": 5},
|
||||||
|
{"$lookup": {
|
||||||
|
"from": "pins",
|
||||||
|
"localField": "_id",
|
||||||
|
"foreignField": "_id",
|
||||||
|
"as": "pin_info"
|
||||||
|
}},
|
||||||
|
{"$unwind": "$pin_info"},
|
||||||
|
{"$project": {
|
||||||
|
"pin_id": "$_id",
|
||||||
|
"share_count": 1,
|
||||||
|
"title": "$pin_info.title"
|
||||||
|
}}
|
||||||
|
]))
|
||||||
|
|
||||||
|
# Statistiques de stockage
|
||||||
|
total_storage = sum(
|
||||||
|
image["metadata"]["size"]
|
||||||
|
for image in images_collection.find({}, {"metadata.size": 1})
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"general": {
|
||||||
|
"total_users": total_users,
|
||||||
|
"total_pins": total_pins,
|
||||||
|
"total_images": total_images,
|
||||||
|
"total_friends": total_friends,
|
||||||
|
"total_storage_bytes": total_storage
|
||||||
|
},
|
||||||
|
"last_30_days": {
|
||||||
|
"new_users": new_users,
|
||||||
|
"new_pins": new_pins,
|
||||||
|
"new_images": new_images
|
||||||
|
},
|
||||||
|
"top_users": [serialize_mongo_doc(user) for user in top_users],
|
||||||
|
"top_shared_pins": [serialize_mongo_doc(pin) for pin in top_pins]
|
||||||
|
}
|
||||||
|
|
||||||
|
@admin_router.get(
|
||||||
|
path="/config",
|
||||||
|
response_model=SystemConfig,
|
||||||
|
responses={401: {"model": HTTPError}, 403: {"model": HTTPError}}
|
||||||
|
)
|
||||||
|
async def get_config(admin_user: User = Depends(get_admin_user)):
|
||||||
|
db_config = config_collection.find_one({"_id": "system_config"})
|
||||||
|
if not db_config:
|
||||||
|
return SystemConfig(**config.DEFAULT_CONFIG)
|
||||||
|
return SystemConfig(**db_config["config"])
|
||||||
|
|
||||||
|
@admin_router.patch(
|
||||||
|
path="/config",
|
||||||
|
response_model=SystemConfig,
|
||||||
|
responses={401: {"model": HTTPError}, 403: {"model": HTTPError}}
|
||||||
|
)
|
||||||
|
async def update_config(
|
||||||
|
new_config: SystemConfig,
|
||||||
|
admin_user: User = Depends(get_admin_user)
|
||||||
|
):
|
||||||
|
# Mettre à jour la configuration en base de données
|
||||||
|
db_config = DBConfig(
|
||||||
|
config=new_config,
|
||||||
|
updated_at=datetime.now(),
|
||||||
|
updated_by=admin_user.uid
|
||||||
|
)
|
||||||
|
|
||||||
|
config_collection.update_one(
|
||||||
|
{"_id": "system_config"},
|
||||||
|
{"$set": db_config.model_dump()},
|
||||||
|
upsert=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# Mettre à jour les variables de configuration
|
||||||
|
config.MAX_IMAGE_SIZE = new_config.max_image_size
|
||||||
|
config.MAX_IMAGES_PER_PIN = new_config.max_images_per_pin
|
||||||
|
config.MAX_IMAGES_PER_USER = new_config.max_images_per_user
|
||||||
|
config.ALLOWED_MIME_TYPES = new_config.allowed_image_types
|
||||||
|
config.MAX_PINS_PER_USER = new_config.max_pins_per_user
|
||||||
|
config.MAX_FRIENDS_PER_USER = new_config.max_friends_per_user
|
||||||
|
|
||||||
|
return new_config
|
||||||
|
|
||||||
|
@admin_router.get(
|
||||||
|
path="/users",
|
||||||
|
responses={401: {"model": HTTPError}, 403: {"model": HTTPError}},
|
||||||
|
response_model=list[UserAdminDTO]
|
||||||
|
)
|
||||||
|
async def list_users(admin_user: User = Depends(get_admin_user)):
|
||||||
|
"""Liste tous les utilisateurs (sans le mot de passe) - Route admin uniquement"""
|
||||||
|
users = users_collection.find({}, {"password": 0}) # Exclure le mot de passe
|
||||||
|
users_list = []
|
||||||
|
|
||||||
|
for user in users:
|
||||||
|
user["uid"] = str(user["_id"])
|
||||||
|
user = UserAdminDTO(**user)
|
||||||
|
users_list.append(user)
|
||||||
|
|
||||||
|
return users_list
|
||||||
|
|
||||||
|
@admin_router.delete(
|
||||||
|
path="/user/{uid}",
|
||||||
|
responses={401: {"model": HTTPError}, 403: {"model": HTTPError}, 404: {"model": HTTPError}, 400: {"model": HTTPError}}
|
||||||
|
)
|
||||||
|
async def delete_user(uid: str, admin_user: User = Depends(get_admin_user)):
|
||||||
|
try:
|
||||||
|
ObjectId(uid)
|
||||||
|
except:
|
||||||
|
raise HTTPException(status_code=400, detail="UID invalide")
|
||||||
|
|
||||||
|
user = users_collection.find_one({"_id": ObjectId(uid)})
|
||||||
|
if not user:
|
||||||
|
raise HTTPException(status_code=404, detail="Utilisateur non trouvé")
|
||||||
|
users_collection.delete_one({"_id": ObjectId(uid)})
|
||||||
|
|
||||||
|
return {"message": "Utilisateur supprimé avec succès"}
|
After Width: | Height: | Size: 263 KiB |
After Width: | Height: | Size: 127 KiB |
After Width: | Height: | Size: 162 KiB |
After Width: | Height: | Size: 175 KiB |
After Width: | Height: | Size: 381 KiB |
After Width: | Height: | Size: 361 B |
After Width: | Height: | Size: 177 KiB |
After Width: | Height: | Size: 265 KiB |
After Width: | Height: | Size: 201 KiB |
After Width: | Height: | Size: 198 KiB |
After Width: | Height: | Size: 215 KiB |
After Width: | Height: | Size: 230 KiB |
After Width: | Height: | Size: 334 KiB |
After Width: | Height: | Size: 311 KiB |
After Width: | Height: | Size: 149 KiB |
After Width: | Height: | Size: 537 KiB |
After Width: | Height: | Size: 245 KiB |
After Width: | Height: | Size: 360 B |
After Width: | Height: | Size: 361 B |
After Width: | Height: | Size: 142 KiB |
After Width: | Height: | Size: 614 KiB |
After Width: | Height: | Size: 277 KiB |
After Width: | Height: | Size: 610 KiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 319 KiB |
After Width: | Height: | Size: 280 KiB |
After Width: | Height: | Size: 290 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 358 KiB |
After Width: | Height: | Size: 361 B |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 208 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 144 KiB |
After Width: | Height: | Size: 770 KiB |
After Width: | Height: | Size: 182 KiB |
After Width: | Height: | Size: 325 KiB |
After Width: | Height: | Size: 213 KiB |
After Width: | Height: | Size: 216 KiB |
After Width: | Height: | Size: 256 KiB |
After Width: | Height: | Size: 465 KiB |
After Width: | Height: | Size: 176 KiB |
After Width: | Height: | Size: 213 KiB |
After Width: | Height: | Size: 179 KiB |
After Width: | Height: | Size: 357 KiB |
After Width: | Height: | Size: 120 KiB |
After Width: | Height: | Size: 546 KiB |
After Width: | Height: | Size: 143 KiB |
After Width: | Height: | Size: 252 KiB |
After Width: | Height: | Size: 418 KiB |
After Width: | Height: | Size: 373 KiB |
After Width: | Height: | Size: 206 KiB |
After Width: | Height: | Size: 230 KiB |
@ -0,0 +1,736 @@
|
|||||||
|
[{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f38f80cc1ed56dac3f5f"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f38f80cc1ed56dac3f60"
|
||||||
|
},
|
||||||
|
"image_hash": "01b636ab8a23d741fed4a15181b7beecad103ef8e89e52eed6c7b6e5901bb2be",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:44:15.783516",
|
||||||
|
"original_filename": "IMG_4501.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 358243
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f3a080cc1ed56dac3f61"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f38f80cc1ed56dac3f60"
|
||||||
|
},
|
||||||
|
"image_hash": "a53711c28ceafba135b0ee9bcbd094fc9b7bdf8758f8eaae933fa03c423efe56",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:44:32.070129",
|
||||||
|
"original_filename": "IMG_4504.gif",
|
||||||
|
"mime_type": "image/gif",
|
||||||
|
"size": 45370
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f48d80cc1ed56dac3f68"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f48d80cc1ed56dac3f6a"
|
||||||
|
},
|
||||||
|
"image_hash": "1671dccceecc787377bccc566ecaa51f46a2dbace03419dfebcb969d4f9b2927",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:48:29.590597",
|
||||||
|
"original_filename": "IMG_1692.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 240574
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f48d80cc1ed56dac3f69"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f48d80cc1ed56dac3f6a"
|
||||||
|
},
|
||||||
|
"image_hash": "fc5925a334b0dccd763574369fa65767ba762bf9e2543a700bc2d4d350d051e6",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:48:29.616656",
|
||||||
|
"original_filename": "IMG_1688.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 400886
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f50a80cc1ed56dac3f6b"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f50a80cc1ed56dac3f6d"
|
||||||
|
},
|
||||||
|
"image_hash": "41e5299a241b70a71509369876470404866d1ba0035ac049d24dab08ed358809",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:50:34.571495",
|
||||||
|
"original_filename": "IMG_1656.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 431025
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f50a80cc1ed56dac3f6c"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f50a80cc1ed56dac3f6d"
|
||||||
|
},
|
||||||
|
"image_hash": "ddf6b734a5a1753c98f5b5b6626136836c6129b9e12871c8c9ead79b0cbd889d",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:50:34.595828",
|
||||||
|
"original_filename": "IMG_1680.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 362255
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f6e"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f73"
|
||||||
|
},
|
||||||
|
"image_hash": "7e54719218c2c6e49080975528e45d7cc9523b4fcdd2233e2f1c9df296e96e37",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:52:29.154601",
|
||||||
|
"original_filename": "IMG_1586.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 338908
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f6f"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f73"
|
||||||
|
},
|
||||||
|
"image_hash": "db7bcb326efa37ac58ea047273379c4e304d2efc18abbcb423e3aa8ab7f5d474",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:52:29.205985",
|
||||||
|
"original_filename": "IMG_1587.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 413786
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f70"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f73"
|
||||||
|
},
|
||||||
|
"image_hash": "57880118b31a7ee51c8b533de4fd40ea0679fa592244c7023110804837a5e7df",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:52:29.249415",
|
||||||
|
"original_filename": "IMG_1589.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 346654
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f71"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f73"
|
||||||
|
},
|
||||||
|
"image_hash": "4ccb2c2df9945d2cdf6b40347d0102049153f87131f22e5775946488c7b5edd2",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:52:29.301144",
|
||||||
|
"original_filename": "IMG_1577.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 767053
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f72"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f57d80cc1ed56dac3f73"
|
||||||
|
},
|
||||||
|
"image_hash": "00672bc3e6a2964446675878ae75ffb8c02b450af6a03388df43d717d6cfe670",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:52:29.349741",
|
||||||
|
"original_filename": "IMG_1592.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 603707
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f65c80cc1ed56dac3f74"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f65c80cc1ed56dac3f75"
|
||||||
|
},
|
||||||
|
"image_hash": "927a702f4bac3e255f13c50c26af14c450622156c0946e2e357b663e7ed153e4",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T21:56:12.699721",
|
||||||
|
"original_filename": "IMG_0435.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 526161
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f7c880cc1ed56dac3f76"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f7c980cc1ed56dac3f7a"
|
||||||
|
},
|
||||||
|
"image_hash": "50a2de8ae288097e6973a268710764cfb930f4d7445d3dfebbc8f7eaf1200a8c",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:02:16.767671",
|
||||||
|
"original_filename": "IMG_3749.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 1631876
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f7c880cc1ed56dac3f77"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f7c980cc1ed56dac3f7a"
|
||||||
|
},
|
||||||
|
"image_hash": "f298db82a45027f82b9853b49ec07477043f17f0ab6e793057e18caf7b8a805d",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:02:16.948409",
|
||||||
|
"original_filename": "IMG_3783.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 2370062
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f7c980cc1ed56dac3f78"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f7c980cc1ed56dac3f7a"
|
||||||
|
},
|
||||||
|
"image_hash": "8c1e4bcc888c1b381d2d5db20cb4172703238cc06554df7c08ffce0682b59673",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:02:17.131779",
|
||||||
|
"original_filename": "IMG_3787.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 1954597
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f7c980cc1ed56dac3f79"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f7c980cc1ed56dac3f7a"
|
||||||
|
},
|
||||||
|
"image_hash": "e423aaba1f53f81e915c376b91e611bf652ad14387d12aae597b9223b5bcf212",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:02:17.384804",
|
||||||
|
"original_filename": "IMG_3735.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 3405094
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f8ce80cc1ed56dac3f7b"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f8cf80cc1ed56dac3f81"
|
||||||
|
},
|
||||||
|
"image_hash": "4c073626050d8374800e5ad29e568841280d09423f75a4c2776eca3b1a5cc5b2",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:06:38.835156",
|
||||||
|
"original_filename": "20180729_103510.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 347099
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f8ce80cc1ed56dac3f7c"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f8cf80cc1ed56dac3f81"
|
||||||
|
},
|
||||||
|
"image_hash": "ea7d806ffb3ba1309a8b9f1f3fda19f33059efb54bad8318adb1bede9aa93f66",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:06:38.873264",
|
||||||
|
"original_filename": "20180729_104211.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 309158
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f8ce80cc1ed56dac3f7d"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f8cf80cc1ed56dac3f81"
|
||||||
|
},
|
||||||
|
"image_hash": "bf4d6f24522498eb0eadc325c17a07e8814aae82583a593f7441c97306be7620",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:06:38.903831",
|
||||||
|
"original_filename": "20180729_103127.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 327925
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f8ce80cc1ed56dac3f7e"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f8cf80cc1ed56dac3f81"
|
||||||
|
},
|
||||||
|
"image_hash": "e4650203b426e789242b163c2ba8c71f4d5d88f11571985947cbb52f1f19d74d",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:06:38.940619",
|
||||||
|
"original_filename": "20180729_110153.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 253176
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f8ce80cc1ed56dac3f7f"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f8cf80cc1ed56dac3f81"
|
||||||
|
},
|
||||||
|
"image_hash": "39b8d859747f7844348a24a90335fa7b49207fd7dd4a3e98d09b63564f773bd1",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:06:38.964282",
|
||||||
|
"original_filename": "20180729_103239.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 262082
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f8cf80cc1ed56dac3f80"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f8cf80cc1ed56dac3f81"
|
||||||
|
},
|
||||||
|
"image_hash": "a8b9ea07664a6b1f6abd53e51e792a69a73cc6728eec687d3bc65a1b4b23447d",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:06:39.002779",
|
||||||
|
"original_filename": "20180729_104641.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 393910
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f95c80cc1ed56dac3f82"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f95c80cc1ed56dac3f83"
|
||||||
|
},
|
||||||
|
"image_hash": "9f7fe5504191781f40f3866c5228f82f36324102b24b1bc613dae4d25f453faa",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:09:00.519360",
|
||||||
|
"original_filename": "IMG_4543.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 245869
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841f9ed80cc1ed56dac3f84"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841f9ed80cc1ed56dac3f85"
|
||||||
|
},
|
||||||
|
"image_hash": "cd310fd644683dc2fc55f8a18ddf32d236868b434e2bb65380a944551b7eae47",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:11:25.214256",
|
||||||
|
"original_filename": "IMG_2939.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 520669
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fb7280cc1ed56dac3f86"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fb7380cc1ed56dac3f89"
|
||||||
|
},
|
||||||
|
"image_hash": "807c68131f13f61d769dc00b5ee644d3a7748f380b3d729d22dcb45e47765e0e",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:17:54.634226",
|
||||||
|
"original_filename": "20160505_162036.jpg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 2873133
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fb7280cc1ed56dac3f87"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fb7380cc1ed56dac3f89"
|
||||||
|
},
|
||||||
|
"image_hash": "ea29b612fdd7d0a7d2ca51ffc256c647417f5456280559f8d11d984a6bf2c1dd",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:17:54.949474",
|
||||||
|
"original_filename": "20160505_162040.jpg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 2439764
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fb7380cc1ed56dac3f88"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fb7380cc1ed56dac3f89"
|
||||||
|
},
|
||||||
|
"image_hash": "a691d6845bf681d6d1134a0da670f77d8d17e99dbe6a0d80dc97e86010fcae7d",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:17:55.268115",
|
||||||
|
"original_filename": "20160505_162018.jpg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 3794766
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fc4580cc1ed56dac3f8a"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fc4580cc1ed56dac3f8b"
|
||||||
|
},
|
||||||
|
"image_hash": "88cabe22af1679d98959ab7985b3fadee2ca11cb4bd37a6123a5f0c98792a728",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:21:25.299915",
|
||||||
|
"original_filename": "20160504_112522.jpg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 3322923
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fc8a80cc1ed56dac3f8c"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fc8b80cc1ed56dac3f8d"
|
||||||
|
},
|
||||||
|
"image_hash": "d7d4a9b7b5d791fca1dcbcbfb562144c50117bd30067bd4f7526a3e76bad3e24",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:22:34.918756",
|
||||||
|
"original_filename": "20160504_114309.jpg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 1740532
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fd8080cc1ed56dac3f8e"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fd8080cc1ed56dac3f92"
|
||||||
|
},
|
||||||
|
"image_hash": "a5f875e95b5ab035f4598ef7805316f32abb05a493cbc6036d7d6691865ad843",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:26:40.098674",
|
||||||
|
"original_filename": "20170726_181645.jpg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 1640943
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fd8080cc1ed56dac3f8f"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fd8080cc1ed56dac3f92"
|
||||||
|
},
|
||||||
|
"image_hash": "f5375009d09889976a1897068c7e34423545cc5a2fa91ab72e73625104e4f952",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:26:40.430777",
|
||||||
|
"original_filename": "20170725_205312.jpg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 2411086
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fd8080cc1ed56dac3f90"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fd8080cc1ed56dac3f92"
|
||||||
|
},
|
||||||
|
"image_hash": "a63f829f20701b1a553c78c1f9a1e05740b489340b8b348bbb173a14e5e428c0",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:26:40.549402",
|
||||||
|
"original_filename": "20170725_205209.jpg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 2451063
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fd8080cc1ed56dac3f91"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fd8080cc1ed56dac3f92"
|
||||||
|
},
|
||||||
|
"image_hash": "5b7af96f1f84764cf1a0c8b304f97628341bad58ed8ec867c042fdda091a6128",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:26:40.845842",
|
||||||
|
"original_filename": "20170726_181637.jpg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 4073946
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fdf680cc1ed56dac3f93"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fdf680cc1ed56dac3f94"
|
||||||
|
},
|
||||||
|
"image_hash": "a29957bc271ecd29185f6355c7f3c5b29b748904f828fd7ff9c7b4014d9e5bb7",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:28:38.447975",
|
||||||
|
"original_filename": "IMG_4188.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 2339918
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fe3080cc1ed56dac3f95"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fe3180cc1ed56dac3f9a"
|
||||||
|
},
|
||||||
|
"image_hash": "c3672d29497d396ff0dc765ace48c692ab82b39fb524dfe2775ea20027a85f9d",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:29:36.829260",
|
||||||
|
"original_filename": "IMG_4248.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 325521
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fe3080cc1ed56dac3f96"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fe3180cc1ed56dac3f9a"
|
||||||
|
},
|
||||||
|
"image_hash": "46f334e0033e95c35fdbf6374784813a323742bd878bdafec320b9a8ca6c6e50",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:29:36.874064",
|
||||||
|
"original_filename": "IMG_4212.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 516483
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fe3080cc1ed56dac3f97"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fe3180cc1ed56dac3f9a"
|
||||||
|
},
|
||||||
|
"image_hash": "5e9a70097040e5405631046e9597245cb62e0f60be9016099e15414388f8ab4f",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:29:36.930792",
|
||||||
|
"original_filename": "IMG_4211.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 622771
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fe3080cc1ed56dac3f98"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fe3180cc1ed56dac3f9a"
|
||||||
|
},
|
||||||
|
"image_hash": "4244aad23e2e06191494367b03b53b38d5372de96e52e1a0a0f7df56c5eb5141",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:29:36.976214",
|
||||||
|
"original_filename": "IMG_4253.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 522181
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841fe3180cc1ed56dac3f99"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841fe3180cc1ed56dac3f9a"
|
||||||
|
},
|
||||||
|
"image_hash": "eeac89acf75d0bc20a901aeaf65487e4d0c9930bc2369ce6c9c661a93bf36110",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:29:37.025798",
|
||||||
|
"original_filename": "IMG_4214.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 636483
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841feaa80cc1ed56dac3f9b"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841feaa80cc1ed56dac3f9c"
|
||||||
|
},
|
||||||
|
"image_hash": "8145e62d9b41bc37f6c6ef205f98a240d19be9a9b91475dd58577ee6d30a2202",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:31:38.152809",
|
||||||
|
"original_filename": "IMG_4203.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 495004
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841ff3c80cc1ed56dac3f9d"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841ff3c80cc1ed56dac3f9e"
|
||||||
|
},
|
||||||
|
"image_hash": "9f2a06c6c3bf044511d91f9051259de2180777e83f9e493e474fb4d90476f76d",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:34:04.288268",
|
||||||
|
"original_filename": "IMG_3424.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 679889
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841ffba80cc1ed56dac3f9f"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841ffbb80cc1ed56dac3fa4"
|
||||||
|
},
|
||||||
|
"image_hash": "1cb9109dca115180704859e78789486d2d62646131b4835f3576839ce524c529",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:36:10.881837",
|
||||||
|
"original_filename": "IMG_2865.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 351937
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841ffba80cc1ed56dac3fa0"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841ffbb80cc1ed56dac3fa4"
|
||||||
|
},
|
||||||
|
"image_hash": "48409673794a95c35eee6871f058dabcee8ddceb4d90423e7700289ccc3d5451",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:36:10.933911",
|
||||||
|
"original_filename": "IMG_2872.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 425206
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841ffba80cc1ed56dac3fa1"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841ffbb80cc1ed56dac3fa4"
|
||||||
|
},
|
||||||
|
"image_hash": "df1d10303b997a40bbff64eb1cb060abf0721dd6803ba6e3e824486c3463eeb8",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:36:10.979929",
|
||||||
|
"original_filename": "IMG_2869.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 373956
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841ffbb80cc1ed56dac3fa2"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841ffbb80cc1ed56dac3fa4"
|
||||||
|
},
|
||||||
|
"image_hash": "9f6369cc31b62fc6845368c0cebfc900186ca9e371dc7e27cffbfec0b5d78dc5",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:36:11.010414",
|
||||||
|
"original_filename": "IMG_2828.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 427094
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": {
|
||||||
|
"$oid": "6841ffbb80cc1ed56dac3fa3"
|
||||||
|
},
|
||||||
|
"pin_id": {
|
||||||
|
"$oid": "6841ffbb80cc1ed56dac3fa4"
|
||||||
|
},
|
||||||
|
"image_hash": "b0012c31496b140cb8a088d5a112e2f86cb8b7e2d912f870ff113cc2a2aba155",
|
||||||
|
"metadata": {
|
||||||
|
"created_at": "2025-06-05T22:36:11.041962",
|
||||||
|
"original_filename": "IMG_2825.jpeg",
|
||||||
|
"mime_type": "image/jpeg",
|
||||||
|
"size": 487837
|
||||||
|
},
|
||||||
|
"caption": null
|
||||||
|
}]
|