repo: add some sql for events
All checks were successful
Build and test / Build (push) Successful in 2m29s
All checks were successful
Build and test / Build (push) Successful in 2m29s
This commit is contained in:
parent
39eaae46d8
commit
dde4eb337c
41
README.md
41
README.md
@ -421,7 +421,7 @@ The following basic use cases are to be implemented at the first time.
|
|||||||
|
|
||||||
- [X] A user signs up
|
- [X] A user signs up
|
||||||
- [X] A user logs in
|
- [X] A user logs in
|
||||||
- [] A user lists their events (pagination)
|
- [X] A user lists their events (pagination)
|
||||||
- [] A user sees the detail of an event (description, members, amount)
|
- [] A user sees the detail of an event (description, members, amount)
|
||||||
- [] A user sees the expenses of an event (total amount, personal expenses, pagination)
|
- [] A user sees the expenses of an event (total amount, personal expenses, pagination)
|
||||||
- [] A user sees the detail of an expense: (time, amount, payers, recipients)
|
- [] A user sees the detail of an expense: (time, amount, payers, recipients)
|
||||||
@ -430,7 +430,7 @@ The following basic use cases are to be implemented at the first time.
|
|||||||
- [] A user deletes an expense (may handle some extra access control)
|
- [] A user deletes an expense (may handle some extra access control)
|
||||||
- [] A user restore a deleted expense
|
- [] A user restore a deleted expense
|
||||||
- [] A user can pay the debt to other members
|
- [] A user can pay the debt to other members
|
||||||
- [X] A user creates an event
|
- [X] A user creates an event (and participate to it)
|
||||||
- [] A user updates the event info
|
- [] A user updates the event info
|
||||||
- [] A user invites another user by sending a mail with a token.
|
- [] A user invites another user by sending a mail with a token.
|
||||||
- [] A user joins an event by accepting an invitation
|
- [] A user joins an event by accepting an invitation
|
||||||
@ -449,3 +449,40 @@ work on other aspects. For example:
|
|||||||
- ex. Trip journal...
|
- ex. Trip journal...
|
||||||
|
|
||||||
Stop dreaming... Just do the simple stuff first!
|
Stop dreaming... Just do the simple stuff first!
|
||||||
|
|
||||||
|
### 2024/10/18
|
||||||
|
|
||||||
|
I spent some time to figure out this one! But I don't actually need it for now.
|
||||||
|
So I just keep it here:
|
||||||
|
|
||||||
|
```SQL
|
||||||
|
SELECT
|
||||||
|
e.id,
|
||||||
|
e.name,
|
||||||
|
e.description,
|
||||||
|
e.created_at,
|
||||||
|
json_build_object(
|
||||||
|
'id', o.id,
|
||||||
|
'first_name', o.first_name,
|
||||||
|
'last_name', o.last_name
|
||||||
|
) AS owner,
|
||||||
|
json_agg(
|
||||||
|
json_build_object(
|
||||||
|
'id', u.id,
|
||||||
|
'first_name', u.first_name,
|
||||||
|
'last_name', u.last_name
|
||||||
|
)
|
||||||
|
) AS users -- Aggregation for users in the event
|
||||||
|
FROM "event" e
|
||||||
|
JOIN "participation" p ON p.event_id = e.id -- participation linked with the event
|
||||||
|
JOIN "user" u ON u.id = p.user_id -- and the query user
|
||||||
|
JOIN "user" o ON o.id = e.owner_id -- get the owner info
|
||||||
|
WHERE e.id IN (
|
||||||
|
SELECT pt.event_id FROM participation pt WHERE pt.user_id = $1
|
||||||
|
-- consider the events participated by user_id
|
||||||
|
)
|
||||||
|
GROUP BY
|
||||||
|
e.id, e.name, e.description, e.created_at,
|
||||||
|
o.id, o.first_name, o.last_name;
|
||||||
|
|
||||||
|
```
|
||||||
|
58
internal/howmuch/adapter/repo/sqlc/event.sql
Normal file
58
internal/howmuch/adapter/repo/sqlc/event.sql
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
-- name: InsertEvent :one
|
||||||
|
INSERT INTO "event" (
|
||||||
|
name, description, total_amount, default_currency, owner_id, created_at, updated_at
|
||||||
|
) VALUES ( $1, $2, $3, $4, $5, $6, $7 )
|
||||||
|
RETURNING *;
|
||||||
|
|
||||||
|
-- name: ListEventsByUserID :many
|
||||||
|
SELECT
|
||||||
|
e.id,
|
||||||
|
e.name,
|
||||||
|
e.description,
|
||||||
|
e.created_at,
|
||||||
|
json_build_object(
|
||||||
|
'id', o.id,
|
||||||
|
'first_name', o.first_name,
|
||||||
|
'last_name', o.last_name
|
||||||
|
) AS owner
|
||||||
|
FROM "event" e
|
||||||
|
JOIN "participation" p ON p.event_id = e.id -- participation linked with the event
|
||||||
|
JOIN "user" o ON o.id = e.owner_id -- get the owner info
|
||||||
|
WHERE e.id IN (
|
||||||
|
SELECT pt.event_id FROM participation pt WHERE pt.user_id = $1 -- consider the events participated by user_id
|
||||||
|
)
|
||||||
|
GROUP BY
|
||||||
|
e.id, e.name, e.description, e.created_at,
|
||||||
|
o.id, o.first_name, o.last_name;
|
||||||
|
|
||||||
|
-- name: GetEventByID :one
|
||||||
|
SELECT
|
||||||
|
e.id,
|
||||||
|
e.name,
|
||||||
|
e.description,
|
||||||
|
e.total_amount,
|
||||||
|
e.default_currency,
|
||||||
|
e.created_at,
|
||||||
|
e.updated_at,
|
||||||
|
json_build_object(
|
||||||
|
'id', o.id,
|
||||||
|
'first_name', o.first_name,
|
||||||
|
'last_name', o.last_name
|
||||||
|
) AS owner,
|
||||||
|
json_agg(
|
||||||
|
json_build_object(
|
||||||
|
'id', u.id,
|
||||||
|
'first_name', u.first_name,
|
||||||
|
'last_name', u.last_name
|
||||||
|
)
|
||||||
|
) AS users -- Aggregation for users in the event
|
||||||
|
FROM "event" e
|
||||||
|
JOIN "participation" p ON p.event_id = e.id -- participation linked with the event
|
||||||
|
JOIN "user" u ON u.id = p.user_id -- and the query user
|
||||||
|
JOIN "user" o ON o.id = e.owner_id -- get the owner info
|
||||||
|
WHERE e.id = $1
|
||||||
|
GROUP BY
|
||||||
|
e.id, e.name, e.description, e.created_at, e.updated_at,
|
||||||
|
e.total_amount, e.default_currency,
|
||||||
|
o.id, o.first_name, o.last_name;
|
||||||
|
|
174
internal/howmuch/adapter/repo/sqlc/event.sql.go
Normal file
174
internal/howmuch/adapter/repo/sqlc/event.sql.go
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// sqlc v1.27.0
|
||||||
|
// source: event.sql
|
||||||
|
|
||||||
|
package sqlc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"encoding/json"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const getEventByID = `-- name: GetEventByID :one
|
||||||
|
SELECT
|
||||||
|
e.id,
|
||||||
|
e.name,
|
||||||
|
e.description,
|
||||||
|
e.total_amount,
|
||||||
|
e.default_currency,
|
||||||
|
e.created_at,
|
||||||
|
e.updated_at,
|
||||||
|
json_build_object(
|
||||||
|
'id', o.id,
|
||||||
|
'first_name', o.first_name,
|
||||||
|
'last_name', o.last_name
|
||||||
|
) AS owner,
|
||||||
|
json_agg(
|
||||||
|
json_build_object(
|
||||||
|
'id', u.id,
|
||||||
|
'first_name', u.first_name,
|
||||||
|
'last_name', u.last_name
|
||||||
|
)
|
||||||
|
) AS users -- Aggregation for users in the event
|
||||||
|
FROM "event" e
|
||||||
|
JOIN "participation" p ON p.event_id = e.id -- participation linked with the event
|
||||||
|
JOIN "user" u ON u.id = p.user_id -- and the query user
|
||||||
|
JOIN "user" o ON o.id = e.owner_id -- get the owner info
|
||||||
|
WHERE e.id = $1
|
||||||
|
GROUP BY
|
||||||
|
e.id, e.name, e.description, e.created_at, e.updated_at,
|
||||||
|
e.total_amount, e.default_currency,
|
||||||
|
o.id, o.first_name, o.last_name
|
||||||
|
`
|
||||||
|
|
||||||
|
type GetEventByIDRow struct {
|
||||||
|
ID int32
|
||||||
|
Name string
|
||||||
|
Description sql.NullString
|
||||||
|
TotalAmount sql.NullInt32
|
||||||
|
DefaultCurrency string
|
||||||
|
CreatedAt time.Time
|
||||||
|
UpdatedAt time.Time
|
||||||
|
Owner json.RawMessage
|
||||||
|
Users json.RawMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) GetEventByID(ctx context.Context, id int32) (GetEventByIDRow, error) {
|
||||||
|
row := q.db.QueryRowContext(ctx, getEventByID, id)
|
||||||
|
var i GetEventByIDRow
|
||||||
|
err := row.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Name,
|
||||||
|
&i.Description,
|
||||||
|
&i.TotalAmount,
|
||||||
|
&i.DefaultCurrency,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
&i.Owner,
|
||||||
|
&i.Users,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
|
||||||
|
const insertEvent = `-- name: InsertEvent :one
|
||||||
|
INSERT INTO "event" (
|
||||||
|
name, description, total_amount, default_currency, owner_id, created_at, updated_at
|
||||||
|
) VALUES ( $1, $2, $3, $4, $5, $6, $7 )
|
||||||
|
RETURNING id, name, description, default_currency, owner_id, created_at, updated_at, total_amount
|
||||||
|
`
|
||||||
|
|
||||||
|
type InsertEventParams struct {
|
||||||
|
Name string
|
||||||
|
Description sql.NullString
|
||||||
|
TotalAmount sql.NullInt32
|
||||||
|
DefaultCurrency string
|
||||||
|
OwnerID int32
|
||||||
|
CreatedAt time.Time
|
||||||
|
UpdatedAt time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) InsertEvent(ctx context.Context, arg InsertEventParams) (Event, error) {
|
||||||
|
row := q.db.QueryRowContext(ctx, insertEvent,
|
||||||
|
arg.Name,
|
||||||
|
arg.Description,
|
||||||
|
arg.TotalAmount,
|
||||||
|
arg.DefaultCurrency,
|
||||||
|
arg.OwnerID,
|
||||||
|
arg.CreatedAt,
|
||||||
|
arg.UpdatedAt,
|
||||||
|
)
|
||||||
|
var i Event
|
||||||
|
err := row.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Name,
|
||||||
|
&i.Description,
|
||||||
|
&i.DefaultCurrency,
|
||||||
|
&i.OwnerID,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
&i.TotalAmount,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
|
||||||
|
const listEventsByUserID = `-- name: ListEventsByUserID :many
|
||||||
|
SELECT
|
||||||
|
e.id,
|
||||||
|
e.name,
|
||||||
|
e.description,
|
||||||
|
e.created_at,
|
||||||
|
json_build_object(
|
||||||
|
'id', o.id,
|
||||||
|
'first_name', o.first_name,
|
||||||
|
'last_name', o.last_name
|
||||||
|
) AS owner
|
||||||
|
FROM "event" e
|
||||||
|
JOIN "participation" p ON p.event_id = e.id -- participation linked with the event
|
||||||
|
JOIN "user" o ON o.id = e.owner_id -- get the owner info
|
||||||
|
WHERE e.id IN (
|
||||||
|
SELECT pt.event_id FROM participation pt WHERE pt.user_id = $1 -- consider the events participated by user_id
|
||||||
|
)
|
||||||
|
GROUP BY
|
||||||
|
e.id, e.name, e.description, e.created_at,
|
||||||
|
o.id, o.first_name, o.last_name
|
||||||
|
`
|
||||||
|
|
||||||
|
type ListEventsByUserIDRow struct {
|
||||||
|
ID int32
|
||||||
|
Name string
|
||||||
|
Description sql.NullString
|
||||||
|
CreatedAt time.Time
|
||||||
|
Owner json.RawMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) ListEventsByUserID(ctx context.Context, userID int32) ([]ListEventsByUserIDRow, error) {
|
||||||
|
rows, err := q.db.QueryContext(ctx, listEventsByUserID, userID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
var items []ListEventsByUserIDRow
|
||||||
|
for rows.Next() {
|
||||||
|
var i ListEventsByUserIDRow
|
||||||
|
if err := rows.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Name,
|
||||||
|
&i.Description,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.Owner,
|
||||||
|
); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
items = append(items, i)
|
||||||
|
}
|
||||||
|
if err := rows.Close(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := rows.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return items, nil
|
||||||
|
}
|
5
internal/howmuch/adapter/repo/sqlc/participation.sql
Normal file
5
internal/howmuch/adapter/repo/sqlc/participation.sql
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
-- name: InsertParticipation :one
|
||||||
|
INSERT INTO participation (
|
||||||
|
user_id, event_id, invited_by_user_id, created_at, updated_at
|
||||||
|
) VALUES ($1, $2, $3, $4, $5)
|
||||||
|
RETURNING *;
|
47
internal/howmuch/adapter/repo/sqlc/participation.sql.go
Normal file
47
internal/howmuch/adapter/repo/sqlc/participation.sql.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// sqlc v1.27.0
|
||||||
|
// source: participation.sql
|
||||||
|
|
||||||
|
package sqlc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const insertParticipation = `-- name: InsertParticipation :one
|
||||||
|
INSERT INTO participation (
|
||||||
|
user_id, event_id, invited_by_user_id, created_at, updated_at
|
||||||
|
) VALUES ($1, $2, $3, $4, $5)
|
||||||
|
RETURNING id, user_id, event_id, invited_by_user_id, created_at, updated_at
|
||||||
|
`
|
||||||
|
|
||||||
|
type InsertParticipationParams struct {
|
||||||
|
UserID int32
|
||||||
|
EventID int32
|
||||||
|
InvitedByUserID sql.NullInt32
|
||||||
|
CreatedAt time.Time
|
||||||
|
UpdatedAt time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) InsertParticipation(ctx context.Context, arg InsertParticipationParams) (Participation, error) {
|
||||||
|
row := q.db.QueryRowContext(ctx, insertParticipation,
|
||||||
|
arg.UserID,
|
||||||
|
arg.EventID,
|
||||||
|
arg.InvitedByUserID,
|
||||||
|
arg.CreatedAt,
|
||||||
|
arg.UpdatedAt,
|
||||||
|
)
|
||||||
|
var i Participation
|
||||||
|
err := row.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.UserID,
|
||||||
|
&i.EventID,
|
||||||
|
&i.InvitedByUserID,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
ALTER TABLE "participation"
|
||||||
|
ADD CONSTRAINT unique_user_event UNIQUE ("user_id", "event_id");
|
Loading…
Reference in New Issue
Block a user