package service import ( "context" "io" "mime/multipart" "tss-rocks-be/ent" "tss-rocks-be/internal/storage" "tss-rocks-be/internal/types" ) // Service interface defines all business logic operations type Service interface { // User operations CreateUser(ctx context.Context, username, email, password string, role string) (*ent.User, error) GetUser(ctx context.Context, id int) (*ent.User, error) GetUserByUsername(ctx context.Context, username string) (*ent.User, error) GetUserByEmail(ctx context.Context, email string) (*ent.User, error) ValidatePassword(ctx context.Context, user *ent.User, password string) bool VerifyPassword(ctx context.Context, userID int, password string) error UpdateUser(ctx context.Context, userID int, input *types.UpdateUserInput) (*ent.User, error) DeleteUser(ctx context.Context, userID int) error ListUsers(ctx context.Context, params *types.ListUsersParams) ([]*ent.User, error) GetUserRoles(ctx context.Context, userID int) ([]*ent.Role, error) // Category operations CreateCategory(ctx context.Context) (*ent.Category, error) AddCategoryContent(ctx context.Context, categoryID int, langCode, name, description, slug string) (*ent.CategoryContent, error) GetCategoryBySlug(ctx context.Context, langCode, slug string) (*ent.Category, error) ListCategories(ctx context.Context, langCode string) ([]*ent.Category, error) GetCategories(ctx context.Context, langCode string) ([]*ent.Category, error) // Post operations CreatePost(ctx context.Context, status string, categoryIDs []int) (*ent.Post, error) AddPostContent(ctx context.Context, postID int, langCode, title, content, summary string, metaKeywords, metaDescription string) (*ent.PostContent, error) GetPostBySlug(ctx context.Context, langCode, slug string) (*ent.Post, error) ListPosts(ctx context.Context, langCode string, categoryIDs []int, limit, offset int) ([]*ent.Post, error) // Media operations ListMedia(ctx context.Context, limit, offset int) ([]*ent.Media, error) Upload(ctx context.Context, file *multipart.FileHeader, userID int) (*ent.Media, error) GetMedia(ctx context.Context, id int) (*ent.Media, error) GetFile(ctx context.Context, id int) (io.ReadCloser, *storage.FileInfo, error) DeleteMedia(ctx context.Context, id int, userID int) error // Contributor operations CreateContributor(ctx context.Context, name string, avatarURL, bio *string) (*ent.Contributor, error) AddContributorSocialLink(ctx context.Context, contributorID int, linkType, name, value string) (*ent.ContributorSocialLink, error) GetContributorByID(ctx context.Context, id int) (*ent.Contributor, error) ListContributors(ctx context.Context) ([]*ent.Contributor, error) // Daily operations CreateDaily(ctx context.Context, id string, categoryID int, imageURL string) (*ent.Daily, error) AddDailyContent(ctx context.Context, dailyID string, langCode, quote string) (*ent.DailyContent, error) GetDailyByID(ctx context.Context, id string) (*ent.Daily, error) ListDailies(ctx context.Context, langCode string, categoryID *int, limit, offset int) ([]*ent.Daily, error) // RBAC operations InitializeRBAC(ctx context.Context) error AssignRole(ctx context.Context, userID int, role string) error RemoveRole(ctx context.Context, userID int, role string) error HasPermission(ctx context.Context, userID int, permission string) (bool, error) // Token blacklist GetTokenBlacklist() *TokenBlacklist // Generic operations Delete(ctx context.Context, id int, currentUserID int) error DeleteDaily(ctx context.Context, id string, currentUserID int) error }