鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

お絵かき画像をMojoliciousでサーバーサイドに保存する

クオリティはあれなんですが、やっとReact+SVGでお絵かきができるように
なったので、サーバサイドに保存してみたくなった。
JSON-RPCを使ってみよう。以下とても、参考になりそう。qiita.com

セッションに紐づけて保存したいので、
そこはHayajoさんのモジュールを使ってみよう。

hayajo.hatenablog.com

セッションIDだけを保存して、セッションIDに紐づけて、JSON文字列を保存するようにした

package AgeWatch::Service::RPCService;

use Mojo::Base 'MojoX::JSON::RPC::Service';
use JSON::XS;

my @METHODS = qw/ save load /;

sub new {
    my $class = shift;
    my $self = $class->SUPER::new(@_);

    for(@METHODS){
        $self->register(
            $_ => \&{$_},
            {
                with_self => 1.
            }
        );
    }

    return $self;
}

sub save {
    my ($app, $param) = @_;

    $app->session(expiration => 31536000);

    my $session_id = $app->session_options->{id};
    my $json = encode_json($param);
    my $row = $app->db->single('AgeWatch', {session_id => $session_id});
    if (defined $row){
      $row->update(
        {
          json       => $json,
          update_at  => \"Now()"
        }
      );
    }
    else{
      my $route = $app->db->insert('AgeWatch',
        {
          session_id => $session_id,
          json       => $json,
          create_at  => \"Now()"
        }
      );
    }

    return "ok";
}

sub load {
    my ($app, $param) = @_;

    my $session_id = $app->session_options->{id};

    my $row = $app->db->single('AgeWatch', {session_id => $session_id});

    if (defined $row ){
      return decode_json($row->json);
    }
    else{
      return {birthday =>{year=> 1970, month=>1, day => 1} , paths => []};
    }
}

1;