Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Jean-Jacques Dubray
    @jdubray
    It looks great except for one thing, I would not put the CRUD operations (services) in the actions and call these actions from nap(). Logically this is truly what happens but IMHO, it is better when the model persists its values
    There could be some race conditions that occur when you handle the persistence with nap()
    dnson
    @imnutz
    @jdubray so from what you said, there should be some thing like this in the model:
    model.fetchingData = function() {
          callRestAPI({})
               .then(function(response) {
                      - update model's data
                      - call State.render
              })
    }
    
    model.updateContact = function() {
          callRestAPI({})
               .then(function(response) {
                       - update model's data
                       - call State.render
               })
    }
    
    // same for create and delete
    Jean-Jacques Dubray
    @jdubray
    Yes, but this is called from within the model, not the actions.
    the rationale is that there is no point in rendering the view until the model has persisted and the persistence layer has also accepted the values of the model. If you could be guaranteed that whatever value has been accepted by the model will persist as is, then you could use actions in nap().
    the other aspect to consider is concurrency. As soon as actions can be triggered and processed before the present model has completed, then you will run into concurrency issues. The SAFE middleware "blocks" the present method and serializes all action execution, in particular it would check for the "allowedActions" in the new State before processing an action waiting in the queue.
    Jean-Jacques Dubray
    @jdubray
    I believe that's the problem with React, the reducer could technically process more than one action, then depending which one finishes first would be immediately overwritten by the last one.
    You have to always ask the concurrency question when you build such a system.
    dnson
    @imnutz
    @jdubray thank you for reviewing and explaining this.
    Jean-Jacques Dubray
    @jdubray
    you are welcome, again happy to discuss better alternatives, this is a very important question
    tomorrownull
    @tomorrownull
    m
    Bang-Equal
    @Bang-Equal
    I am trying to run the crud-blog but none of the button clicks work because "actions is not defined". I dopn'
    I don't see actions in server.js but I do see it in blog.js
    Jean-Jacques Dubray
    @jdubray
    @ReketeBravo could try that repo? https://github.com/jdubray/sam-safe
    Did you do npm install?
    Bang-Equal
    @Bang-Equal
    yes
    Jean-Jacques Dubray
    @jdubray
    I just tried it on my machine and it seems to work
    Let me check if I pushed the latest code
    Looks like the latest code is available in the repo
    Bang-Equal
    @Bang-Equal
    is it correct that server.js does not have actions?
    Jean-Jacques Dubray
    @jdubray
    yes, I implemented the actions in the browser, SAM allows to decide where the elements of the pattern are deployed
    Bang-Equal
    @Bang-Equal
    ok, I am currently running node on a Win7 machine
    let me try on my macbook
    Jean-Jacques Dubray
    @jdubray
    This particular sample "presents" the results from the action to the model
    // server side $.post( "http://localhost:5425/app/v1/present", data) .done(function( representation ) { $( "#representation" ).html( representation ); } );
    which line is the error?
    Is the error on the server?
    Bang-Equal
    @Bang-Equal
    no the error was in the browser, the click handler for the button was saying action was undefined
    Jean-Jacques Dubray
    @jdubray
    I am need to go to a meeting, but I would check in the Web console what is coming back from the server:
    .done(function( representation ) {
                    $( "#representation" ).html( representation );
                }
    Bang-Equal
    @Bang-Equal
    ok, thank you
    Jean-Jacques Dubray
    @jdubray
    The HTML should be wired to the blog.js actions. If you look in blog.js it should look like this:
    var actions = {} ;
    
    actions.edit = function(data) {
        data.lastEdited = {title: data.title,  description: data.description, id: data.id } ;
        present(data) ;
        return false ;
    } ;
    
    actions.save = function(data) {
        data.item = {title: data.title, description: data.description, id: data.id || null} ;
        present(data) ;
        return false ;
    } ;
    
    actions.delete = function(data) {
        data = {deletedItemId: data.id} ;
        present(data) ;
        return false ;
    } ;
    
    actions.cancel = function(data) {
        present(data) ;
        return false ;
    } ;
    You can also run the sample without a server, you should uncomment the client code and comment the server code
    Bang-Equal
    @Bang-Equal
    I will try
    Jean-Jacques Dubray
    @jdubray
    For instance, in blog.html:
    // client side
                model.present(data) ;
    
                // server side
                //$.post( "http://localhost:5425/app/v1/present", data) 
                //.done(function( representation ) {
                //    $( "#representation" ).html( representation );
                //}        
                //);
    sorry have to go
    Bang-Equal
    @Bang-Equal
    OK, I got it working. The problem was that I was using the wrong url in my browser. Instead of C://crud-blog/blog.html, I was using http://localhost:5425/app/v1/init
    Bang-Equal
    @Bang-Equal
    Also, I opened an issue in sam-safe repo to update the package.json "start" script.
    Thank you for all of your work!
    Jean-Jacques Dubray
    @jdubray
    You are welcome, thank you for giving it a try.
    Bang-Equal
    @Bang-Equal
    @jdubray Hi JJ its me again, I am looking at the code of your website http://www.ebpml.org and I am trying to get an understanding of how SAM can be used in the "real world". Lets say for example, that I published the crud-blog example where a jquery HTTP request is made to the server. Is it safe to expose the server address and file structure to the client? How did you address security in your site?
    Jean-Jacques Dubray
    @jdubray
    In the http://www.ebpml.org/about page, I simply make a request to the feed.xml file so there is security (but that's server side)
    On the Web there is only one security architecture for back-end APIs, either it is safe for anyone to call them (say like feed.xml) or you need users to login and either call the API with a valid session token from the browser or you need to call them safely from the server (say with APIKey)
    You should never bring API credentials on the browser (say like API key), it is 100% unsafe.
    I am a server side guy, I don't believe much in complex browser-based apps. I like the UX of SPA but I prefer when most of the SPA comes from the server rather than making AJAX calls from the browser.
    That's why SAM is 100% isomorphic and I came up with it because I felt that the Front-End driving API signatures was the wrong thing to do.
    Bang-Equal
    @Bang-Equal
    OK so if I were to publish the crud-blog example that we discussed above for example, I would just need to generate a token that the server can validate
    Jean-Jacques Dubray
    @jdubray
    yes, you would want the user to login and if you need to call the API from the browser, I would use a session token. In general API Gateways (such as AWS, Azure, ...) don't implement that pattern, they prefer a server to call the API with an API Key because they implement things like throttling, ... but if you implement your API say with Node.js then it's not hard to manage session tokens.
    Jean-Jacques Dubray
    @jdubray
    Just published an implementation of SAM in AWS Lambda with a DynamoDB session manager
    https://github.com/jdubray/sam-samples/tree/master/crud-blog-lambda
    Kirill Kravchenko
    @kirill-kravchenko
    Hi! I'm trying to build my webapp using sam. So I have the following question: should actions always present data to model
    Jean-Jacques Dubray
    @jdubray
    yes in general, they might decide not to, but they have no other purpose.