         throw Error("NotImplementedError")
 
     add_user_to_project: (opts) =>
-        throw Error("NotImplementedError")
+        opts = defaults opts,
+            project_id : required
+            account_id : required
+            group      : 'collaborator'  # see misc.PROJECT_GROUPS above
+            cb         : required  # cb(err)
+        if not @_validate_opts(opts) then return
+        @_query
+            query       : 'UPDATE projects'
+            jsonb_merge :
+                users   :
+                    "#{opts.account_id}":
+                        group: opts.group
+            cb          : opts.cb
 
     remove_collaborator_from_project: (opts) =>
         throw Error("NotImplementedError")

            cb     : opts.cb

    do_account_creation_actions: (opts) =>
        throw Error("NotImplementedError")

    set_stripe_customer_id: (opts) =>
        throw Error("NotImplementedError")

        throw Error("NotImplementedError")

    create_project: (opts) =>
        opts = defaults opts,
            account_id  : required    # initial owner
            title       : undefined
            description : undefined
            cb          : required    # cb(err, project_id)
        if not @_validate_opts(opts) then return
        project_id = misc.uuid()
        now = new Date()
        @_query
            query  : "INSERT INTO projects"
            values :
                project_id  : project_id
                title       : opts.title
                description : opts.description
                created     : now
                last_edited : now
                users       : {"#{opts.account_id}":{group:'owner'}}
            cb : (err, result) =>
                opts.cb(err, if not err then project_id)

    get_project: (opts) =>
        throw Error("NotImplementedError")
