流星:如何限制用户聊天?

时间:2016-01-26 00:23:06

标签: meteor

我正在处理一个项目,我的最后一项任务是实现发布和订阅,以防止用户看到他们没有参与的对话。我们得到了一个示例代码,我注意到路由器上有一个过滤器。

Router.route('/chat/:_id', function () {
    // the user they want to chat to has id equal to 
    // the id sent in after /chat/... 
    var otherUserId = this.params._id;
    // find a chat that has two users that match current user id
    // and the requested user id
    var filter = {$or:[
        {user1Id:Meteor.userId(), user2Id:otherUserId}, 
        {user2Id:Meteor.userId(), user1Id:otherUserId}
    ]};
    var chat = Chats.findOne(filter);
    if (!chat){// no chat matching the filter - need to insert a new one
        chatId = Chats.insert({user1Id:Meteor.userId(), user2Id:otherUserId});
    }
    else {// there is a chat going already - use that. 
        chatId = chat._id;
    }
    if (chatId){// looking good, save the id to the session
        Session.set("chatId",chatId);
    }
    this.render("navbar", {to:"header"});
    this.render("chat_page", {to:"main"});  
});

我认为过滤器应该在发布然后订阅。这就是我现在所拥有的。

我的HTML

<template name="chat_page">
  <h2>Type in the box below to send a message!</h2>
  <div class="row">
    <div class="col-md-12">
      <div class="well well-lg">
        {{#each recentMessages}}
        {{> message}}
        {{/each}}
      </div>    
    </div>
  </div>
  <div class="row">
    <div class="col-md-12">
      {{#if currentUser}}
      <form class="new-message">
        <input class="input" type="text" name="text" placeholder="type a message here...">
        <button class="btn btn-default">Send</button>
      </form>
      {{/if}}
    </div>
  </div>
</template>

<!-- simple template that displays a message -->
<template name="message">
  <div class = "container">
    <div class = "row">
      <div class = "username">
        <img src="/{{avatar}}" class="avatar_img" >
        {{username}} 
        said: {{messageText}} 
      </div>
    </div>
  </div>
</template>

服务器端

Meteor.startup(function () {
    if (!Meteor.users.findOne()){
        for (var i=1;i<9;i++){
            var email = "user"+i+"@test.com";
            var username = "user"+i;
            var avatar = "ava"+i+".png"
            console.log("creating a user with password 'test123' and username/  email: "
                        + email);
            Meteor.users.insert({
                profile:{username:username, avatar:avatar}, 
                emails: [{address:email}],
                services:{ 
                    password:{"bcrypt" : "PASSWORD REMOVED"}}});
        }
    } 
});

Meteor.publish("messages", function (userId) { 
    return Messages.find(); 
});

Meteor.publish("userStatus", function() {
    return Meteor.users.find({ "status.online": true });
});

Meteor.publish("userData", function(){
    if(this.userId) {
        return Meteor.users.find({_id: this.userId},{
            fields: {'other':1, 'things': 1}});
    } else {
        this.ready();
    }
    return Meteor.users.find({ "status.online": true })
});

客户端

Meteor.subscribe("messages");
Meteor.subscribe("userStatus");
Meteor.subscribe("userData");

// set up the main template the the router will use to build pages
Router.configure({
    layoutTemplate: 'ApplicationLayout'
});
// specify the top level route, the page users see when they arrive at the   site
Router.route('/', function () {
    console.log("rendering root /");
    this.render("navbar", {to:"header"});
    this.render("lobby_page", {to:"main"});  
});


Router.route('/chat/:_id', function () {

    this.render("navbar", {to:"header"});
    this.render("chat_page", {to:"main"});  
});


///
// helper functions 
/// 
Template.message.helpers({
    userName: function() {
        var userId = this.userId;
        var user = Meteor.users.findOne(userId);
        var username = user && user.profile && user.profile.username;
        var avatar = user && user.profile && user.profile.avatar;

        return {
            username: username,
            avatar: avatar
        } 
    }
})

Template.available_user_list.helpers({
    users:function(){
        return Meteor.users.find();
    }
})

Template.available_user.helpers({
    getUsername:function(userId){
        user = Meteor.users.findOne({_id:userId});
        return user.profile.username;
    }, 
    isMyUser:function(userId){
        if (userId == Meteor.userId()){
            return true;
        }
        else {
            return false;
        }
    }
})


Template.chat_page.helpers({
    recentMessages: function () {
        if (Session.get("hideCompleted")) {
            return Messages.find({checked: {$ne: true}}, {sort: {createdAt: -1}});
        } else {
            return Messages.find({}, {sort: {createdAt: 1}}); 
        }      
    },

    hideCompleted: function () {
        return Session.get("hideCompleted");
    },

    incompleteCount: function () {
        return Tasks.find({checked: {$ne: true}}).count();
    }
});



Template.chat_page.events({ 
    // this event fires when the user sends a message on the chat page
    'submit .new-message':function(event){ 
        console.log(event); 
        event.preventDefault();
        var text = event.target.text.value;
        // stop the form from triggering a page reload
        event.target.text.value = "";

        // see if we can find a chat object in the database
        // to which we'll add the message
        Meteor.call("sendMessage", text); 
    },
});

集合

Messages = new Mongo.Collection("messages");

共享 - 方法

Meteor.methods({
    sendMessage: function (messageText) {
        if (! Meteor.userId()) {
            throw new Meteor.Error("not-authorized");
        }

        Messages.insert({
            messageText: messageText,
            createdAt: new Date(),
            username: Meteor.user().profile.username,
            avatar: Meteor.user().profile.avatar,
        });

    }
});

0 个答案:

没有答案