I am implementing Node.js logic with controllers and repository using Kris Kowal's Q library. I have a feeling that the way I use promises in the example below is not correct. But I can't find any guidance on proper pattern how to use promises through multiple layers or functions.
Am I doing it right? What's the proper way implementing this logic?
// Module: Repository
exports.findOne = function (query) {
    var deferred = Q.defer();
    db.query(query, function (err, data) {
        if (err) {
            deferred.reject(err);
        } else {
            deferred.resolve(data);
        }
    });
    return deferred.promise;
};
// Module: User
var isEmailAvailable = function (value) {
    var deferred = Q.defer();
    Repository.findOne({email: value})
        .then(function (user) {
            if (user) {
                if (self.id === user.id) {
                    deferred.resolve(true);
                }
                else {
                    deferred.resolve(false);
                }
            } else {
                deferred.resolve(true);
            }
        })
        .fail(function (err) {
            deferred.reject(err);
        });
    return deferred.promise;
};
this.save = function () {
    var deferred = Q.defer();
    isEmailAvailable(this.email)
        .then(function (result) {
            if (result) {
                Repository.upsert(self)
                    .then(function (user) {
                        deferred.resolve(user); //--- Yey!!!
                    }).fail(function () {
                        deferred.reject('Account save error')
                    });
            } else {
                deferred.reject('The email is already in use');
            }
        }).fail(function () {
            deferred.reject('Account validation error')
        });
    return deferred.promise;
};
 
     
    