package app import ( "tercul/internal/app/analytics" "tercul/internal/app/author" "tercul/internal/app/book" "tercul/internal/app/bookmark" "tercul/internal/app/category" "tercul/internal/app/collection" "tercul/internal/app/comment" "tercul/internal/app/like" "tercul/internal/app/localization" "tercul/internal/app/tag" "tercul/internal/app/translation" "tercul/internal/app/user" "tercul/internal/app/auth" "tercul/internal/app/work" "tercul/internal/data/sql" "tercul/internal/domain/search" platform_auth "tercul/internal/platform/auth" ) import "tercul/internal/app/authz" // Application is a container for all the application-layer services. type Application struct { Author *author.Service Book *book.Service Bookmark *bookmark.Service Category *category.Service Collection *collection.Service Comment *comment.Service Like *like.Service Tag *tag.Service Translation *translation.Service User *user.Service Localization *localization.Service Auth *auth.Service Authz *authz.Service Work *work.Service Analytics analytics.Service } func NewApplication(repos *sql.Repositories, searchClient search.SearchClient, analyticsService analytics.Service) *Application { jwtManager := platform_auth.NewJWTManager() authzService := authz.NewService(repos.Work, repos.Translation) authorService := author.NewService(repos.Author) bookService := book.NewService(repos.Book, authzService) bookmarkService := bookmark.NewService(repos.Bookmark, analyticsService) categoryService := category.NewService(repos.Category) collectionService := collection.NewService(repos.Collection) commentService := comment.NewService(repos.Comment, authzService, analyticsService) likeService := like.NewService(repos.Like, analyticsService) tagService := tag.NewService(repos.Tag) translationService := translation.NewService(repos.Translation, authzService) userService := user.NewService(repos.User, authzService) localizationService := localization.NewService(repos.Localization) authService := auth.NewService(repos.User, jwtManager) workService := work.NewService(repos.Work, searchClient, authzService) return &Application{ Author: authorService, Book: bookService, Bookmark: bookmarkService, Category: categoryService, Collection: collectionService, Comment: commentService, Like: likeService, Tag: tagService, Translation: translationService, User: userService, Localization: localizationService, Auth: authService, Authz: authzService, Work: workService, Analytics: analyticsService, } }