Skip to content

me.virmesh.player.prepareProfileImageUpload

PlayerServer 内部に保存するプロフィール画像 upload を予約します。

プロフィール画像 upload の準備を行う private action です。 この action は画像本体を直接受け取らず、metadata を署名付き request として受け取り、 1 回限りの uploadToken と binary upload 用 URL を返します。 client は返却された uploadPath に raw binary body を PUT し、 upload 完了後に me.virmesh.player.updateProfileprofile+me.virmesh.player.card module から画像参照を貼ります。 v1 の content type は image/pngimage/jpeg のみです。

draft

Endpoint

Method
POST
Path
/private/me.virmesh.player.prepareProfileImageUpload
Auth
required
Host
VirMesh.PlayerServer

Request schema

fromstringRequired

upload owner かつ署名検証に使う player identifier です。

payload.contentTypestringRequired

予約する画像 content type です。v1 は image/png または image/jpeg を受け付けます。

payload.sizeintegerRequired

upload 予定の byte size です。

payload.hashstringRequired

upload 予定の画像 body hash です。v1 は sha256:<base64url> を使います。

payload.widthintegerRequired

画像の pixel width です。

payload.heightintegerRequired

画像の pixel height です。

payload.updated_atintegerRequired

request signing に使う epoch second です。

signaturestringRequired

canonical JSON of { action, from, payload } に対する対象 player 本人の署名です。

Request example

{
  "from": "medi:player:ed25519:base64-public-key",
  "payload": {
    "contentType": "image/png",
    "size": 42000,
    "hash": "sha256:base64url-hash",
    "width": 512,
    "height": 512,
    "updated_at": 1770000100
  },
  "signature": "base64-signature-by-player-for-request-envelope"
}

Responses

200
status+me.virmesh.success.profileImageUploadPrepared

profile image upload の準備が完了したことを示します。

Response body

payload.assetIdstringRequired

upload 成功後に profileImage object で参照する asset identifier です。

payload.uploadTokenstringRequired

1 回限りの binary upload token です。

payload.uploadMethodstringRequired

v1 では常に PUT を返します。

payload.uploadPathstringRequired

raw binary upload に使う absolute URL です。

payload.expiresAtintegerRequired

upload token の失効時刻です。epoch second を返します。

Response example

{
  "payload": {
    "assetId": "profimg_123",
    "uploadToken": "550e8400-e29b-41d4-a716-446655440000",
    "uploadMethod": "PUT",
    "uploadPath": "https://ps.example.com/uploads/profile-images/550e8400-e29b-41d4-a716-446655440000",
    "expiresAt": 1770001000
  },
  "status": "status+me.virmesh.success.profileImageUploadPrepared"
}

me.virmesh.player.prepareProfileImageUpload が正常終了し、 uploadTokenuploadPath が発行されたときに返します。

400
status+me.virmesh.json.invalid_payload

`payload`がactionの期待する形式ではないことを示します。

リクエストデータ自体はJSON objectとして解釈できたものの、 期待する形式と一致しない場合に使います。

Status payload

payload.messagestringRequired

検証に失敗した理由を表す詳細メッセージです。

invalid payload

{
  "status": "status+me.virmesh.json.invalid_payload",
  "payload": {
    "message": "送信されたペイロードが正しい形式ではありません。"
  }
}
400
status+me.virmesh.json.invalid_private_request

private request envelope の形式が不正であることを示します。

この status は private route が期待する from, payload, signature などの envelope 要件を満たさない場合に返ります。

Status payload

payload.messagestringRequired

実装依存の詳細メッセージです。

invalid private envelope

{
  "status": "status+me.virmesh.json.invalid_private_request",
  "payload": {
    "message": "Private request must contain the expected envelope fields."
  }
}
400
status+me.virmesh.json.unexpected_fields

許可されていない field が request に含まれていることを示します。

この status は strict validation が有効な route に未知の top-level field または payload field を送った場合に返ります。

Status payload

payload.messagestringRequired

実装依存の詳細メッセージです。

unexpected request fields

{
  "status": "status+me.virmesh.json.unexpected_fields",
  "payload": {
    "message": "Request contains unknown fields that are not allowed by this route."
  }
}
400
status+me.virmesh.player.invalid_profile_image

プロフィール画像 metadata または upload 内容が不正であることを示します。

この status はプロフィール画像の prepare / upload / reference 貼り付けで、 content type、size、hash、dimensions、metadata 一致条件のいずれかを満たさない場合に返ります。

Status payload

payload.messagestringRequired

実装依存の詳細メッセージです。

profile image is invalid

{
  "status": "status+me.virmesh.player.invalid_profile_image",
  "payload": {
    "message": "Profile image metadata does not match the uploaded asset."
  }
}
400
status+me.virmesh.player.invalid_timestamp

`updated_at` が有効な epoch second ではないことを示します。

この status は profile update family の payload.updated_at が non-negative integer として解釈できない場合に返ります。

Status payload

payload.messagestringRequired

実装依存の詳細メッセージです。

updated_at is invalid

{
  "status": "status+me.virmesh.player.invalid_timestamp",
  "payload": {
    "message": "payload.updated_at must be a non-negative integer epoch second."
  }
}
400
status+me.virmesh.player.timestamp_in_future

`updated_at` が server 時刻より未来であることを示します。

この status は profile update family の timestamp が server の現在時刻を超えている場合に返ります。

Status payload

payload.messagestringRequired

実装依存の詳細メッセージです。

updated_at is in the future

{
  "status": "status+me.virmesh.player.timestamp_in_future",
  "payload": {
    "message": "payload.updated_at must not be in the future."
  }
}
400
status+me.virmesh.player.timestamp_out_of_range

`updated_at` が freshness window を超えて古いことを示します。

この status は profile update family の timestamp が server の許容範囲より古い場合に返ります。

Status payload

payload.messagestringRequired

実装依存の詳細メッセージです。

updated_at is too old

{
  "status": "status+me.virmesh.player.timestamp_out_of_range",
  "payload": {
    "message": "payload.updated_at is outside the supported epoch-second range."
  }
}
400
status+me.virmesh.key.unsupported_keytype

送信された鍵種別がそのサーバーでサポートされていないことを示します。

指定された鍵方式にサーバーが対応しておらず、リクエストを処理できないことを示します。 例えば、action が ed25519 鍵を要求しているにもかかわらず、クライアントが secp256k1 鍵を送信した場合などに返されます。

Status payload

payload.messagestringRequired

未対応であることを示すメッセージです。

unsupported key type

{
  "status": "status+me.virmesh.key.unsupported_keytype",
  "payload": {
    "message": "送信された鍵の種類はサポートされていません。"
  }
}
401
status+me.virmesh.key.invalid_signature

署名の形式が不正、または署名検証に失敗したことを示します。

この status は署名文字列が base64 として不正な場合と、 復元できた署名が検証に失敗した場合に使われます。

Status payload

payload.messagestringRequired

実装依存の詳細メッセージです。

signature verification failed

{
  "status": "status+me.virmesh.key.invalid_signature",
  "payload": {
    "message": "Signature verification failed."
  }
}
404
status+me.virmesh.account.not_known

指定した account をその server が既知の永続 state として保持していないことを示します。

この status は me.virmesh.account.disableAccount を受けた server が、 対象 account に関する永続 state を持っていない場合に返ります。 v1 では未知 account に対する tombstone record の先行作成は行いません。

Status payload

payload.messagestringRequired

実装依存の詳細メッセージです。

account not known

{
  "status": "status+me.virmesh.account.not_known",
  "payload": {
    "message": "The requested account is not known to this server."
  }
}
410
status+me.virmesh.account.disabled

対象 account が tombstone 化済みであり、有効な主体または参照先として扱えないことを示します。

この status は account が disable 済みで、以後の更新、social 操作、migration、 公開 profile / handle 解決の対象として受理されない場合に返ります。 通常は HTTP 410 Gone と組み合わせて返します。

Status payload

payload.messagestringRequired

実装依存の詳細メッセージです。

account disabled

{
  "status": "status+me.virmesh.account.disabled",
  "payload": {
    "message": "The requested account has been disabled and tombstoned."
  }
}