use chrono::Utc;
use diesel::prelude::*;
#[cfg(feature = "napi")]
use napi_derive::napi;
#[cfg(feature = "pyo3")]
use pyo3::prelude::*;
#[cfg(feature = "pyo3")]
use rbox_derives::PyMutableMapping;
use super::schema::recommendedLike;
use super::{Date, DateString};
use crate::model_traits::{Model, ModelDelete, ModelInsert, ModelUpdate};
#[cfg(feature = "pyo3")]
use crate::util::{PyItemsIter, PyObjectIter, PyStrIter};
#[derive(Debug, Clone, PartialEq, HasQuery, Identifiable, AsChangeset, Insertable)]
#[diesel(table_name = recommendedLike)]
#[diesel(primary_key(content_id_1, content_id_2))]
#[diesel(check_for_backend(diesel::sqlite::Sqlite))]
#[cfg_attr(feature = "pyo3", pyclass(get_all, set_all, mapping))]
#[cfg_attr(feature = "pyo3", derive(PyMutableMapping))]
#[cfg_attr(feature = "napi", napi(object))]
pub struct RecommendedLike {
pub content_id_1: i32,
pub content_id_2: i32,
pub rating: i32,
#[diesel(serialize_as = DateString)]
#[diesel(deserialize_as = DateString)]
pub created_date: Date,
}
impl Model for RecommendedLike {
type Id = (i32, i32);
fn all(conn: &mut SqliteConnection) -> QueryResult<Vec<Self>> {
Self::query().load(conn)
}
fn find(conn: &mut SqliteConnection, id: &Self::Id) -> QueryResult<Option<Self>> {
Self::query().find(*id).first(conn).optional()
}
fn id_exists(conn: &mut SqliteConnection, id: &Self::Id) -> QueryResult<bool> {
diesel::dsl::select(diesel::dsl::exists(Self::query().find(*id))).get_result(conn)
}
}
impl ModelUpdate for RecommendedLike {
fn update(self, conn: &mut SqliteConnection) -> QueryResult<Self> {
diesel::update(recommendedLike::table.find((self.content_id_1, self.content_id_2)))
.set(self)
.get_result(conn)
}
}
impl ModelDelete for RecommendedLike {
fn delete(conn: &mut SqliteConnection, id: &Self::Id) -> QueryResult<usize> {
diesel::delete(recommendedLike::table.find(*id)).execute(conn)
}
}
impl ModelInsert for RecommendedLike {
type Model = Self;
fn insert(self, conn: &mut SqliteConnection) -> QueryResult<Self::Model> {
diesel::insert_into(recommendedLike::table)
.values(self)
.get_result(conn)
}
}
impl RecommendedLike {
pub fn new(content_id_1: i32, content_id_2: i32, rating: i32) -> Self {
let created_date = Utc::now();
Self {
content_id_1,
content_id_2,
rating,
created_date,
}
}
pub fn by_content_id(conn: &mut SqliteConnection, content_id: i32) -> QueryResult<Vec<Self>> {
Self::query()
.filter(
recommendedLike::content_id_1
.eq(content_id)
.or(recommendedLike::content_id_2.eq(content_id)),
)
.load(conn)
}
pub fn related_content_ids(
conn: &mut SqliteConnection,
content_id: i32,
) -> QueryResult<Vec<i32>> {
let items = Self::query()
.filter(
recommendedLike::content_id_1
.eq(content_id)
.or(recommendedLike::content_id_2.eq(content_id)),
)
.load(conn);
let mut ids = Vec::new();
for item in items? {
if item.content_id_1 == content_id {
ids.push(item.content_id_2);
} else {
ids.push(item.content_id_1);
}
}
Ok(ids)
}
pub fn delete_by_content_id(conn: &mut SqliteConnection, id: i32) -> QueryResult<usize> {
diesel::delete(
recommendedLike::table.filter(
recommendedLike::content_id_1
.eq(id)
.or(recommendedLike::content_id_2.eq(id)),
),
)
.execute(conn)
}
pub fn delete_by_content_ids(conn: &mut SqliteConnection, ids: &[i32]) -> QueryResult<usize> {
diesel::delete(
recommendedLike::table.filter(
recommendedLike::content_id_1
.eq_any(ids)
.or(recommendedLike::content_id_2.eq_any(ids)),
),
)
.execute(conn)
}
}