Skip to content
Draft

CMM #665

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
89b2d33
Starting work, models, schemas and a few crud functions
Daihecyy Dec 13, 2024
0d093ac
Get memes endpoint
Daihecyy Dec 13, 2024
4b016ae
POST endpoint
Daihecyy Dec 16, 2024
6697cd9
All basic meme endpoints
Daihecyy Dec 16, 2024
baf2b0f
Commit for peer review
Daihecyy Dec 18, 2024
789c94e
All endpoints except ban, need fix for get_memes
Daihecyy Dec 20, 2024
85e0607
All working endpoints, tests to do next
Daihecyy Dec 21, 2024
498ce26
Inbetween commit
Daihecyy Dec 23, 2024
abcf8a8
Fix cruds
foucblg Dec 23, 2024
567efe3
First passing test
Daihecyy Dec 23, 2024
756b4ba
Semiworking single SQL full meme request
Daihecyy Dec 24, 2024
22ca911
Fully working single SQL request for full memes
Daihecyy Dec 24, 2024
9291405
Few fixes
Daihecyy Jan 6, 2025
c5c8fce
Fix ?
Daihecyy Jan 11, 2025
7ef1e35
Fixes
Daihecyy Jan 11, 2025
3f26007
Added id to shown meme
Daihecyy Jan 11, 2025
a259ad9
Fixed vote score
Daihecyy Jan 11, 2025
a4acd40
Fixed vote schema
Daihecyy Jan 11, 2025
dffc861
Fix response type
Daihecyy Jan 11, 2025
e5f1800
Fixed score compute
Daihecyy Jan 11, 2025
d6b306e
Block Foucauld's POSTs
Daihecyy Jan 11, 2025
e737794
Small fix
Daihecyy Jan 11, 2025
d02fda4
Small fix
Daihecyy Jan 11, 2025
17d74e1
Fix error de golmon
Daihecyy Jan 11, 2025
28b1ecf
Working ban/unban
Daihecyy Jan 11, 2025
d15a104
fix : update
foucblg Feb 10, 2025
bd6979d
feat : update ban
foucblg Feb 10, 2025
1cac048
Working hidden memes
foucblg Feb 10, 2025
d8a9406
feat : leaderbord
BLEMENT33 Feb 10, 2025
4c49701
Merge feat
foucblg Feb 10, 2025
cb4e936
fix : get_all_meme
foucblg Feb 11, 2025
facb739
Format
foucblg Feb 11, 2025
95b00b8
fix : score update
foucblg Feb 12, 2025
df1bc22
Fix : leaderboard endpoint
foucblg Feb 12, 2025
65d0a3b
fix : current banned user
foucblg Feb 14, 2025
479b9dd
fix : type checking
foucblg Feb 15, 2025
bf5e49e
feat : migration and last fixes
foucblg Feb 15, 2025
9f8cc54
Rename folder
foucblg Feb 15, 2025
6d985fa
fix : remove useless await
foucblg Feb 15, 2025
bb9a4c2
feat : remove page feature
foucblg Feb 17, 2025
0d1dd1e
fix : answers
foucblg Feb 22, 2025
6016bba
fix : various improvement
foucblg Feb 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/core/groups/groups_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class GroupType(str, Enum):
ph = "4ec5ae77-f955-4309-96a5-19cc3c8be71c"
admin_cdr = "c1275229-46b2-4e53-a7c4-305513bb1a2a"
eclair = "1f841bd9-00be-41a7-96e1-860a18a46105"
meme = "3e5b04e5-5b19-4950-8e6a-143bdf559290"

# Auth related groups

Expand Down
Empty file added app/modules/meme/__init__.py
Empty file.
363 changes: 363 additions & 0 deletions app/modules/meme/cruds_meme.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,363 @@
import uuid
from collections.abc import Sequence
from datetime import UTC, datetime, timedelta
from uuid import UUID

from sqlalchemy import delete, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload

from app.core import models_core
from app.modules.meme import models_meme, types_meme

n_weeks = 7


async def get_memes_by_date(
db: AsyncSession,
descending: bool,
user_id: str,
) -> Sequence[models_meme.Meme]:
result = await db.execute(
select(models_meme.Meme)
.options(
selectinload(
models_meme.Meme.votes.and_(models_meme.Vote.user_id == user_id),
).load_only(models_meme.Vote.positive),
selectinload(models_meme.Meme.user),
)
.execution_options(populate_existing=True)
.where(models_meme.Meme.status == types_meme.MemeStatus.neutral)
.order_by(
models_meme.Meme.creation_time.desc()
if descending
else models_meme.Meme.creation_time,
),
)
meme_page = result.scalars().all()
return meme_page


async def get_my_memes(
db: AsyncSession,
user_id: str,
) -> Sequence[models_meme.Meme]:
result = await db.execute(
select(models_meme.Meme)
.options(
selectinload(
models_meme.Meme.votes.and_(models_meme.Vote.user_id == user_id),
).load_only(models_meme.Vote.positive),
selectinload(models_meme.Meme.user),
)
.execution_options(populate_existing=True)
.where(models_meme.Meme.user_id == user_id)
.order_by(models_meme.Meme.creation_time.desc())

Check failure on line 55 in app/modules/meme/cruds_meme.py

View workflow job for this annotation

GitHub Actions / lintandformat

Ruff (COM812)

app/modules/meme/cruds_meme.py:55:57: COM812 Trailing comma missing
)
meme_page = result.scalars().all()
return meme_page


async def get_memes_by_votes(
db: AsyncSession,
descending: bool,
user_id: str,
) -> Sequence[models_meme.Meme]:
result = await db.execute(
select(models_meme.Meme)
.where(models_meme.Meme.status == types_meme.MemeStatus.neutral)
.options(
selectinload(
models_meme.Meme.votes.and_(models_meme.Vote.user_id == user_id),
).load_only(models_meme.Vote.positive),
selectinload(models_meme.Meme.user),
)
.execution_options(populate_existing=True)
.order_by(
models_meme.Meme.vote_score.desc()
if descending
else models_meme.Meme.vote_score,
),
)
meme_page = result.scalars().all()
return meme_page


async def get_trending_memes(
db: AsyncSession,
user_id: str,
) -> Sequence[models_meme.Meme]:
result = await db.execute(
select(models_meme.Meme)
.order_by(models_meme.Meme.vote_score)
.options(
selectinload(
models_meme.Meme.votes.and_(models_meme.Vote.user_id == user_id),
).load_only(models_meme.Vote.positive),
selectinload(models_meme.Meme.user),
)
.execution_options(populate_existing=True)
.where(
(models_meme.Meme.creation_time - datetime.now(tz=UTC))
< timedelta(days=n_weeks),
models_meme.Meme.status == types_meme.MemeStatus.neutral,
),
)
meme_page = result.scalars().all()
return meme_page


async def get_memes_from_user(
db: AsyncSession,
user_id: str,
) -> Sequence[models_meme.Meme]:
result = await db.execute(
select(models_meme.Meme)
.options(
selectinload(
models_meme.Meme.votes.and_(models_meme.Vote.user_id == user_id),
).load_only(models_meme.Vote.positive),
selectinload(models_meme.Meme.user),
)
.execution_options(populate_existing=True)
.where(
models_meme.Meme.user_id == user_id,
models_meme.Meme.status == types_meme.MemeStatus.neutral,
)
.order_by(models_meme.Meme.creation_time),
)
meme_page = result.scalars().all()
return meme_page


async def update_ban_status_of_memes_from_user(
db: AsyncSession,
user_id: str,
new_ban_status: types_meme.MemeStatus,
):
await db.execute(
update(models_meme.Meme)
.where(models_meme.Meme.user_id == user_id)
.values({models_meme.Meme.status: new_ban_status}),
)


async def get_meme_by_id(
db: AsyncSession,
meme_id: uuid.UUID,
user_id: str,
) -> models_meme.Meme | None:
result = await db.execute(
select(models_meme.Meme)
.options(
selectinload(
models_meme.Meme.votes.and_(
models_meme.Vote.user_id == user_id,
),
).load_only(models_meme.Vote.positive),
selectinload(models_meme.Meme.user),
)
.execution_options(populate_existing=True)
.where(models_meme.Meme.id == meme_id),
)
return result.unique().scalars().first()


def add_meme(db: AsyncSession, meme: models_meme.Meme):
db.add(meme)


async def update_meme_ban_status(
db: AsyncSession,
ban_status: types_meme.MemeStatus,
meme_id: UUID,
):
await db.execute(
update(models_meme.Meme)
.where(models_meme.Meme.id == meme_id)
.values({models_meme.Meme.status: ban_status}),
)


async def update_meme_vote_score(
db: AsyncSession,
old_positive: bool | None,
new_positive: bool | None,
meme_id: UUID,
):
if old_positive == new_positive:
score_diff = 0
elif old_positive is None:
score_diff = 1 if new_positive else -1
elif not old_positive:
score_diff = 1 if new_positive is None else 2
else:
# old_positve == True
score_diff = -1 if new_positive is None else -2

await db.execute(
update(models_meme.Meme)
.where(models_meme.Meme.id == meme_id)
.values(
{models_meme.Meme.vote_score: models_meme.Meme.vote_score + score_diff},
),
)


async def delete_meme_by_id(db: AsyncSession, meme_id: UUID):
await db.execute(
delete(models_meme.Meme).where(models_meme.Meme.id == meme_id),
)


async def get_vote(
db: AsyncSession,
meme_id: UUID,
user_id: str,
) -> models_meme.Vote | None:
result = await db.execute(
select(models_meme.Vote).where(
models_meme.Vote.meme_id == meme_id,
models_meme.Vote.user_id == user_id,
),
)
return result.unique().scalars().first()


async def get_vote_by_id(
db: AsyncSession,
vote_id: UUID,
) -> models_meme.Vote | None:
result = await db.execute(
select(models_meme.Vote).where(models_meme.Vote.id == vote_id),
)
return result.unique().scalars().first()


def add_vote(db: AsyncSession, vote: models_meme.Vote):
db.add(vote)


async def update_vote(db: AsyncSession, vote_id: UUID, new_positive: bool):
await db.execute(
update(models_meme.Vote)
.where(models_meme.Vote.id == vote_id)
.values({models_meme.Vote.positive: new_positive}),
)


async def delete_vote(db: AsyncSession, vote_id: UUID):
await db.execute(
delete(models_meme.Vote).where(models_meme.Vote.id == vote_id),
)


async def get_ban_by_id(
db: AsyncSession,
ban_id: UUID,
) -> models_meme.Ban | None:
result = await db.execute(
select(models_meme.Ban).where(models_meme.Ban.id == ban_id),
)
return result.unique().scalars().first()


async def get_user_current_ban(
db: AsyncSession,
user_id: str,
) -> models_meme.Ban | None:
result = await db.execute(
select(models_meme.Ban).where(
models_meme.Ban.user_id == user_id,
models_meme.Ban.end_time.is_(None),
),
)
return result.unique().scalars().first()


async def get_user_ban_history(
db: AsyncSession,
user_id: str,
) -> Sequence[models_meme.Ban]:
result = await db.execute(
select(models_meme.Ban)
.where(models_meme.Ban.user_id == user_id)
.order_by(models_meme.Ban.creation_time),
)
return result.scalars().all()


def add_user_ban(db: AsyncSession, ban: models_meme.Ban):
db.add(ban)


async def update_end_of_ban(db: AsyncSession, end_time: datetime, ban_id: UUID):
await db.execute(
update(models_meme.Ban)
.where(models_meme.Ban.id == ban_id)
.values({models_meme.Ban.end_time: end_time}),
)


async def delete_ban(db: AsyncSession, ban_id: UUID):
await db.execute(
delete(models_meme.Ban).where(models_meme.Ban.id == ban_id),
)


async def get_banned_users(db: AsyncSession) -> Sequence[models_core.CoreUser]:
result = await db.execute(
select(models_core.CoreUser)
.join(models_meme.Ban, models_core.CoreUser.id == models_meme.Ban.user_id)
.where(models_meme.Ban.end_time.is_(None))
.order_by(models_meme.Ban.creation_time),
)
return result.scalars().all()


async def get_hidden_memes(
db: AsyncSession,
descending: bool,
user_id: str,
) -> Sequence[models_meme.Meme]:
result = await db.execute(
select(models_meme.Meme)
.options(
selectinload(
models_meme.Meme.votes.and_(models_meme.Vote.user_id == user_id),
).load_only(models_meme.Vote.positive),
selectinload(models_meme.Meme.user),
)
.execution_options(populate_existing=True)
.where(models_meme.Meme.status == types_meme.MemeStatus.hidden)
.order_by(
models_meme.Meme.creation_time.desc()
if descending
else models_meme.Meme.creation_time,
),
)
return result.scalars().all()


async def get_all_memes(db: AsyncSession, n_jours) -> Sequence[models_meme.Meme]:
if n_jours == -1:
result = await db.execute(
select(models_meme.Meme)
.where(
models_meme.Meme.status == types_meme.MemeStatus.neutral,
)
.options(selectinload(models_meme.Meme.user)),
)

else:
threshold_date = datetime.now(tz=UTC) - timedelta(days=n_jours)

result = await db.execute(
select(models_meme.Meme)
.where(
models_meme.Meme.creation_time >= threshold_date,
models_meme.Meme.status == types_meme.MemeStatus.neutral,
)
.options(selectinload(models_meme.Meme.user)),
)
return result.scalars().all()
Loading
Loading