moshee / books

???????
BSD 2-Clause "Simplified" License
0 stars 0 forks source link

Feeds #8

Open moshee opened 10 years ago

moshee commented 10 years ago

Instead of (or maybe in addition to) lists, I think it would be nice to try implementing feeds. Rather than lists of series, these would be descriptions, constraints, filters.

What first comes to mind for the database side:

CREATE TABLE books.feeds (
    id serial PRIMARY KEY,
    kind integer NOT NULL DEFAULT 0, -- Predefined, user, ...
    key bytea NOT NULL UNIQUE, -- A random string of bytes that identifies this feed (don't use the id)
    spec text NOT NULL, -- Could be in any format. Dunno yet. Description of feed contents.
    owner integer NOT NULL REFERENCES books.users,
    name text,
    description text,
    date_created timestamptz NOT NULL DEFAULT 'now'::timestamptz
)

CREATE TABLE books.feed_permissions (
    id serial PRIMARY KEY,
    feed_id integer NOT NULL REFERENCES books.feeds,
    user_id integer NOT NULL REFERENCES books.users,
    action integer NOT NULL -- allow, disallow, ...
)
moshee commented 10 years ago

Brainstorming

The feed spec would need

Something to think about in the far future: related feeds. A feed that displays releases/series info of series related to one or more series.

Release feeds

SELECT *
FROM
    recent_releases releases,
    -- ...
WHERE...

author → releases

releases.series_id = series.id
author.id = credits.author_id
    AND credits.series_id = series.id
    AND author.id = $1

series → releases

releases.series_id = series.id
series.id = $1

group → releases

releases.translator_id = releases_translators.translator_id
    AND releases_translators.translator_id = $1

tag → releases

releases.series_id = series.id
series.id = tag.series_id
    AND tag_names.id = tag.tag_id
    AND tag_names.name = $1

demographic → releases

releases.series_id = series.id
    AND series.demographic = $1

Note: $1 is not a foreign key, but an enum, in this case.

magazine → releases

releases.series_id = series.id
series.magazine_id = magazine.id
    AND magazine.id = $1

publishers → releases

releases.series_id = series.id
series.magazine_id = magazine.id
    AND magazine.publisher_id = publisher.id
    AND publisher.id = $1

Series feeds

SELECT DISTINCT ON (series.id)
    series.id,
    series.name,
    -- ...
FROM
    book_series series,
    -- ...
WHERE...

In many cases, the series queries are degenerate cases of the release ones, just lacking the join to releases.

author → series

author.id = credits.author_id
    AND credits.series_id = series.id
    AND author.id = $1

series → series

series.id = $1

group → series

releases.series_id = series.id
releases.translator_id = releases_translators.translator_id
    AND releases_translators.translator_id = $1

tag → series

series.id = tag.series_id
    AND tag_names.id = tag.tag_id
    AND tag_names.name = $1

demographic → series

series.demographic = $1

Note: $1 is not a foreign key, but an enum, in this case.

magazine → series

series.magazine_id = magazine.id
    AND magazine.id = $1

publishers → series

series.magazine_id = magazine.id
    AND magazine.publisher_id = publisher.id
    AND publisher.id = $1