[dancer-users] Looking for a developer...
Mike Schroeder
mike at nimbusrecording.com
Thu Sep 11 19:05:35 BST 2014
Thanks Richard - to be honest I'm not sure why I didn't take advantage of
as_tree() - I've been using my dbo2aoh helpers for so many years I got
stuck in a rut. Good feedback on the abstraction. I was in a bit of a
hurry to knock this one off, and as Winston Churchill said, "I didn't have
the time to write you a shorter letter".
Best,
Mike.
On Thu, Sep 11, 2014 at 2:52 AM, Richard Jones <ra.jones at dpw.clara.co.uk>
wrote:
> Thanks for the examples Mike. I see you are calling and manipulating your
> RBDO classes directly in your routes. That answers my integration question.
> I tend to keep all that stuff in separate model classes so that I could
> change ORM to say DBIX::Class without any change to the D2 classes. But it
> does increase complexity. Just a thought regarding the expansion helpers -
> you don't utilise the as_tree() function anywhere? I realise your helpers
> do more than just simple object-to-hash conversion.
>
> my $rv = dbo2h($student);
> my $rv = $student->as_tree;
> my $rv = $student->as_tree(deflate => 0); # to keep eg DateTime objects
>
> On 10/09/2014 21:00, Mike Schroeder wrote:
>
> Hi Richard - not sure mine is the most elegant approach vis a vi plugins -
> but it is working, and it is fast :) For production I'm running multiple
> instances of Dancer with shared memcached for session management, all
> behind balance. This is all on a 12-core OS X Mavericks box and barely
> makes a blip on utilization.
>
> 1) I generated all the Rose::DB::Object classes from the MySQL schema
> for the RDBO classes and Manager classes.
>
> 2) I wrote a few helper functions to convert DBO objects in hash or
> array of hash suitable for Dancer templating (I'll copy those in below). I
> still use HTML::Template over TT just so that I can have non-coder HTML
> designers work with the templates, so these data structures work for that
> template engine. The result is a route that looks like this:
>
> #----------------------------------------------------------------------
> get '/modal/points/:student_id' => sub {
> #----------------------------------------------------------------------
> my $student = NDB::Student->new( id => params->{student_id} )->load;
> my $rv = dbo2h($student);
> template "staff/modal/points", $rv, {layout => "simple"};
> };
>
> Here are a few other sample routes:
>
> #----------------------------------------------------------------------
> post '/studio' => sub {
> #----------------------------------------------------------------------
> my @fields = ( qw( studio_name campus_id location session_rate
> calendar_id ) );
> dbo_add_update("NDB::Studio", { params }, \@fields );
> redirect "/admin/campus";
> };
>
> #----------------------------------------------------------------------
> post '/studio/delete' => sub {
> #----------------------------------------------------------------------
> my $p = NDB::Studio->new( id => params->{id} );
> if ( params->{id} == params->{confirm_id} ) {
> $p->delete;
> }
> redirect "/admin/campus";
> };
>
> I also have some other helpers that follow RDBO relationships and
> inflate the data structures for templating:
>
> #----------------------------------------------------------------------
> get '/campus' => sub {
> #----------------------------------------------------------------------
> my $campuses = NDB::Campus::Manager->get_campus();
> my $rv = dbom2aoh( $campuses, { studios => 'studio_list', staff =>
> 'staff_list', } );
> template "admin/campus", { campus_list => $rv, add_navbar() }, { layout
> => 'staff'};
> };
>
>
> 3) The helper functions help glue Dancer and RDBO together:
>
>
> =head2 dbo2h()
>
> dbo2h - convert a DBO object into a hash of key/value pairs.
>
> my $hashref = dbo2h( $dboobject, $date_format_string, $expandhash,
> $prepend );
>
> =cut
>
> sub dbo2h {
> my $row = shift;
> my $date_format = shift || '%Y-%m-%d %T';
> my $expand = shift;
> my $prepend = shift;
> my $parent_prepend = shift;
> my %hash = $row->column_value_pairs;
> foreach my $key ( keys %$expand ) {
> my $reln = $expand->{$key};
> if ( $prepend ) {
> $hash{$reln . '_' . $key} = ( $row->$reln ? $row->$reln->$key :
> '' );
> } else {
> $hash{$key} = ( $row->$reln ? $row->$reln->$key : '');
> }
> }
> foreach my $key ( keys %hash ) {
> if ( ref $hash{$key} eq 'DateTime' ) {
> $hash{$key} = $hash{$key}->strftime($date_format);
> }
> elsif ( ref $hash{$key} eq 'Time::Clock' ) {
> $hash{$key} = $hash{$key}->as_string;
> }
> $hash{$key} =~ s/\s+$//g;
> if ( $parent_prepend ) {
> $hash{$parent_prepend.'_'.$key} = delete $hash{$key};
> }
> }
> return \%hash;
> }
>
> =head2 dbo2aoh()
>
> dbo2aoh - convert a DBO set of objects into an array of hash of
> key/value pairs.
>
> my $arrayref = dbo2aoh( $dboarray, $date_format_string, $expandhash,
> $prepend );
>
> =cut
>
> sub dbo2aoh {
> my $rows = shift;
> my $date_format = shift;
> my $expandhash = shift;
> my $prepend = shift;
> my $parent_prepend = shift;
> my @results;
> foreach my $row ( @$rows ) {
> push(@results, dbo2h( $row, $date_format, $expandhash, $prepend,
> $parent_prepend ) );
> }
> return \@results;
> }
>
>
> =head2 dbo_add_update()
>
> dbo_add_update - convert Dancer params into DBO add/update
>
> my @fields = ( qw( field1 field2 field3 ) );
> @errors = dbo_update( 'NDB::Lecture', { params }, \@fields, );
>
> =cut
>
> sub dbo_add_update {
> my ( $class, $p, $fields ) = @_;
> my ( $obj, @errors );
>
> if ( $p->{id} ) {
> $obj = $class->new( id => $p->{id} );
> push(@errors, "No such record") unless $obj->load_speculative;
>
> unless ( @errors ) {
> foreach my $field ( @$fields ) {
> $obj->$field( $p->{$field} ) if exists $p->{$field};
> }
> $obj->save;
> }
> } else {
> my %columns;
> foreach my $field ( @$fields ) {
> $columns{$field} = $p->{$field} if exists $p->{$field};
> }
> $obj = $class->new( %columns );
> $obj->save;
> }
> return $obj;
> }
>
> =head2 dbom2aoh()
>
> dbom2row - convert dbo to AOH and add DBOM relationships as child AOH
>
> $rv = dbo_update( $dbo, { relationship => 'hash_key' },
> $date_format_string, $expandhash, $prepend );
>
> =cut
>
> sub dbom2aoh {
> my ( $parent, $map, $dateformat, $expand, $prepend ) = @_;
> my @rv;
> foreach my $dbo ( @$parent ) {
> my $row = dbo2h( $dbo, $dateformat, $expand, $prepend );
> foreach my $reln ( keys %$map ) {
> my $children = $dbo->$reln;
> $row->{ $map->{$reln} } = dbo2aoh( $children, $dateformat );
> }
> push @rv, $row;
> }
> return \@rv;
> }
>
> Like I said in my initial post - I'm sure there are refactor
> opportunities in my code - so please be kind :) I tried to go for
> readability over conciseness so that I could hand it off at some point.
>
> Hope that helps.
>
> Best,
>
> Mike.
>
>
>
> On Wed, Sep 10, 2014 at 12:19 PM, Richard Jones <ra.jones at dpw.clara.co.uk>
> wrote:
>
>> Hello Mike,
>>
>> I was very interested to read about your experience. I'm not touting for
>> the job as I have a full-time job already. But just to say I'm a recent
>> convert to Dancer2 from developing long-term with
>> CGI::Application/RBDO/MySQL. I'm most interested in how you integrated Rose
>> with Dancer. I haven't tried it yet as all my recent apps are small enough
>> to use DBIx::Simple, but I'm planning a bigger one that will need an ORM.
>> Do you use the MVC architecture? Do you use an adapter class for Rose or
>> just rely on the Dancer DB plugin? Is your project open source or are you
>> not able to expose the code base publicly?
>>
>> Good luck recruiting.
>>
>>
>> On 10/09/2014 19:39, Mike Schroeder wrote:
>>
>> Hi all - I've been using Dancer for years and have watched this list
>> for years - thank you to everyone for a great framework.
>>
>> In my new role at a new company (an audio engineering and production
>> school), I searched for an off the shelf system to do what I wanted, and
>> finally gave up and wrote my own. Dancer, Rose::DB::Object, Bootstrap and
>> MySQL - amazing what you can do in 3-4 months of spare time :)
>>
>> The project is up and in production, running well, and now we are
>> wanting to add more features, etc. I am too busy doing my real job (CEO)
>> to have the time to do the development work on the system.
>>
>> I'm looking for someone who can can SSH into our servers from anywhere,
>> work within my existing architecture to extend and add features, refactor
>> some of my prototype code (it's not horrible, but I know it could be
>> better), and help move the project forward.
>>
>> The ideal candidate would have experience with Dancer,
>> Rose::DB::Object, Bootstrap and MySQL. There is also a POE-based daemon
>> using Rose::DB::Object running alongside for long-running asynchronous job
>> handling, so POE experience would be helpful as well.
>>
>> This is not a full-time job - more project based work to add new
>> features, etc. I expect to keep building this out over the next year, so
>> I'm looking for a good long term partner to work with. I'm ok with
>> different timezones, as long as we can find some common time for Skype etc.
>> (I'm in Vancouver, so Pacific Timezone).
>>
>> If you are interested, you can send an email to mike at nimbusrecording
>> dot com. Let me know your experience and expectations for payment.
>>
>> Thanks all - I really appreciate the Dancer community and what it
>> allows us all to create.
>>
>> Best,
>>
>> Mike.
>>
>>
>>
>> _______________________________________________
>> dancer-users mailing listdancer-users at dancer.pmhttp://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>
>>
>> --
>> Richard Jones
>>
>>
>> _______________________________________________
>> dancer-users mailing list
>> dancer-users at dancer.pm
>> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>>
>>
>
>
> _______________________________________________
> dancer-users mailing listdancer-users at dancer.pmhttp://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>
>
> --
> Richard Jones
>
>
> _______________________________________________
> dancer-users mailing list
> dancer-users at dancer.pm
> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.preshweb.co.uk/pipermail/dancer-users/attachments/20140911/893700d7/attachment-0001.html>
More information about the dancer-users
mailing list