NIFCLOUD-mbaas / UserCommunity

ニフクラ mobile backend ユーザーコミュニティ
https://mbaas.nifcloud.com/
82 stars 18 forks source link

ACLのパーミッション編集を自動でやりたい #1293

Open gongqihongshu opened 2 years ago

gongqihongshu commented 2 years ago

JavaScriptでレッスンを予約するためのスマホアプリを作っております。 現在、クーポン追加機能を実装しようとしております。

具体的には下記の通りです。 ①既存ユーザーが自身のアプリ上に表示される紹介コードを、紹介したい人に共有 ②紹介された人はアプリ上でユーザー登録を行い、特定のページで紹介コードを入力 ③完了すると、既存・新規ユーザー両者にクーポンが追加される ④ニフクラ上では、データストアにある「クーポン」というクラスにクーポン詳細が追加される

現状、アプリ上で紹介コードを入力し送信すると、 紹介した人、紹介された人だけでなく、全ユーザーに同じクーポンが追加されてしまいます。 上記④において、ACLのパーミッションが全員になっているためです。

そのため、 アプリ上で紹介コードを入力し送信すると、 ユーザーIDを取得し、ACLにそのIDを入れることで紹介した人と紹介された人のみにクーポンを追加しようとしました。 下記の通りです。

let setCoupon = this._ncmb.DataStore("m_coupons");
let _setCoupon = new setCoupon();
let obId = _currentUser.objectId;
let settingAcl = {"acl":{"${obId}":{"read":true}}};
_setCoupon.set("acl",settingAcl)
    .save().then(() => {
        _setCoupon.save();
        ons.notification.alert("クーポンを取得しました");
        thisClass._request();
        }).catch(function (err) { alert("エラーです" + err) });

        }).catch(function (err) {
                  ons.notification.alert("取得に失敗しました");
                  console.log(err);

これだとエラーになり「取得に失敗しました」とアラートが表示されてクーポンが追加されません。 ちなみにconsole.log(settingAcl)は、[object Object]となっております。 またconsole.log(err)では、 Error: cannot POST https://mbaas.api.nifcloud.com:443/2013-09-01/classes/m_coupons (400)と表示されます。 (※上記コード上の最後のerrです)

何とか{"オブジェクトID":{"read":true}}の形にしてACLを設定したく、 何か方法があればご教授いただきたく存じます。 また上記エラーの意味も教えていただければ幸いです。

上記コードは省略しておりますので意味が分からない部分あったり、そもそも説明がよく分からないなどの場合はご質問いただければ幸いです。

どうぞよろしくお願いいたします。

goofmint commented 2 years ago

JavaScriptということなので、 ncmb.Acl を使ってください。

const settingAcl = new ncmb.Acl;

さらに自分と、招待してくれた人だけに読み込み権限を付与するのであれば、相手のobjectIdが必要です。これは何か手を考えていただくとして…

// ダミーでユーザーを作成
const inviterObjectId = 'aaa'; // 招待してくれた人のobjectId
const inviterUser = new ncmb.User;
inviterUser.objectId = inviterObjectId;
// Acl作成
settingAcl
  .setUserReadAccess(_currentUser, true)
  .setUserReadAccess(inviterUser, true);
_setCoupon.set("acl",settingAcl);

こんな感じになるかと思います。

もし ncmb.Acl が使えないのであれば、形式としては "acl" が不要です。

let settingAcl = {"${obId}":{"read":true}};
_setCoupon.set("acl",settingAcl)
gongqihongshu commented 2 years ago

ご回答ありがとうございます!!

let settingAcl = {"${obId}":{"read":true}};
_setCoupon.set("acl",settingAcl)

でやってみたのですが、 やはり下記のエラーが出て上手くいきません。

Error: cannot POST https://mbaas.api.nifcloud.com:443/2013-09-01/classes/m_coupons (400)

このエラーの意味は分かりますでしょうか?

goofmint commented 2 years ago

構文が間違っていました。

const settingAcl = {};
settingAcl[objId] = {read: true};

こちらでどうでしょう?ncmb.Aclを使った方が良いと思いますが。