OOPSpam API – multiple spam filter


I was thinking about some ideas as a side-project. Well, I thought it would be nice to pass my project-based exams Mobile Applications and Cloud Computing, Human-Computer Interaction with the same idea. I came up with the idea of VirusTotal-like service but as a spam filter service. As a result, OOPSpam API came to light. After making a few research I found out there is actually well-developed solution like mine, however, the price seemed to be high. I started development by integrating a few major spam filer services such as Apache SpamAssassin and deployed the application to Heroku. Roughly, this is how it works:

arch1So, what is the OOPSpam API? It is a multiple spam filter service that has built-in integration with powerful machine learning and text analyzers. It takes a content as an input and sends it to various spam filter services and returns the likelihood of the content to be a spam.
Integration is quite simple, the only thing you have to do is to send a request to https://oopspam.herokuapp.com with JSON object :

{"text":"The example content!"}

As a result, you will get again JSON object as following :

"spam": 2,
"nospam": 1

As obvious it might seem It is worth to mention that spam and nospam stand for a number of services that recognized the content as a spam/not spam.

I’m planning to integrate other providers as well to make it even accurate. The project can be helpful for the folks who want to protect users from the spam contents.

1st Place Winner of Barama HackDay

1457765890_dA few weeks ago Azercell’s Barama Innovation Center announced 36 hours hackathon which is took place on 10 March 2016. I as a team leader with my two teammates from work decided to team up and participate. 12 March was the first day of the competition and they announced that the topic of the hackathon is “Food Industry”. After 36 hours non-stop codding we came up with idea of data analyzing and statistics of food sector. The project analyzes the data that either imported from JSON ,XML etc. files or directly API transactions. Afterwards analyzing the data it shows detailed graphs and statistics which might be useful for market researches.Besides that the project enables user to send Email/SMS to exact target who are interested in particular products, as we know we receive many unwanted notification from different advertising companies on daily basis so we solved the problem (or we think we are) mentioned above and won 1st place.
After all, solving some problems feels good.

Set up Git and initial commit to remote repository

As software developers, often we tend to work on local machine and upload a project when we’re done. This case is fine when the only developer who works on project is you and the changes are small.However when you are dealing with large project with more than one person , you will need to store source code and share it between developers in order to work on the same project.This case lead us to use version control software. The basic concept of version control is :

  • Check out the project from the repository
  • Make changes
  • Check in/commit/submit changes to the repository

Let’s start by downloading version control software (Git) to our machine. You can download it from http://git-scm.com/ and as a Git solution i’m going to use BitBucket, you can use GitHub or other services, the explanation above applies most of them.

Since i use Windows, after installing Git in the right click appears Git Bash Here and Git GUI Here options, do right click the folder that you want to Git to use and select Git Bash Here and it’ll automatically open console from that directory.

First thing you have to do is assign the folder as local git folder in order to do so run code below

git init # assigning the folder as local repository
git remote add origin https://UserName@bitbucket.org/UserName/RepositoryName.git # adding remote git URL

Now you almost done.The URL above in the code is remote URL of git repository.You can get it by simple creating repository on BitBucket.

As we don’t have any other branch except master which is default ,if you want to create new branch just run

git branch BranchName # will create branch

and to switch new branch

git checkout BranchName

checking which branch you are currently using and which files are not tracking or need to be commit

get status

So far we create local repository and branch and added new remote one.Time to commit some codes/files, since i have an existing project i’ll push the project to server.Before pushing our code optionally we can set our user name and email to git.

as i mentioned above i have already project that i want to push if i run get status Git will show me that the folder that my project located is not tracking therefore we need to add project folder to tracking system of Git by doing

get add .
After add, . (period) indicates including whole files and folders.Now we can push our project.
It will ask your password which is you set when you registered on Git repository service. 

In case you want to fetch a project from repository into your local use
git pull origin/master

Those are basic concept of Git,there are a lot more than this so go ahead and check documentation https://git-scm.com/doc

Happy coding!

Entity Framework – NotMapped Attribute

If you include a property in the model,EF will attempt to read/write value from/to the database. In case if we want to exclude a property from the model,we just have to set it without a getter or setter.However there is another convenient/right way to do so by using Data Annotations attribute [NotMapped] which is located in System.ComponentModel.DataAnnotations

public class Company
   public int CompanyId { get; set; }
   public string CompanyName{ get; set; } 

   public DateTime EstablishedDate { get; set; }

Another approach is to use Fluent API as shown below

class ExampleContext : DbContext
        public DbSet<Company> Companies{ get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
                // here we ignore EstablishedDate from creating
.Ignore(b => b.EstablishedDate);

Javascript file is not updating

settingsRecently i wanted to change my JS code and updated it however in development mode the code didn’t work because of the caching. As we know, most of the browsers are caching js/css etc. files in order to reduce load times of pages so when you update your code you have to clear browsing data.
To avoid this we can disable caching in `development mode`, in Chrome as well as Opera has option to disable it.Particularly in Chorme,while in DevTools (you can open it by doing Ctrl+Shift+I), the second of option in the Settings (F1) is Disable cache (while DevTools is open).

[ASP.NET MVC] The ForeignKeyAttribute on property is not valid

You might encounter the error (below) when working on ASP.NET MVC project stating that :

The ForeignKeyAttribute on property 'EmployeeId' on type 'EmployeeSalary' 
is not valid. The navigation property 'Employee' was not found on the dependent 
type 'EmployeeSalary'. The Name value should be a valid navigation property name.

This error occurred when you trying to set ForeignKey attribute without indicating navigate
property name.

Here our EmployeeSalary table :
public partial class EmployeeSalary 
 public int id { get; set; }
 public int EmployeeId { get; set; }
 public decimal Salary{ get; set; }

As you might have already seen we didn’t assign navigate property name,therefore,the error above occurred.In order to solve this problem we should just add property as this:

public virtual Employee Employee { get; set; }

ASP.NET MVC Telerik Grid – file upload on popup mode

Supposing that you need to upload file(s) on popup mode of kendo grid.If your table has relationship with another table then you might want to assign id or whatsoever.
Firstly, let’s create our grid and some JavaScript codes.

      .Columns(columns =>
        columns.Bound(c => c.ColumnName);
        columns.Bound(c => c.ColumnName2);
        // ...
        columns.Command(command => { command.Edit(); command.Destroy(); }).Width(180);
      .ToolBar(toolbar => {

// AddContractDialog is our template for popup editing mode.
      .Editable(editable => editable.Mode(GridEditMode.PopUp).TemplateName("AddContractDialog"))
      .DataSource(dataSource => dataSource
          .Model(model => model.Id(p => p.idSome))
          .Read(read => read.Action("Grid_Read", "ControllerName"))
              .Create(create => create.Action("Grid_Create", "ControllerName").Data("additionalDetail"))
          .Update(update => update.Action("Grid_Update", "ControllerName"))
          .Destroy(destroy => destroy.Action("Grid_Destroy", "ControllerName"))
    function additionalDetail() {
        return {
            filename: window.UploadedFile
   var UploadedFile;
    function onSuccess(e) {
        UploadedFile = e.response.fileName;

What I did is add UploadedFile value that will pass the detail that comes from Success event of upload widget.By defining additionalDetail, we’ll pass our file name to grid’s create event.
Here is our kendo upload widget

    .Async(async => async
        .Save("Save", "ControllerName")
            .Events(c => c

For saving uploaded file and pass file name (in my case,you can pass whatever detail you want) to the Success event.

   public ActionResult Save(IEnumerable<HttpPostedFileBase> attachments)
            string attachmentName = null;
            if (attachments != null)
                foreach (var file in attachments)
                    attachmentName = Path.GetFileName(file.FileName);
// Don't forget create CategoryImage folder.
                    var physicalPath = Path.Combine(Server.MapPath("~/CategoryImage/"), attachmentName );


            // Return file name string to success event
          return Json(new { fileName = attachmentName }, "text/plain");

and in Grid’s create event we add some extra parameter to get our file name.
Contract is just an example model

        public ActionResult Grid_Create([DataSourceRequest]DataSourceRequest request, Contract contract, string filename)

Now you will receive your file’s name as parameter in the Grid_Create (as filename).