V2s-datapod: Hasura with Deno middleware to store profiles

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_at vient 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 ?

4 Likes