Donc.
J’ai totalement refait les datapod deno.
En prenant en compte vos remarques, désormais l’achitecture est la suivante:
- Toutes les data sont dans un field jsonb
profile_data - J’ai repris exactement le format proposé par Hugo dans ses pods IPFS
- Un script permet d’exporter toutes les data d’ou pod sous forme de fichiers json de ce type:
g1QZYubAXXVj8PwNGbr6f9ZJyhpukHTgyeAVRWqnVH4HxUMDb.json
{
"address": "g1QZYubAXXVj8PwNGbr6f9ZJyhpukHTgyeAVRWqnVH4HxUMDb",
"profile_data": {
"hash": "4ADFAEF2A0BEED308AF6535DA879400D54709C58E277FD5747E2CAE7954C469A",
"time": 1702669481,
"title": "SurfinBot 🤖",
"issuer": "HcxCF4qG6wYTLix9aCHt16i6msMQoXYP2PWDx4rS9nL9",
"address": "g1QZYubAXXVj8PwNGbr6f9ZJyhpukHTgyeAVRWqnVH4HxUMDb",
"version": 10,
"signature": "hQIV8v3bqPRdl3ZlCOmyGD2UyWWJPvL7Ve0cycB713U9aows2ySA76M8VaMeuc+GxDACkyKlJQ/wXL3wNCBWBw=="
},
"signature": "hQIV8v3bqPRdl3ZlCOmyGD2UyWWJPvL7Ve0cycB713U9aows2ySA76M8VaMeuc+GxDACkyKlJQ/wXL3wNCBWBw==",
"signature_timestamp": 1702669481,
"kind": "cesium_plus_profile_import",
"created_at": "2025-08-04T19:22:15.387Z",
"updated_at": "2025-08-04T19:22:15.387Z",
"deleted_at": null,
"export_timestamp": "2025-08-04T19:32:35.156Z",
"ipfs_ready": true
}
- Un script d’import permet d’importer tout ces profiles à partir d’un dossier de ce type
- Les signatures sont vérifiés à chaque import, que ce soit depuis les pod Cs+ (contrairement aux datapod ipfs qui semblent ignorer les signatures Cs+ actuellement), ou les import depuis les fichiers json
- L’ordre des timestamp est bien vérifié lors de l’import
- Des computed field Hasura permettent d’avoir de vraies fields GraphQL à partir des data jsonb
- Les données ne sont plus supprimés mais un field
deleted_atvient se peupler lors d’une suppression.
query {
profiles(limit: 10, order_by: {updated_at: desc}) {
address
created_at
deleted_at
deletion_signature_timestamp
kind
signature_status
signature_timestamp
updated_at
city
title
description
geoloc
signature
avatar
}
}
Schema de la db:
[
{
"type": "text",
"column": "address",
"nullable": false
},
{
"type": "jsonb",
"column": "profile_data",
"nullable": false
},
{
"type": "text",
"column": "signature",
"nullable": false
},
{
"type": "bigint",
"column": "signature_timestamp",
"nullable": false
},
{
"type": "text",
"column": "kind",
"nullable": false
},
{
"type": "timestamp with time zone",
"column": "created_at",
"nullable": true
},
{
"type": "timestamp with time zone",
"column": "updated_at",
"nullable": true
},
{
"type": "timestamp with time zone",
"column": "deleted_at",
"nullable": true
},
{
"type": "bigint",
"column": "deletion_signature_timestamp",
"nullable": true
}
]
Est-ce bien ce que vous vouliez ?