             path        : required
             description : required
             cb          : required
-        if not @_validate_uuids(opts) then return
+        if not @_validate_opts(opts) then return
         x = {}; x[opts.path] = opts.description
         @db.table('projects').get(opts.project_id).update(public_paths:x).run(opts.cb)
 

            cb         : required    # cb(err, {group:[{account_id:?,first_name:?,last_name:?}], ...})
        if not @_validate_opts(opts) then return
        groups = undefined
        names  = undefined
        async.series([
            (cb) =>
                # get account_id's of all users of the project
                @get_project_data
                    project_id : opts.project_id
                    columns    : opts.groups
                    cb         : (err, _groups) =>
                        if err
                            cb(err)
                        else
                            groups = _groups
                            for i in [0...groups.length]
                                if not groups[i]?
                                    groups[i] = []
                            cb()
            (cb) =>
                # get names of users
                @account_ids_to_usernames
                    account_ids : _.flatten((v for k,v of groups))
                    cb          : (err, _names) =>
                        names = _names
                        cb(err)
        ], (err) =>
            if err
                opts.cb(err)
            else
                for group, v of groups
                    for i in [0...v.length]
                        account_id = v[i]
                        x = names[account_id]
                        v[i] = {account_id:account_id, first_name:x.first_name, last_name:x.last_name}
                opts.cb(false, groups)
        )

    # Set last_edited for this project to right now, and possibly update its size.
    # It is safe and efficient to call this function very frequently since it will

            group      : required  # see PROJECT_GROUPS above
            cb         : required  # cb(err)
        if not @_validate_opts(opts) then return
        x = {}; x[opts.account_id] = {group:opts.group}
        @table('projects').get(opts.project_id).update(users:x).run(opts.cb)

    # TODO: api change -- no longer give the group
    remove_user_from_project: (opts) =>
        opts = defaults opts,
            project_id : required
            account_id : required
            cb         : required  # cb(err)
        if not @_validate_opts(opts) then return
        x = {}; x[opts.account_id] = true
        db.table('projects').get(opts.project_id).replace(@r.row.without(users:x)).run(opts.cb)

    get_project_users: (opts) =>
        opts = defaults opts,
