为 Google 个 App Maker 记录添加多个所有者

Adding multiple owners for Google App Maker records

我需要 Google App Maker 数据模型安全方面的帮助。我想为一个记录设置多个所有者。比如当前用户+分配的管理员+超级管理员。 我需要这个,因为所有记录都可以有不同的所有者和 super-owners/admins。 我知道我们可以将 google app maker 指向包含记录所有者电子邮件的字段,我们可以在创建记录时将该字段设置为当前用户。

record.Owner = Session.getActiveUser().getEmail();

我想知道是否可以拥有字段所有者或拥有多个字段(如 owner1、owner2),然后将访问级别分配给 owner1、owner2...

或者我们如何以编程方式控制记录的access/security/permissions?

我将用于此解决方案的解决方案肯定涉及记录中的一个字段,该字段包含应该有权访问它的所有用户的逗号分隔字符串。我已经研究了以下示例以更好地解释我的想法。

我创建了一个模型,名为 documents,看起来像这样:

在一个页面中,我有一个 table 和一个添加新文档记录的按钮。该页面如下所示:

当我单击 添加文档 按钮时,会弹出一个对话框,如下所示:

上面表格中 SUBMIT 按钮的逻辑如下:

widget.datasource.item.owners = app.user.email;
widget.datasource.createItem(function(){
  app.closeDialog();
});

这将自动为记录的创建者分配所有权。要添加其他所有者,我在编辑表单上进行。单击记录行内的 edit 按钮时,会弹出编辑表单。它看起来像这样:

如您所见,我正在使用列表小部件来控制所有者。为此,有必要在编辑对话框中使用 <List>String 自定义 属性,这将是列表小部件的数据源。在这种情况下,我将其称为 owners。我已将以下内容应用于编辑按钮的 onClick 事件:

var owners = widget.datasource.item.owners;
owners = owners ? owners.split(",") : [];
app.pageFragments.documentEdit.properties.owners = owners;
app.showDialog(app.pageFragments.documentEdit);

列表小部件上方的 add 按钮具有以下用于 onClick 事件处理程序的逻辑:

widget.root.properties.owners.push("");

列表小部件行内的 TextBox 小部件对于 onValueEdit 事件处理程序具有以下逻辑:

widget.root.properties.owners[widget.parent.childIndex] = newValue;

并且 CLOSE 按钮具有以下用于 onClick 事件处理程序的逻辑:

var owners = widget.root.properties.owners || [];
if(owners && owners.length){
  owners = owners.filter(function(owner){
    return owner != false; //jshint ignore:line
  });
}
widget.datasource.item.owners = owners.join();
app.closeDialog();

因为我想创建一个只为授权用户加载记录的逻辑,所以我不得不在数据源中使用一个查询脚本来实现这个目的。为此,我在服务器脚本上创建了这个函数:

function getAuthorizedRecords(){
  var authorized = [];
  var userRoles = app.getActiveUserRoles();
  var allRecs = app.models.documents.newQuery().run();
  if(userRoles.indexOf(app.roles.Admins) > -1){
    return allRecs;
  } else {
    for(var r=0; r<allRecs.length; r++){
      var rec = allRecs[r];
      if(rec.owners && rec.owners.indexOf(Session.getActiveUser().getEmail()) > -1){
        authorized.push(rec);
      }
    }
    return authorized;
  }  
}

然后在 documents 数据源上,我将以下内容添加到查询脚本中:

return getAuthorizedRecords();

此解决方案将为管理员用户加载所有记录,但对于非管理员用户,它只会加载其电子邮件位于记录的 owners 字段中的记录。这是我能想到的最优雅的解决方案,我希望它能满足您的目的。

参考文献:
https://developers.google.com/appmaker/models/datasources#query_script
https://developers.google.com/appmaker/ui/binding#custom_properties
https://developers.google.com/appmaker/ui/logic#events
https://developers-dot-devsite-v2-prod.appspot.com/appmaker/scripting/api/client#Record