From 8edc6b6a8c240322499356df96e1199bb6bbc872 Mon Sep 17 00:00:00 2001
From: Christian Simon <cs@f03.eu>
Date: Tue, 8 Jan 2013 22:05:00 +0100
Subject: [PATCH] Add api for creating/listing/viewing groups

---
 lib/api.rb          |  3 ++-
 lib/api/entities.rb | 10 +++++++++
 lib/api/groups.rb   | 50 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 1 deletion(-)
 create mode 100644 lib/api/groups.rb

diff --git a/lib/api.rb b/lib/api.rb
index f58b82ff98e..81a5919f1d3 100644
--- a/lib/api.rb
+++ b/lib/api.rb
@@ -11,7 +11,8 @@ module Gitlab
     format :json
     error_format :json
     helpers APIHelpers
-
+    
+    mount Groups
     mount Users
     mount Projects
     mount Issues
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 5cbb1118a89..3bbbd831548 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -32,6 +32,16 @@ module Gitlab
       end
     end
 
+    class Group < Grape::Entity
+      expose :id, :name, :path, :name, :owner_id, :type
+    end
+    
+    class GroupDetail < Grape::Entity
+      expose :id, :name, :path, :name, :owner_id, :type
+      expose :projects, using: Entities::Project
+    end
+
+    
     class RepoObject < Grape::Entity
       expose :name, :commit
       expose :protected do |repo, options|
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
new file mode 100644
index 00000000000..bc856eccdab
--- /dev/null
+++ b/lib/api/groups.rb
@@ -0,0 +1,50 @@
+module Gitlab
+  # groups API
+  class Groups < Grape::API
+    before { authenticate! }
+   
+       resource :groups do
+         # Get a groups list
+         #
+         # Example Request:
+         #  GET /groups
+         get do
+           @groups = paginate Group
+           present @groups, with: Entities::Group
+
+         end
+         
+         # Create group. Available only for admin
+         #
+         # Parameters:
+         #   name (required)                   - Name
+         #   path (required)                   - Path
+         # Example Request:
+         #   POST /groups
+         post do
+           authenticated_as_admin!
+           attrs = attributes_for_keys [:name, :path]
+           @group = Group.new(attrs)
+           @group.owner = current_user
+           
+           if @group.save
+             present @group, with: Entities::Group
+           else
+             not_found!
+           end
+         end
+         
+         # Get a single group, with containing projects
+         #
+         # Parameters:
+         #   id (required) - The ID of a group
+         # Example Request:
+         #   GET /groups/:id
+         get ":id" do
+           @group = Group.find(params[:id])
+           present @group, with: Entities::GroupDetail
+         end
+         
+       end
+  end
+end
-- 
GitLab