Functional Plug vs Module Plug - which is best approach?

I want to create Plug for user Authorization,so i would to know what kind plug to use, Functioal or Module?

It depends…

If your plug needs some intialisation, go for a module-plug, if not use a function-plug.

I need make query to database with user_id and dept_id , so i can do that query on init , from that then i pass the result to call, so in this scenario, module plug best approach right?

Where are user_id and dept_id comming from? Are you able to write plug YourAuth, user_id: user_id, dept_id: dept_id in the code?

I always thought that function plugs can only be used in the module in which they are defined. Therefore I always use module plugs when I need to reuse them in other modules.

Is there any way to reuse function plugs defined in another module?

I am using guardian as auth framewrok so i can get logged in user id by using Guardian.Plug.current_resource(conn) and dept_id will come from url , for example http://localhost:4000/department/22

Is this information available in conn? If you can answer this with yes, you probably won’t need a module plug.

An approach I often use, is to start with a module-plug, and just don’t do anything in its init/1 function. This way I have better separation of concerns when I have multiple plugs and can extend easily without having to rename the plug if I really need the init-stuff.

thanks man, its better to start create module plug without doing anything in init/1, so that we can modify plug definitiion in one place

I believe imported functions can be used with the plug :atom syntax also.
Eg https://hexdocs.pm/phoenix/Phoenix.Controller.html#accepts/2 is imported from Phoenix.Controller when use Phoenix.Router, making it available to use in a Router pipeline.