118 lines
3.1 KiB
Go
118 lines
3.1 KiB
Go
package models
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"screenmark/screenmark/.gen/haystack/haystack/model"
|
|
. "screenmark/screenmark/.gen/haystack/haystack/table"
|
|
|
|
. "github.com/go-jet/jet/v2/postgres"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type ContactModel struct {
|
|
dbPool *sql.DB
|
|
}
|
|
|
|
func (m ContactModel) List(ctx context.Context, userId uuid.UUID) ([]model.Contacts, error) {
|
|
listContactsStmt := SELECT(Contacts.AllColumns).
|
|
FROM(
|
|
Contacts.
|
|
INNER_JOIN(UserContacts, UserContacts.ContactID.EQ(Contacts.ID)),
|
|
).
|
|
WHERE(UserContacts.UserID.EQ(UUID(userId)))
|
|
|
|
locations := []model.Contacts{}
|
|
|
|
err := listContactsStmt.QueryContext(ctx, m.dbPool, &locations)
|
|
return locations, err
|
|
}
|
|
|
|
func (m ContactModel) Get(ctx context.Context, contactId uuid.UUID) (model.Contacts, error) {
|
|
getContactStmt := Contacts.
|
|
SELECT(Contacts.AllColumns).
|
|
WHERE(Contacts.ID.EQ(UUID(contactId)))
|
|
|
|
contact := model.Contacts{}
|
|
err := getContactStmt.QueryContext(ctx, m.dbPool, &contact)
|
|
|
|
return contact, err
|
|
}
|
|
|
|
func (m ContactModel) Update(ctx context.Context, contact model.Contacts) (model.Contacts, error) {
|
|
existingContact, err := m.Get(ctx, contact.ID)
|
|
if err != nil {
|
|
return model.Contacts{}, err
|
|
}
|
|
|
|
existingContact.Name = contact.Name
|
|
|
|
if contact.Description != nil {
|
|
existingContact.Description = contact.Description
|
|
}
|
|
|
|
if contact.PhoneNumber != nil {
|
|
existingContact.PhoneNumber = contact.PhoneNumber
|
|
}
|
|
|
|
if contact.Email != nil {
|
|
existingContact.Email = contact.Email
|
|
}
|
|
|
|
updateContactStmt := Contacts.
|
|
UPDATE(Contacts.MutableColumns).
|
|
MODEL(existingContact).
|
|
WHERE(Contacts.ID.EQ(UUID(contact.ID))).
|
|
RETURNING(Contacts.AllColumns)
|
|
|
|
updatedContact := model.Contacts{}
|
|
err = updateContactStmt.QueryContext(ctx, m.dbPool, &updatedContact)
|
|
|
|
return updatedContact, err
|
|
}
|
|
|
|
func (m ContactModel) Save(ctx context.Context, userId uuid.UUID, contact model.Contacts) (model.Contacts, error) {
|
|
// TODO: make this a transaction
|
|
|
|
if contact.ID != uuid.Nil {
|
|
return m.Update(ctx, contact)
|
|
}
|
|
|
|
insertContactStmt := Contacts.
|
|
INSERT(Contacts.Name, Contacts.Description, Contacts.PhoneNumber, Contacts.Email).
|
|
VALUES(contact.Name, contact.Description, contact.PhoneNumber, contact.Email).
|
|
RETURNING(Contacts.AllColumns)
|
|
|
|
insertedContact := model.Contacts{}
|
|
err := insertContactStmt.QueryContext(ctx, m.dbPool, &insertedContact)
|
|
|
|
if err != nil {
|
|
return insertedContact, err
|
|
}
|
|
|
|
insertUserContactStmt := UserContacts.
|
|
INSERT(UserContacts.UserID, UserContacts.ContactID).
|
|
VALUES(userId, insertedContact.ID)
|
|
|
|
_, err = insertUserContactStmt.ExecContext(ctx, m.dbPool)
|
|
|
|
return insertedContact, err
|
|
}
|
|
|
|
func (m ContactModel) SaveToImage(ctx context.Context, imageId uuid.UUID, contactId uuid.UUID) (model.ImageContacts, error) {
|
|
insertImageContactStmt := ImageContacts.
|
|
INSERT(ImageContacts.ImageID, ImageContacts.ContactID).
|
|
VALUES(imageId, contactId).
|
|
RETURNING(ImageContacts.AllColumns)
|
|
|
|
imageContact := model.ImageContacts{}
|
|
err := insertImageContactStmt.QueryContext(ctx, m.dbPool, &imageContact)
|
|
|
|
return imageContact, err
|
|
}
|
|
|
|
func NewContactModel(db *sql.DB) ContactModel {
|
|
return ContactModel{dbPool: db}
|
|
}
|