---
layout: 'page'
uri: '/framework/application/queries'
position: 3
slug: 'framework-application-queries'
parent: 'framework-application'
navTitle: 'Queries'
title: 'Queries'
description: 'Balíček application/query/ -- CQRS read operace.'
---
# Queries
## Proč
Queries čtou stav systému bez jeho změny. Oddělení od commands umožňuje nezávislou optimalizaci čtení (jiné modely, cache, projekce). Query závisí pouze na `domain/`.
## Jak
Stejná struktura jako command: `XxxQuery` (filtry) + `XxxHandler` (logika). Query prochází `QueryBus` (Recovery → Logging → Authorize).
```go
// application/user/query/list_users.go
type ListUsersQuery struct{}
func (q ListUsersQuery) RequiredPermission() string { return "admin:users:read" }
type ListUsersHandler struct {
repo user.Repository
}
func (h *ListUsersHandler) Handle(ctx context.Context, q ListUsersQuery) ([]user.User, error) {
return h.repo.FindAll(ctx)
}
```
### Veřejné query (bez permission)
Veřejná query implementují `SkipPermission` -- explicitní deklarace, že permission check není potřeba:
```go
type GetPublicInfoQuery struct{}
func (q GetPublicInfoQuery) SkipPermissionCheck() {} // explicitní skip
```
Pokud query neimplementuje ani `Permissioned`, ani `SkipPermission`, `AuthorizeMiddleware` vrátí error.
## Detaily
- Query handler nemá side-effects -- jen čte data.
- Query může vracet libovolný typ (entitu, slice, DTO).
---
[← Commands](/framework/application/commands.md) | [Events →](/framework/application/events.md)