0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

StrapiAdvent Calendar 2020

Day 12

private fieldに設定した項目を特定のAPIで取得する方法

Last updated at Posted at 2020-12-12

Strapi Advent Calenderの12日目は、11日目の記事strapiのGETで関連テーブルのデータ取得を制御する方法内の、項目をprivateにする方法で取得を制御した時に、特定のAPIでのみprivate項目も含めて取得させる、APIのカスタマイズ方法を書いて行きたいと思います。

例えば、usersモデルのemailなど、find、findOneなどのAPIでは取得したくないけどme APIだけでは取得させたい。。。などの時に使えるかなと思います。

前提

サンプルとして、11日目の記事strapiのGETで関連テーブルのデータ取得を制御する方法と同じモデルを使用します。

baseModel: emailを持っていて、relationalModelに1:1のリレーションが張られている
relationalModel: name, summaryを持っていて、baseModelに1:1のリレーションが張られている

privateの設定についても11日目の記事のprivateをtrueに設定するのように、relational_modeltrueになっている前提で、findOne APIの時だけ、private fieldを取得するようにAPIをカスタマイズしていきます。

/api/base-model/models/base-model.settings.json
{
  "kind": "collectionType",
  "collectionName": "base_models",
  "info": {
    "name": "baseModel"
  },
  "options": {
    "increments": true,
    "timestamps": true
  },
  "attributes": {
    "email": {
      "type": "email"
    },
    "relational_model": {
      "model": "relational-model",
      "via": "base_model",
      "private": true
    }
  }
}

APIをカスタマイズする

と言っても、とっても簡単です。
デフォルトのfindOne APIの中身はこんな感じで、取得したデータをsanitizeEntity()に通してから返却しています。このsanitizeEntity()のなかでprivateに設定した項目を払っているので、カスタマイズの方法としては、a. sanitizeEntity()に通さずにデータを返却すると b. sanitizeEntity()後に、改めてデータを付与してから返却するの2通り考えられます。


  async findOne(ctx) {
    const { id } = ctx.params;

    const entity = await strapi.services.restaurant.findOne({ id });
    return sanitizeEntity(entity, { model: strapi.models.restaurant });
  },

1. findOne の中身をコピーする

/api/base-model/controllers/base-model.settings.jsにfindOneの処理をコピぺします。
strapiのドキュメントから引っ張ってくると楽です。

/api/base-model/controllers/base-model.settings.js
'use strict';
const { sanitizeEntity } = require('strapi-utils');

module.exports = {
  async findOne(ctx) {
    const { id } = ctx.params;
    const entity = await strapi.services.restaurant.findOne({ id });
    return sanitizeEntity(entity, { model: strapi.models.restaurant });
  },
};

2-a. sanitizeEntity()に通さずにデータを返却する

private設定した項目を全て取得したい場合は、こちらの方法が良いと思います。

/api/base-model/controllers/base-model.settings.js
'use strict';
const { sanitizeEntity } = require('strapi-utils');

module.exports = {
  async findOne(ctx) {
    const { id } = ctx.params;
    const entity = await strapi.services.restaurant.findOne({ id });
    return entity
  },
};

2-b. sanitizeEntity()後に、改めてデータを付与してから返却する

private設定にした一部の項目を取得したい場合などに。

/api/base-model/controllers/base-model.settings.js
'use strict';
const { sanitizeEntity } = require('strapi-utils');

module.exports = {
  async findOne(ctx) {
    const { id } = ctx.params;
    const entity = await strapi.services.restaurant.findOne({ id });
    const sanitizeEntity = sanitizeEntity(entity, { model: strapi.models.restaurant });
    sanitizeEntity.relational_model = enity.relational_model;
    return 
  },
};

終わりに

今回はprivateに設定した項目を、APIをカスタマイズして取得する方法を紹介しましたが、それ以外にもデータの取得をする方法を前日に紹介していますので、併せてチェックしていただければと思います。
strapiのGETで関連テーブルのデータ取得を制御する方法

参考

https://strapi.io/documentation/3.0.0-beta.x/guides/custom-data-response.html#get-the-data-back
https://strapi.io/documentation/v3.x/concepts/controllers.html#core-controllers

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?