map([$schemaService, 'fromArray']); $userCommands = []; foreach (config("lucent.commands") as $signature => $desc) { $userCommands[] = new UserCommand($desc, $signature); } $channel = new Channel( name: config("lucent.name") ?? "", url: rtrim(config("lucent.url") ?? "", "/"), previewTarget: rtrim(config("lucent.previewTarget") ?? "", "/"), commands: Collection::make($userCommands), schemas: $schemasCollection, imageFilters: config("lucent.imageFilters") ?? [], roles: $schemasArray["roles"] ?? [] ); $channelService = new ChannelService($schemaService); $channelService->channel = $channel; return $channelService; } /** * @param string $name * @return Option */ public function getSchema(string $name): Option { $schema = $this->channel->schemas->firstWhere("name", $name); if (empty($schema)) { return none(); } return some($schema); } /** * @param array $roles * @return array */ public function schemasReadableByRoles(array $roles): array { $schemasAllRead = $this->channel->schemas->filter(fn(Schema $schema) => empty($schema->read))->values()->pluck("name"); $schemasCanRead = $this->channel->schemas->filter(fn(Schema $schema) => count(array_intersect($schema->read ?? [], $roles)) > 0)->values()->pluck("name"); $schemasCanWrite = $this->channel->schemas->filter(fn(Schema $schema) => count(array_intersect($schema->write ?? [], $roles)) > 0)->values()->pluck("name"); return $schemasAllRead->merge($schemasCanRead)->merge($schemasCanWrite)->unique()->values()->toArray(); } /** * @param array $roles * @return array */ public function schemasWritableByRoles(array $roles): array { $schemasAllRead = $this->channel->schemas->filter(fn(Schema $schema) => empty($schema->write ?? []))->values()->pluck("name"); $schemasCanWrite = $this->channel->schemas->filter(fn(Schema $schema) => count(array_intersect($schema->write ?? [], $roles)) > 0)->values()->pluck("name"); return $schemasAllRead->merge($schemasCanWrite)->unique()->values()->toArray(); } }