github.com/ngocphuongnb/tetua@v0.0.7-alpha/packages/entrepository/page.go (about)

     1  package entrepository
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  
     8  	"github.com/ngocphuongnb/tetua/app/entities"
     9  	e "github.com/ngocphuongnb/tetua/app/entities"
    10  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent"
    11  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent/page"
    12  )
    13  
    14  type PageRepository struct {
    15  	*BaseRepository[e.Page, ent.Page, *ent.PageQuery, *e.PageFilter]
    16  }
    17  
    18  func (p *PageRepository) PublishedPageBySlug(ctx context.Context, slug string) (*entities.Page, error) {
    19  	page, err := p.Client.Page.
    20  		Query().
    21  		Where(page.DeletedAtIsNil()).
    22  		Where(page.SlugEQ(slug)).
    23  		Where(page.DraftEQ(false)).
    24  		WithFeaturedImage().
    25  		Only(ctx)
    26  
    27  	if err != nil {
    28  		return nil, EntError(err, fmt.Sprintf("page not found with slug: %s", slug))
    29  	}
    30  
    31  	return entPageToPage(page), nil
    32  }
    33  
    34  func CreatePageRepository(client *ent.Client) *PageRepository {
    35  	return &PageRepository{
    36  		BaseRepository: &BaseRepository[e.Page, ent.Page, *ent.PageQuery, *e.PageFilter]{
    37  			Name:      "page",
    38  			Client:    client,
    39  			ConvertFn: entPageToPage,
    40  			ByIDFn: func(ctx context.Context, client *ent.Client, id int) (*ent.Page, error) {
    41  				return client.Page.Query().
    42  					Where(page.DeletedAtIsNil()).
    43  					Where(page.IDEQ(id)).
    44  					WithFeaturedImage().
    45  					Only(ctx)
    46  			},
    47  			DeleteByIDFn: func(ctx context.Context, client *ent.Client, id int) error {
    48  				return client.Page.DeleteOneID(id).Exec(ctx)
    49  			},
    50  			CreateFn: func(ctx context.Context, client *ent.Client, data *e.Page) (*ent.Page, error) {
    51  				cq := client.Page.Create().
    52  					SetName(data.Name).
    53  					SetSlug(data.Slug).
    54  					SetContentHTML(data.ContentHTML).
    55  					SetContent(data.Content).
    56  					SetDraft(data.Draft)
    57  
    58  				if data.FeaturedImageID != 0 {
    59  					cq.SetFeaturedImageID(data.FeaturedImageID)
    60  				}
    61  
    62  				return cq.Save(ctx)
    63  			},
    64  			UpdateFn: func(ctx context.Context, client *ent.Client, data *e.Page) (*ent.Page, error) {
    65  				if data.ID == 0 {
    66  					return nil, errors.New("page id is required in order to update")
    67  				}
    68  				uq := client.Page.UpdateOneID(data.ID).
    69  					SetName(data.Name).
    70  					SetSlug(data.Slug).
    71  					SetContentHTML(data.ContentHTML).
    72  					SetContent(data.Content).
    73  					SetDraft(data.Draft)
    74  
    75  				if data.FeaturedImageID != 0 {
    76  					uq.SetFeaturedImageID(data.FeaturedImageID)
    77  				}
    78  
    79  				return uq.Save(ctx)
    80  			},
    81  			QueryFilterFn: func(client *ent.Client, filters ...*e.PageFilter) *ent.PageQuery {
    82  				query := client.Page.Query().Where(page.DeletedAtIsNil())
    83  				publish := "published"
    84  
    85  				if len(filters) > 0 {
    86  					if filters[0].Publish != "" {
    87  						publish = filters[0].Publish
    88  					}
    89  
    90  					if len(filters[0].ExcludeIDs) > 0 {
    91  						query = query.Where(page.IDNotIn(filters[0].ExcludeIDs...))
    92  					}
    93  				}
    94  
    95  				if publish != "all" {
    96  					if publish == "published" {
    97  						query = query.Where(page.DraftEQ(false))
    98  					}
    99  
   100  					if publish == "draft" {
   101  						query = query.Where(page.DraftEQ(true))
   102  					}
   103  				}
   104  
   105  				return query
   106  			},
   107  			FindFn: func(ctx context.Context, query *ent.PageQuery, filters ...*e.PageFilter) ([]*ent.Page, error) {
   108  				page, limit, sorts := getPaginateParams(filters[0])
   109  				return query.
   110  					WithFeaturedImage().
   111  					Limit(limit).
   112  					Offset((page - 1) * limit).
   113  					Order(sorts...).
   114  					All(ctx)
   115  			},
   116  		},
   117  	}
   118  }