Skip to content
Plaristote edited this page Nov 9, 2015 · 5 revisions
void AvatarController::update()
{
  const Params::File* avatar_file = params.get_upload("user[avatar]");

  if (avatar_file)
    response["status"] = 422;
  else
    set_avatar(avatar_file);
}

void AvatarController::set_avatar(const Crails::Params::File* file)
{
  typedef odb::pgsql::query<User> query;
  odb::pgsql::database& database = CRAILS_DATABASE(ODB, "main").get_database();
  safe_ptr<User> user = database.query_one<User>(query::id == params["id"].as<unsigned long>());

  if (user)
  {
    odb::transaction t(database.begin());

    user->set_avatar(file);
    database.persist(user);
    t.commit();
  }
  else
    reponse["status"] = 404;
}

User model

#ifndef USER_HPP
# define USER_HPP

# include <odb/core.hxx>
# include <crails/image.hpp>
# include <crails/params.hpp>

# pragma db object
class User
{
  friend class odb::access;

  class Avatar : Crails::BasicImage
  {
  public:
    std::string get_default_image_path() const { return "/images/default_avatar.png"; }
    void generate_thumbnails() { perform_crop("thumb", 200, 200, BasicImage::PreserveAspectRatio); }
  };

public:
  void set_avatar(const Crails::Params::File* file)
  {
    Avatar avatar(avatar_uid);

    avatar.use_uploaded_file(file);
    avatar.generate_thumbnails(); // you may want to do this in a task or thread, rather than during the client's request
  }

  std::string get_avatar_path(const std::string& transformation_name = "")
  {
    return (Avatar(avatar_uid)).get_path(transformation_name);
  }

private:
  #pragma db id auto
  unsigned long id;

  std::string avatar_uid;
}

#endif