sunnyman's (sunnyman) wrote in changelog,
sunnyman's
sunnyman
changelog

[fotobilder] r1455: LJSUP-10497: Login/GetPics/GetGalsTree f...

Committer: vtroitsky
LJSUP-10497: Login/GetPics/GetGalsTree functions added + updates (temp commit)
U   trunk/lib/FB/Protocol/Fotki/GetGals.pm
A   trunk/lib/FB/Protocol/Fotki/GetGalsTree.pm
A   trunk/lib/FB/Protocol/Fotki/GetPics.pm
A   trunk/lib/FB/Protocol/Fotki/Login.pm
U   trunk/lib/FB/Protocol/Fotki/UploadPic.pm
U   trunk/lib/FB/Protocol/Response.pm
Modified: trunk/lib/FB/Protocol/Fotki/GetGals.pm
===================================================================
--- trunk/lib/FB/Protocol/Fotki/GetGals.pm	2011-11-25 15:46:00 UTC (rev 1454)
+++ trunk/lib/FB/Protocol/Fotki/GetGals.pm	2011-11-28 15:35:57 UTC (rev 1455)
@@ -4,7 +4,6 @@
 
 use strict;
 use LJ::Fotki::Album;
-use Data::Dumper;
 
 sub handler {
     my $resp = shift or return undef;
@@ -17,16 +16,15 @@
         return undef;
     };
     my $lj_userid = FB::get_domain_userid($u);
-
     my $lj_user = LJ::load_userid($lj_userid);
 
 #    warn "userid: ".$u->userid." -> ljuserid: $lj_userid # $lj_user" ;
-    my $albums = LJ::Fotki::Album->get_albums($lj_userid);
+    # TODO: eval to catch all errors
+    my $albums = LJ::Fotki::Album->get_albums($lj_userid, $lj_user);
 
     my $ret = {Gal => [] };
 
     if (scalar(@$albums)) {
-#        warn "ALB:".Data::Dumper->Dump($albums);
         for my $album (@$albums) {
             next unless($album);
             my $album_ret = {

Added: trunk/lib/FB/Protocol/Fotki/GetGalsTree.pm
===================================================================
--- trunk/lib/FB/Protocol/Fotki/GetGalsTree.pm	                        (rev 0)
+++ trunk/lib/FB/Protocol/Fotki/GetGalsTree.pm	2011-11-28 15:35:57 UTC (rev 1455)
@@ -0,0 +1,165 @@
+#!/usr/bin/perl
+
+package FB::Protocol::Fotki::GetGalsTree;
+
+use strict;
+use LJ::Fotki::Album;
+
+sub handler {
+    my $resp = shift or return undef;
+    my $req  = $resp->{req};
+    my $vars = $req->{vars};
+    my $u = $resp->{u};
+
+    my $err = sub {
+        $resp->add_method_error(GetGalsTree => @_);
+        return undef;
+    };
+
+    my $lj_userid = FB::get_domain_userid($u);
+    my $lj_user = LJ::load_userid($lj_userid);
+
+    my $albums = LJ::Fotki::Album->get_albums($lj_userid, $lj_user);
+
+    return $err->(500) unless ref $albums;
+
+    my $ret = {
+        RootGals        => [ { Gal => [ ] } ],
+        UnreachableGals => [ { Gal => [ ] } ],
+    };
+
+    if (scalar(@$albums)) {
+        for my $album (@$albums) {
+            next unless($album);
+            my $album_ret = {
+                                id      => $album->album_id,
+                                Name    => [ $album->title ],
+                                Sec     => [ 255 ],                             # default security: public
+                            #    Date    => [ $album->createtime ],             # gallery creation date in 2004-01-01 01:01:01 format
+                            #    TimeUpdate  => [ $album->updatetime ],         # update timestamp
+                                URL     => [ $album->url ],
+                            };
+            # is this the incoming gallery?
+#            $gal_ret->{incoming} = 1 if $album->is_unsorted;
+
+            # GalMembers
+            my $photos = $album->get_all_photos($lj_user);
+            $album_ret->{GalMembers}->{GalMember} = [ map { { id => $_->photo_id } } @$photos ];
+
+            # ChildGals
+            $album_ret->{ChildGals}->{ChildGal} = [];           # empty
+
+            push @{$ret->{RootGals}->[0]->{Gal}}, $album_ret; 
+        }
+    }
+
+
+    # register return value with parent Request
+    $resp->add_method_vars(GetGalsTree => $ret);
+
+    return 1;
+
+
+}
+
+sub handler_old {
+    my $resp = shift or return undef;
+    my $req  = $resp->{req};
+    my $vars = $req->{vars};
+    my $u = $resp->{u};
+
+    my $err = sub {
+        $resp->add_method_error(GetGalsTree => @_);
+        return undef;
+    };
+
+    my $gals = FB::gals_of_user($u);
+    return $err->(500) unless ref $gals;
+
+    my $ret = {
+        RootGals        => [ { Gal => [ ] } ],
+        UnreachableGals => [ { Gal => [ ] } ],
+    };
+
+    if (%$gals) {
+
+        # load gallery rels and pic rels for use later
+        my @gal_rel = FB::user_galleryrel($u);
+        my @pic_rel = FB::user_gallerypics($u);
+
+        # build a data structure of parent gallids => array of their children
+        my %parents  = ();
+        my %children = ();
+        foreach (grep { $_->{type} eq 'C' } @gal_rel) {
+            my ($pid, $cid) = ($_->{gallid}, $_->{gallid2});
+            push @{$children{$pid}}, $gals->{$cid};
+            push @{$parents{$cid}}, $gals->{$pid};
+            $gals->{$cid}->{sortorder} = $_->{sortorder};
+        }
+
+        # resets every visit to top-level (0)
+        my %seen = ();
+        my %unreachable = map { $_ => 1 } keys %$gals;
+
+        my $recurse;
+        $recurse = sub {
+            my $gal = shift;
+            my $gallid = $gal->{gallid};
+
+            # since we've visited this gallery, it's not unreachable
+            delete $unreachable{$gallid};
+
+            my $node = { id         => $gallid,
+                         sortorder  => $gal->{sortorder}+0,
+                         Name       => [ FB::transform_gal_name($gal->{name}) ],
+                         Sec        => [ $gal->{secid} ],
+                         Date       => [ $gal->{dategal} ],
+                         TimeUpdate => [ $gal->{timeupdate} ],
+                         URL        => [ FB::url_gallery($u, $gal) ],
+                     };
+
+            # is this the incoming gallery?
+            $node->{incoming} = 1 if FB::gal_is_unsorted($gal);
+
+            # GalMembers
+            $node->{GalMembers}->{GalMember} = 
+                [ map { { id => $_->{upicid} } }
+                  grep { $_->{gallid} == $gallid }
+                  @pic_rel ];
+
+            # now the hard part: ChildGals
+            $node->{ChildGals}->{Gal} = 
+                [ map  { $recurse->($_) } 
+                  sort { $a->{sortorder} <=> $b->{sortorder} || $a->{gallid} <=> $b->{gallid} }
+                  grep { ! $seen{$_->{gallid}}++ } 
+                  @{$children{$gallid}} ];
+
+            return $node;
+        };
+
+        # start at parent (top-level) node and built tree
+        # of all its children
+        foreach my $child (@{$children{0}}) {
+            %seen = ( $child->{gallid} => 1 );
+            push @{$ret->{RootGals}->[0]->{Gal}}, $recurse->($child);
+        }
+
+        # represent any galleries that were unreachable, recursing down
+        # from each gallery that has no parents
+        foreach my $gal (map  { $gals->{$_} }
+                         sort { $gals->{$a}->{sortorder} <=> $gals->{$b}->{sortorder} ||
+                                $gals->{$a}->{gallid} <=> $gals->{$b}->{gallid} }
+                         keys %unreachable) {
+
+            %seen = ( $gal->{gallid} => 1 );
+            push @{$ret->{UnreachableGals}->[0]->{Gal}}, $recurse->($gal);
+        }
+    }
+
+    # register return value with parent Request
+    $resp->add_method_vars(GetGalsTree => $ret);
+
+    return 1;
+}
+
+1;

Added: trunk/lib/FB/Protocol/Fotki/GetPics.pm
===================================================================
--- trunk/lib/FB/Protocol/Fotki/GetPics.pm	                        (rev 0)
+++ trunk/lib/FB/Protocol/Fotki/GetPics.pm	2011-11-28 15:35:57 UTC (rev 1455)
@@ -0,0 +1,111 @@
+#!/usr/bin/perl
+
+package FB::Protocol::Fotki::GetPics;
+
+use strict;
+use LJ::Fotki::Photo;
+
+sub handler {
+    my $resp = shift or return undef;
+    my $req  = $resp->{req};
+    my $vars = $req->{vars};
+    my $u = $resp->{u};
+
+    my $err = sub {
+        $resp->add_method_error(GetPics => @_);
+        return undef;
+    };
+
+    my $lj_userid = FB::get_domain_userid($u);
+    my $lj_user = LJ::load_userid($lj_userid);
+
+    # TODO: eval to catch all errors
+    my $photos = LJ::Fotki::Photo->get_all_photos($lj_userid, $lj_user);
+
+    my $ret = { Pic => [] };
+
+    if (scalar(@$photos)) {
+        for my $photo (@$photos) {
+            next unless($photo);
+
+            push @{$ret->{Pic}}, {
+                id         => $photo->photo_id,
+                Sec        => [ $photo->get_security ],   # TODO: convert mask!!!
+#                Width      => [ $pic->{width} ],       # TODO: necessary to support original photo sizes
+#                Height     => [ $pic->{height} ],
+#                Bytes      => [ $pic->{bytes} ],       # TODO: original photo size
+#                Format     => [ FB::fmtid_to_mime($pic->{fmtid}) ],    # TODO: Format of the original photo
+#                MD5        => [ FB::bin_to_hex($gpic_md5->{$pic->{gpicid}}) ],
+                URL        => [ $photo->orig_url  ],
+                Meta       => [ map { 
+                                     { name    => $_->[0], 
+                                       content => $pic->($_->[1])() }
+                                    } ( #['filename'    => 'filename' ],  # TODO: To be done
+                                       ['title'       => 'title' ],
+                                       ['description' => 'desc'      ])
+                              ],
+            };
+
+        }
+    }
+
+    # register return value with parent Request
+    $resp->add_method_vars(GetPics => $ret);
+
+    return 1;
+}
+
+
+sub handler_old {
+    my $resp = shift or return undef;
+    my $req  = $resp->{req};
+    my $vars = $req->{vars};
+    my $u = $resp->{u};
+
+    my $err = sub {
+        $resp->add_method_error(GetPics => @_);
+        return undef;
+    };
+
+    my $ret = { Pic => [] };
+    my $upics = FB::upics_of_user($u, { props => [ qw(filename pictitle) ] });
+    return $err->(500 => FB::last_error) unless ref $upics eq 'HASH';
+
+    if (%$upics) {
+
+        # get md5s of all the gpics
+        my $gpic_md5      = FB::get_gpic_md5_multi([ map { $_->{gpicid} } values %$upics ]);
+        return $err->(500 => FB::last_error()) unless ref $gpic_md5 eq 'HASH';
+
+        my @pics_with_des = FB::get_des_multi($u, 'P', [ values %$upics ]);
+        return $err->(500 => FB::last_error()) unless ref $pics_with_des[0] eq 'HASH';
+
+        foreach my $pic (sort { $a->{upicid} <=> $b->{upicid} } @pics_with_des) {
+
+            push @{$ret->{Pic}}, {
+                id         => $pic->{upicid},
+                Sec        => [ $pic->{secid} ],
+                Width      => [ $pic->{width} ],
+                Height     => [ $pic->{height} ],
+                Bytes      => [ $pic->{bytes} ],
+                Format     => [ FB::fmtid_to_mime($pic->{fmtid}) ],
+                MD5        => [ FB::bin_to_hex($gpic_md5->{$pic->{gpicid}}) ],
+                URL        => [ FB::url_picture($u, $pic) ],
+                Meta       => [ map { 
+                                     { name    => $_->[0], 
+                                       content => $pic->{$_->[1]} }
+                                    } (['filename'    => 'filename' ],
+                                       ['title'       => 'pictitle' ],
+                                       ['description' => 'des'      ])
+                              ],
+            };
+        }
+    }
+
+    # register return value with parent Request
+    $resp->add_method_vars(GetPics => $ret);
+
+    return 1;
+}
+
+1;

Added: trunk/lib/FB/Protocol/Fotki/Login.pm
===================================================================
--- trunk/lib/FB/Protocol/Fotki/Login.pm	                        (rev 0)
+++ trunk/lib/FB/Protocol/Fotki/Login.pm	2011-11-28 15:35:57 UTC (rev 1455)
@@ -0,0 +1,93 @@
+#!/usr/bin/perl
+
+package FB::Protocol::Fotki::Login;
+
+use strict;
+use LJ::Fotki::UserSpace;
+
+sub handler {
+    my $resp = shift or return undef;
+    my $req  = $resp->{req};
+    my $vars = $req->{vars}->{Login};
+    my $u    = $resp->{u};
+
+    my $lj_userid = FB::get_domain_userid($u);
+    my $lj_user = LJ::load_userid($lj_userid);
+
+    my $err = sub {
+        $resp->add_method_error(Login => @_);
+        return undef;
+    };
+
+    my $ret = { ServerTime => [ FB::date_unix_to_mysql() ]};
+
+    # store client version in $r->notes so we can log it optionally
+    # to keep stats
+    if (defined $vars->{ClientVersion}) {
+        LJ::Request->notes(ProtocolClientVersion => $vars->{ClientVersion});
+    }
+
+    # Get available space for the user
+    my $spaces = LJ::Fotki::UserSpace->get_spaces($lj_user);
+
+    if (ref $spaces eq 'ARRAY') {
+        my $free_space = $spaces->[3] - $spaces->[0]; 
+        $free_space = 0 if $free_space < 0;
+        $ret->{Quota} = {
+            Total     => [ $spaces->[3] ], # kb -> bytes
+            Used      => [ $spaces->[0] ],
+            Remaining => [ $free_space ],
+        };
+    }
+
+    # are there any current system messages applying to this user?
+    $ret->{Message} = [ FB::get_system_message($u) . '' ];
+
+    # register return value with parent Request
+    $resp->add_method_vars( Login => $ret );
+
+    return 1;
+}
+
+sub handler_old {
+    my $resp = shift or return undef;
+    my $req  = $resp->{req};
+    my $vars = $req->{vars}->{Login};
+    my $u    = $resp->{u};
+
+    my $err = sub {
+        $resp->add_method_error(Login => @_);
+        return undef;
+    };
+
+    my $ret = { ServerTime => [ FB::date_unix_to_mysql() ]};
+
+    # store client version in $r->notes so we can log it optionally
+    # to keep stats
+    if (defined $vars->{ClientVersion}) {
+        LJ::Request->notes(ProtocolClientVersion => $vars->{ClientVersion});
+    }
+
+    # look up quota and usage information to return with this request
+    if (FB::are_hooks('disk_usage_info')) {
+
+        my $qinf = FB::run_hook('disk_usage_info', $u);
+        if (ref $qinf eq 'HASH') {
+            $ret->{Quota} = {
+                Total     => [ $qinf->{quota} * (1 << 10) ], # kb -> bytes
+                Used      => [ $qinf->{used}  * (1 << 10) ],
+                Remaining => [ $qinf->{free}  * (1 << 10) ],
+            };
+        }
+    }
+
+    # are there any current system messages applying to this user?
+    $ret->{Message} = [ FB::get_system_message($u) . '' ];
+
+    # register return value with parent Request
+    $resp->add_method_vars( Login => $ret );
+
+    return 1;
+}
+
+1;

Modified: trunk/lib/FB/Protocol/Fotki/UploadPic.pm
===================================================================
--- trunk/lib/FB/Protocol/Fotki/UploadPic.pm	2011-11-25 15:46:00 UTC (rev 1454)
+++ trunk/lib/FB/Protocol/Fotki/UploadPic.pm	2011-11-28 15:35:57 UTC (rev 1455)
@@ -110,15 +110,16 @@
     return $err->(402) if $spaces->[3] < $length;
 
 
-    # TODO: process Galleries
+    # TODO: process Galleries: add uploaded photo into specified galleries (albums)
 
 
 
 
-
-    # get default upload album
+    # use default upload album
     my $album = LJ::Fotki::Album->get_default_album($lj_user);
 
+    # upload photo to fotki and create
+
     my $content = '';
     seek $img->{spool_fh}, 0,0;
     read $img->{spool_fh}, $content, $length;

Modified: trunk/lib/FB/Protocol/Response.pm
===================================================================
--- trunk/lib/FB/Protocol/Response.pm	2011-11-25 15:46:00 UTC (rev 1454)
+++ trunk/lib/FB/Protocol/Response.pm	2011-11-28 15:35:57 UTC (rev 1455)
@@ -28,8 +28,11 @@
                                         );
 
     %VALID_METHODS_v2 = map { $_ => 1 } qw(
+                                        CreateGals
                                         GetGals
-                                        CreateGals
+                                        GetGalsTree
+                                        GetPics
+                                        Login
                                         UploadPic
                                         );
 

Tags: fotobilder, pm, sunnyman, vtroitsky
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments