mirror of
				https://github.com/maunium/stickerpicker.git
				synced 2025-10-31 00:48:08 +01:00 
			
		
		
		
	Make some basic pack creating endpoints work
This commit is contained in:
		| @@ -14,6 +14,7 @@ | ||||
| # You should have received a copy of the GNU Affero General Public License | ||||
| # along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| from typing import List, Dict, Any | ||||
| import json | ||||
|  | ||||
| from attr import dataclass | ||||
|  | ||||
| @@ -35,15 +36,20 @@ class Pack(Base): | ||||
|  | ||||
|     async def insert(self) -> None: | ||||
|         await self.db.execute("INSERT INTO pack (id, owner, title, meta) VALUES ($1, $2, $3, $4)", | ||||
|                               self.id, self.owner, self.title, self.meta) | ||||
|                               self.id, self.owner, self.title, json.dumps(self.meta)) | ||||
|  | ||||
|     @classmethod | ||||
|     def from_data(cls, **data: Any) -> 'Pack': | ||||
|         meta = json.loads(data.pop("meta")) | ||||
|         return cls(**data, meta=meta) | ||||
|  | ||||
|     async def get_stickers(self) -> List[Sticker]: | ||||
|         res = await self.db.fetch('SELECT id, url, body, meta, "order" ' | ||||
|                                   'FROM sticker WHERE pack_id=$1 ORDER BY "order"', self.id) | ||||
|         return [Sticker(**row, pack_id=self.id) for row in res] | ||||
|         return [Sticker.from_data(**row, pack_id=self.id) for row in res] | ||||
|  | ||||
|     async def set_stickers(self, stickers: List[Sticker]) -> None: | ||||
|         data = ((sticker.id, self.id, sticker.url, sticker.body, sticker.meta, order) | ||||
|         data = ((sticker.id, self.id, sticker.url, sticker.body, json.dumps(sticker.meta), order) | ||||
|                 for order, sticker in enumerate(stickers)) | ||||
|         columns = ["id", "pack_id", "url", "body", "meta", "order"] | ||||
|         async with self.db.acquire() as conn, conn.transaction(): | ||||
|   | ||||
| @@ -14,6 +14,7 @@ | ||||
| # You should have received a copy of the GNU Affero General Public License | ||||
| # along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||
| from typing import Dict, Any | ||||
| import json | ||||
|  | ||||
| from attr import dataclass | ||||
| import attr | ||||
| @@ -26,20 +27,12 @@ from .base import Base | ||||
| @dataclass(kw_only=True) | ||||
| class Sticker(Base): | ||||
|     pack_id: str | ||||
|     order: int | ||||
|     order: int = 0 | ||||
|     id: str | ||||
|     url: ContentURI = attr.ib(order=False) | ||||
|     body: str = attr.ib(order=False) | ||||
|     meta: Dict[str, Any] = attr.ib(order=False) | ||||
|  | ||||
|     async def delete(self) -> None: | ||||
|         await self.db.execute("DELETE FROM sticker WHERE id=$1", self.id) | ||||
|  | ||||
|     async def insert(self) -> None: | ||||
|         await self.db.execute('INSERT INTO sticker (id, pack_id, url, body, meta, "order") ' | ||||
|                               "VALUES ($1, $2, $3, $4, $5, $6)", | ||||
|                               self.id, self.pack_id, self.url, self.body, self.meta, self.order) | ||||
|  | ||||
|     def to_dict(self) -> Dict[str, Any]: | ||||
|         return { | ||||
|             **self.meta, | ||||
| @@ -47,3 +40,8 @@ class Sticker(Base): | ||||
|             "url": self.url, | ||||
|             "id": self.id, | ||||
|         } | ||||
|  | ||||
|     @classmethod | ||||
|     def from_data(cls, **data: Any) -> 'Sticker': | ||||
|         meta = json.loads(data.pop("meta")) | ||||
|         return cls(**data, meta=meta) | ||||
|   | ||||
| @@ -47,10 +47,11 @@ async def upgrade_v1(conn: Connection) -> None: | ||||
|         PRIMARY KEY (user_id, pack_id) | ||||
|     )""") | ||||
|     await conn.execute("""CREATE TABLE sticker ( | ||||
|         id      TEXT  PRIMARY KEY, | ||||
|         pack_id TEXT  NOT NULL REFERENCES pack(id) ON DELETE CASCADE, | ||||
|         id      TEXT, | ||||
|         pack_id TEXT  REFERENCES pack(id) ON DELETE CASCADE, | ||||
|         url     TEXT  NOT NULL, | ||||
|         body    TEXT  NOT NULL, | ||||
|         meta    JSONB NOT NULL, | ||||
|         "order" INT   NOT NULL DEFAULT 0 | ||||
|         "order" INT   NOT NULL DEFAULT 0, | ||||
|         PRIMARY KEY (id, pack_id) | ||||
|     )""") | ||||
|   | ||||
| @@ -16,6 +16,7 @@ | ||||
| from typing import Optional, List, ClassVar | ||||
| import random | ||||
| import string | ||||
| import time | ||||
|  | ||||
| from attr import dataclass | ||||
| import asyncpg | ||||
| @@ -76,7 +77,7 @@ class User(Base): | ||||
|         res = await self.db.fetch("SELECT id, owner, title, meta FROM user_pack " | ||||
|                                   "LEFT JOIN pack ON pack.id=user_pack.pack_id " | ||||
|                                   'WHERE user_id=$1 ORDER BY "order"', self.id) | ||||
|         return [Pack(**row) for row in res] | ||||
|         return [Pack.from_data(**row) for row in res] | ||||
|  | ||||
|     async def get_pack(self, pack_id: str) -> Optional[Pack]: | ||||
|         row = await self.db.fetchrow("SELECT id, owner, title, meta FROM user_pack " | ||||
| @@ -84,7 +85,7 @@ class User(Base): | ||||
|                                      "WHERE user_id=$1 AND pack_id=$2", self.id, pack_id) | ||||
|         if row is None: | ||||
|             return None | ||||
|         return Pack(**row) | ||||
|         return Pack.from_data(**row) | ||||
|  | ||||
|     async def set_packs(self, packs: List[Pack]) -> None: | ||||
|         data = ((self.id, pack.id, order) | ||||
| @@ -93,3 +94,11 @@ class User(Base): | ||||
|         async with self.db.acquire() as conn, conn.transaction(): | ||||
|             await conn.execute("DELETE FROM user_pack WHERE user_id=$1", self.id) | ||||
|             await conn.copy_records_to_table("user_pack", records=data, columns=columns) | ||||
|  | ||||
|     async def add_pack(self, pack: Pack) -> None: | ||||
|         q = 'INSERT INTO user_pack (user_id, pack_id, "order") VALUES ($1, $2, $3)' | ||||
|         await self.db.execute(q, self.id, pack.id, int(time.time())) | ||||
|  | ||||
|     async def remove_pack(self, pack: Pack) -> None: | ||||
|         q = "DELETE FROM user_pack WHERE user_id=$1 AND pack_id=$2" | ||||
|         await self.db.execute(q, self.id, pack.id) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user