<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mohsen Bostan</title>
    <description>The latest articles on DEV Community by Mohsen Bostan (@mohsenbostan).</description>
    <link>https://dev.to/mohsenbostan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F376280%2F00943a51-0392-462f-adc0-39ce5ea39bd5.jpeg</url>
      <title>DEV Community: Mohsen Bostan</title>
      <link>https://dev.to/mohsenbostan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohsenbostan"/>
    <language>en</language>
    <item>
      <title>How to handle gRPC errors in NestJS</title>
      <dc:creator>Mohsen Bostan</dc:creator>
      <pubDate>Sat, 21 Jan 2023 21:27:28 +0000</pubDate>
      <link>https://dev.to/mohsenbostan/how-to-handle-grpc-errors-in-nestjs-22jc</link>
      <guid>https://dev.to/mohsenbostan/how-to-handle-grpc-errors-in-nestjs-22jc</guid>
      <description>&lt;p&gt;NestJS has a great way of creating microservices specially when it comes to gRPC! You can easily use gRPC in your NestJS applications without doing extra work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error Handling: The Basic Solution
&lt;/h3&gt;

&lt;p&gt;Handling errors correctly in microservices is really important. NestJS provides &lt;strong&gt;RpcException&lt;/strong&gt; for this. Let's take a look at some code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// user-service/src/find-user.query.ts&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FindUserQuery&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IQuery&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FindUserQueryParam&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RpcException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User Not Found.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example code shows how to throw exceptions that are microservice related. Although this works fine but there is a problem! If you want to send a HTTP error this will not help because you actually don't know what type of error this is.&lt;/p&gt;

&lt;p&gt;We all know that &lt;strong&gt;404&lt;/strong&gt; is a &lt;strong&gt;Not Found&lt;/strong&gt; error but gRPC uses &lt;strong&gt;5&lt;/strong&gt; for that. On the other hand since the &lt;strong&gt;RpcException&lt;/strong&gt; Isn't only for gRPC (You can use this exception regardless of the transport method which you use), The client side wouldn't know that this is a &lt;strong&gt;code 5&lt;/strong&gt; error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Efficient gRPC Error Handling
&lt;/h3&gt;

&lt;p&gt;To solve the explained problem, you have to pass an object containing the gRPC error code. But let me save you!&lt;/p&gt;

&lt;p&gt;I have published a library that provides some wrappers for the &lt;strong&gt;RpcException&lt;/strong&gt;. It includes almost all commonly used gRPC error codes. The library provides 2 main features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exception classes similar to NestJS built-in &lt;strong&gt;HttpExecption&lt;/strong&gt;s&lt;/li&gt;
&lt;li&gt;Automatic conversion of gRPC error from your microservice servers to &lt;strong&gt;HttpException&lt;/strong&gt; in the client&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How To Use The Library?
&lt;/h3&gt;

&lt;p&gt;First install the library with any package manager you prefer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i nestjs-grpc-exceptions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add the &lt;strong&gt;GrpcServerExceptionFilter&lt;/strong&gt; to your gRPC server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;APP_FILTER&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@nestjs/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GrpcServerExceptionFilter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nestjs-grpc-exceptions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;provide&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;APP_FILTER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;useClass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GrpcServerExceptionFilter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the client interceptor to your client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GrpcToHttpInterceptor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nestjs-grpc-exceptions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;UseInterceptors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GrpcToHttpInterceptor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;findUser&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can use the exception classes in your servers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;GrpcNotFoundException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;GrpcInvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nestjs-grpc-exceptions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GrpcNotFoundException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User Not Found.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GrpcInvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input 'name' is not valid.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that is all you need.&lt;/p&gt;

&lt;p&gt;Useful links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/nestjs-grpc-exceptions" rel="noopener noreferrer"&gt;Library On NPM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mohsenbostan/nestjs-grpc-exceptions" rel="noopener noreferrer"&gt;GitHub Repo Link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bostan.dev" rel="noopener noreferrer"&gt;My Personal Newsletter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wish you bugless codes! ❤️&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>discuss</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Laravel Secret Image</title>
      <dc:creator>Mohsen Bostan</dc:creator>
      <pubDate>Sat, 22 Aug 2020 07:46:50 +0000</pubDate>
      <link>https://dev.to/mohsenbostan/laravel-secret-image-525l</link>
      <guid>https://dev.to/mohsenbostan/laravel-secret-image-525l</guid>
      <description>&lt;p&gt;Hi, everyone!&lt;br&gt;
I've created a useful package for Laravel developers. This package will help you to save your images secretly and show them to ones who you choose.&lt;/p&gt;

&lt;p&gt;You can access this package by this link:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/mohsenbostan"&gt;
        mohsenbostan
      &lt;/a&gt; / &lt;a href="https://github.com/mohsenbostan/laravel-secret-image"&gt;
        laravel-secret-image
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A package to save images secretly.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Laravel Secret Image&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://packagist.org/packages/mohsenbostan/laravel-secret-image" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/8fd22883241e19da05b1a4ac918167b9abc77e15d009d3ec47a690b462fe7630/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d6f6873656e626f7374616e2f6c61726176656c2d7365637265742d696d6167652e7376673f7374796c653d666c61742d737175617265" alt="Latest Version on Packagist"&gt;&lt;/a&gt;
&lt;a href="https://packagist.org/packages/mohsenbostan/laravel-secret-image" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/7d9eb098df1fbca43996a405e2471d8bc2ff29b3cd089a151f4a443702671d21/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6d6f6873656e626f7374616e2f6c61726176656c2d7365637265742d696d6167652e7376673f7374796c653d666c61742d737175617265" alt="Total Downloads"&gt;&lt;/a&gt;
&lt;a href="https://travis-ci.com/mohsenbostan/laravel-secret-image" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/c32c0ac3b77c3adeee60187241559dd3e09ed70db8cbbf1806e17ee85358e580/68747470733a2f2f7472617669732d63692e636f6d2f6d6f6873656e626f7374616e2f6c61726176656c2d7365637265742d696d6167652e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This package helps you to save your images secretly and show them just to authenticated users.&lt;/p&gt;
&lt;h2&gt;
Installation&lt;/h2&gt;
&lt;p&gt;You can install the package via composer:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;composer require mohsenbostan/laravel-secret-image&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;after installing package using composer, you should publish configs:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;php artisan vendor:publish --provider=Mohsenbostan&lt;span class="pl-cce"&gt;\L&lt;/span&gt;aravelSecretImage&lt;span class="pl-cce"&gt;\L&lt;/span&gt;aravelSecretImageServiceProvider&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
Usage&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Custom Storage Driver&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;you can set a custom storage driver in &lt;code&gt;config/laravel-secret-image.php&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight highlight-text-html-php notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="pl-k"&gt;return&lt;/span&gt; [
    &lt;span class="pl-c"&gt;/*&lt;/span&gt;
&lt;span class="pl-c"&gt;     * Default Storage Driver To Save Images&lt;/span&gt;
&lt;span class="pl-c"&gt;     * -------------------------------------&lt;/span&gt;
&lt;span class="pl-c"&gt;     * Note: Don't use `public` for driver or path.&lt;/span&gt;
&lt;span class="pl-c"&gt;     */&lt;/span&gt;
    &lt;span class="pl-s"&gt;'storage_driver'&lt;/span&gt; =&amp;gt; env(&lt;span class="pl-s"&gt;'FILESYSTEM_DRIVER'&lt;/span&gt;, &lt;span class="pl-s"&gt;'local'&lt;/span&gt;),
];&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Custom Middlewares&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;you can set custom middlewares to protect images in &lt;code&gt;config/laravel-secret-image.php&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight highlight-text-html-php notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="pl-k"&gt;return&lt;/span&gt; [
    &lt;span class="pl-c"&gt;/*&lt;/span&gt;
&lt;span class="pl-c"&gt;     * Default Middlewares To Protect Images&lt;/span&gt;
&lt;span class="pl-c"&gt;     */&lt;/span&gt;
    &lt;span class="pl-s"&gt;'middlewares'&lt;/span&gt; =&amp;gt; [
        &lt;span class="pl-s"&gt;'auth'&lt;/span&gt;
    ]
];&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Save Single Secret Image&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;saveSingleImage&lt;/code&gt; method will save image and return the image path.&lt;/p&gt;
&lt;div class="highlight highlight-text-html-php notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;use&lt;/span&gt;  \&lt;span class="pl-v"&gt;Mohsenbostan&lt;/span&gt;\&lt;span class="pl-v"&gt;LaravelSecretImage&lt;/span&gt;\&lt;span class="pl-v"&gt;LaravelSecretImage&lt;/span&gt;
&lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;image&lt;/span&gt; = &lt;span class="pl-v"&gt;LaravelSecretImage&lt;/span&gt;::&lt;span class="pl-en"&gt;saveSingleImage&lt;/span&gt;(request()-&amp;gt;&lt;span class="pl-en"&gt;file&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mohsenbostan/laravel-secret-image"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I'd be so happy if you contribute to the package to make it better.&lt;/p&gt;

</description>
      <category>laravel</category>
    </item>
  </channel>
</rss>
