Hi,

Just to share that I have successfully deployed Mojolicious (Full App) 
based BI application in production with Hynotoad along with Async/Await 
feature, DBIx:Class model layer, Mojo::Pg Model layer, API calls with 
Mojo::UserAgent (with Async/Await).

Mojo::Test feature is also amazing.


Special thanks to Luc Didry
for the following link which has helped me in deployment.

https://mojolicious.io/blog/2018/12/22/use-carton-for-your-mojolicious-app-deployment/


-- Jeyaraj

On Saturday, 6 June 2020 19:17:05 UTC+5:30, Jeyaraj Durairaj wrote:
>
> Honored to receive answers and responses from experts in the first place.
> Your tips and ideas are indeed essential to me.
>
> Happy to be in Mojolicious discussions and sharing ideas!
>
> -- Jeyaraj
>
> On Saturday, 6 June 2020 19:11:47 UTC+5:30, Stefan Adams wrote:
>>
>> *form *and *json *are examples of "content generators 
>> <https://mojolicious.org/perldoc/Mojo/UserAgent/Transactor#GENERATORS>".  
>> You can think of them as request macros.  *form 
>> <https://mojolicious.org/perldoc/Mojo/UserAgent/Transactor#form>*, for 
>> example, "generates query string, application/x-www-form-urlencoded or 
>> multipart/form-data content" while *json*, for example, "generates 
>> application/json content with Mojo::JSON."
>>
>> So, true, changing the content generator as I recommended changes how the 
>> request is sent to the server.  But you can also create your own custom 
>> generators if you need to, such as an application/x-www-form-urlencoded 
>> content expecting a JSON value for a form parameter as yours seems to 
>> expect.
>>
>> Indeed, without knowing anything about your API, I recommended a change 
>> for how you send your request, completely blindly and contrary to what the 
>> API endpoint may be expecting.  I assumed the API endpoint would handle a 
>> JSON request, but instead it seems to want a JSON string as the value to 
>> the *periods* parameter of the form.
>>
>> On Sat, Jun 6, 2020 at 5:50 AM Jeyaraj Durairaj <jeyaraj...@gmail.com> 
>> wrote:
>>
>>> Hi Stefan,
>>>
>>> Thanks for the appreciation and the ideas.
>>>
>>> I will surely do the following change in my code.
>>>
>>> changing to return *$tx->result->json*; from  return 
>>> from_json($tx->result->body); 
>>>
>>> However, following change has been tricky to me.
>>>
>>> changing to  *json* => { periods => *$c->session('cx_current_quarter')*
>>>  },  from  form => { periods => encode_json([ 
>>> $c->session('cx_current_quarter') 
>>> ]) },
>>>
>>>  I, per se, tried *json* => { periods => 
>>> *$c->session('cx_current_quarter')* } at the outset. It did not work.
>>>
>>> The reason I found is the following:
>>>
>>> "json =>" works for the API call without "Authorization Header"
>>> my $tx = await $ua->post_p('http://' . $c->config->{API_IP} . 
>>> '/api/token/refresh/' => json => { refresh => $refresh_token });
>>>
>>> only "form =>" works for the API call with Authorization Header" 
>>> $tx = await $ua->post_p(
>>>             'http://' . $c->config->{API_IP} . 
>>> '/api-app/analytics/summary/',
>>>             { Authorization => 'Bearer ' . $access_token },
>>>             *form *=> { periods => *$c->session('cx_current_quarter')*
>>>  }, 
>>>         );
>>>
>>> The difference between json and form in this context was intentional or 
>>> accidental. More comments on this will be appreciated!
>>>
>>> Thanks.
>>> -- Jeyaraj
>>>
>>>
>>>
>>> On Saturday, 6 June 2020 02:55:04 UTC+5:30, Stefan Adams wrote:
>>>>
>>>> Great job pushing your application forward with Async/Await!  Looking 
>>>> at your snippet, here's one small change you can probably make using the 
>>>> json() 
>>>> method from Mojo::Message 
>>>> <https://mojolicious.org/perldoc/Mojo/Message#json>:
>>>>
>>>>     $app->helper(summary_data => async sub ($c, $access_token) {
>>>>         my $ua = Mojo::UserAgent->new;
>>>>
>>>>         my $tx = await $ua->post_p(
>>>>             'http://' . $c->config->{API_IP} . 
>>>> '/api-app/analytics/summary/',
>>>>             { Authorization => 'Bearer ' . $access_token },
>>>>             *json* => { periods => *$c->session('cx_current_quarter')* 
>>>> }, 
>>>>         );
>>>>         if ($tx->result->is_success) {
>>>>             return *$tx->result->json*;
>>>>         }
>>>>         $c->flash(message_type => 'warning');
>>>>         $c->flash(message => 'Could not get summary data');
>>>>         return $c->redirect_to('cx-summary', status => 403);
>>>>     });
>>>>
>>>>
>>>>
>>>> On Thu, Jun 4, 2020 at 2:31 AM Jeyaraj Durairaj <jeyaraj...@gmail.com> 
>>>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> It works for *helpers* as well with the following declaration.
>>>>>
>>>>>     $app->helper(summary_data => async sub ($c, $access_token) {
>>>>>         my $ua = Mojo::UserAgent->new;
>>>>>
>>>>>         my $tx = await $ua->post_p(
>>>>>             'http://' . $c->config->{API_IP} . 
>>>>> '/api-app/analytics/summary/',
>>>>>             { Authorization => 'Bearer ' . $access_token },
>>>>>             form => { periods => encode_json([ 
>>>>> $c->session('cx_current_quarter') ]) }, 
>>>>>         );
>>>>>         if ($tx->result->is_success) {
>>>>>             return from_json($tx->result->body);
>>>>>         }
>>>>>         $c->flash(message_type => 'warning');
>>>>>         $c->flash(message => 'Could not get summary data');
>>>>>         return $c->redirect_to('cx-summary', status => 403);
>>>>>     });
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> -- Jeyaraj
>>>>>
>>>>> On Thursday, 4 June 2020 12:06:01 UTC+5:30, Jeyaraj Durairaj wrote:
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> Eureka! Eureka! It works!.
>>>>>>
>>>>>> The solution I found (because of my error) is that I uninstalled 
>>>>>> Mojo::AsyncAwait and installed Future::AsyncAwait.
>>>>>> It just works!
>>>>>>
>>>>>> By June end, my business intelligence application will be live to 
>>>>>> serve 100+ users with insights and analytics.
>>>>>>
>>>>>> (To apply icing on the cake, I have plugged in Moose also in to model 
>>>>>> layer for my application)
>>>>>>
>>>>>> As Glen Hinkle said, it is really really a fun to work in 
>>>>>> Mojolicious. I love Hypnotoad.
>>>>>>
>>>>>> BTW, I am doing a private project as well to help a home designer to 
>>>>>> launch a web site for their small firm. Guess! what framework I am gonna 
>>>>>> use.. *Mojolicious.*
>>>>>>
>>>>>> Thanks to Mojo group and special thanks to SRI as well.
>>>>>>
>>>>>> -- Jeyaraj
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thursday, 28 May 2020 14:15:04 UTC+5:30, Jeyaraj Durairaj wrote:
>>>>>>>
>>>>>>> any luck on the solutions?
>>>>>>>
>>>>>>> -- Jeyaraj
>>>>>>>
>>>>>>> On Thursday, 28 May 2020 00:10:48 UTC+5:30, Jeyaraj Durairaj wrote:
>>>>>>>>
>>>>>>>> However, the below code perfectly work for me outside Mojolicious 
>>>>>>>> App.
>>>>>>>>
>>>>>>>>
>>>>>>>> use Modern::Perl;
>>>>>>>> use Mojo::Base -strict, -signatures;
>>>>>>>> use Mojo::UserAgent;
>>>>>>>> use Mojo::Promise;
>>>>>>>> use Mojo::IOLoop;
>>>>>>>> use Mojo::Util 'trim';
>>>>>>>> use Mojo::AsyncAwait;
>>>>>>>> use LWP::UserAgent;
>>>>>>>> use JSON;
>>>>>>>>
>>>>>>>>
>>>>>>>> my $ua = Mojo::UserAgent->new;
>>>>>>>> my $result = $ua->post('http://localhost:8000/api/token/' => json 
>>>>>>>> => { username => 'username', password => 'mypassword' })
>>>>>>>>                 ->result
>>>>>>>>                 ->json;
>>>>>>>> my $access_token = $result->{access};
>>>>>>>> my $refresh_token = $result->{refresh};
>>>>>>>> print "Access Token: " . $result->{access}, "\n";
>>>>>>>> print "Refresh Token: " . $result->{refresh}, "\n\n";
>>>>>>>>
>>>>>>>>
>>>>>>>> $ua = Mojo::UserAgent->new;
>>>>>>>> $result = $ua->post('http://' . 'localhost:8000' . 
>>>>>>>> '/api/token/refresh/' => json => { refresh => $refresh_token })
>>>>>>>>                 ->result
>>>>>>>>                 ->json;
>>>>>>>>
>>>>>>>>
>>>>>>>> my $agent = Mojo::UserAgent->new;
>>>>>>>> async post_user_p => sub ($url) {
>>>>>>>>     say "\n\n", $url;
>>>>>>>>     my $tx = await $agent->post_p(
>>>>>>>>         $url,
>>>>>>>>         {
>>>>>>>>             Authorization => 'Bearer ' . $result->{access},
>>>>>>>>         },
>>>>>>>>         form => {"username" => "username"}, 
>>>>>>>>
>>>>>>>>     );
>>>>>>>>     return trim from_json($tx->result->body)->{first_name};
>>>>>>>> };
>>>>>>>>
>>>>>>>> async main => sub (@urls) {
>>>>>>>>     my @promises = map { post_user_p($_) } @urls;
>>>>>>>>     my @names = await Mojo::Promise->all(@promises);
>>>>>>>>     say for map { $_->[0] } @names;
>>>>>>>> };
>>>>>>>>
>>>>>>>> my @urls = (qw(
>>>>>>>>     http://localhost:8000/api-converge/auth/user/
>>>>>>>> ));
>>>>>>>>
>>>>>>>> main(@urls)->wait;
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Wednesday, 27 May 2020 23:41:27 UTC+5:30, Jeyaraj Durairaj wrote:
>>>>>>>>>
>>>>>>>>> I tried generating an example app and copied pasted the code 
>>>>>>>>> segment you posted here and then tried.
>>>>>>>>>
>>>>>>>>> "Action not found!" error is shown.
>>>>>>>>>
>>>>>>>>> Should I reinstall Perl again and then try?
>>>>>>>>> Will it work under morbo or works only on Hypnotoad?
>>>>>>>>> I am using Windows for my development, wherein morbo is the only 
>>>>>>>>> server I can test.
>>>>>>>>> Or can I test it on daemon mode and try>
>>>>>>>>> Please suggest as to how I should diagnose it.
>>>>>>>>> I would need this Async/await to be working in my system.
>>>>>>>>> I have tried without Async, all other functionalities rock both in 
>>>>>>>>> development and production (hypnotoad). Mojo::UserAgent is amazing to 
>>>>>>>>> fetch 
>>>>>>>>> API call data from Django server (running under Apache).
>>>>>>>>>
>>>>>>>>> I am completely counting on Mojolicious as my primary framework 
>>>>>>>>> for my new projects. Please help.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Regards/Jeyaraj
>>>>>>>>>
>>>>>>>>> On Wednesday, 27 May 2020 17:46:49 UTC+5:30, Sebastian Riedel 
>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>> I'll assume it was you who asked the same question on IRC 
>>>>>>>>>> earlier. Had you been sticking around for a bit longer you would 
>>>>>>>>>> have seen 
>>>>>>>>>> my instructions for getting a working application that i tested 
>>>>>>>>>> locally.
>>>>>>>>>>
>>>>>>>>>>     14:08 <kraih> to be sure i did a "mojo generate app" and then 
>>>>>>>>>> replaced the controller with http://paste.scsys.co.uk/589044
>>>>>>>>>>
>>>>>>>>>> That's the important part, if that doesn't work your Perl or some 
>>>>>>>>>> module you installed is broken.
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> sebastian
>>>>>>>>>>
>>>>>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "Mojolicious" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to mojol...@googlegroups.com.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/mojolicious/debdea2d-2f67-4feb-814d-9d936d1b6732%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/mojolicious/debdea2d-2f67-4feb-814d-9d936d1b6732%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "Mojolicious" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to mojol...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/mojolicious/ae2e9c20-e50a-4b67-a7a2-b103d7d8b728o%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/mojolicious/ae2e9c20-e50a-4b67-a7a2-b103d7d8b728o%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to mojolicious+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/mojolicious/362836a1-e4d8-4f22-81e8-266a353ede8ao%40googlegroups.com.

Reply via email to