TechStacks!

<back to all web services

Overview

Site
The following routes are available for this service:
All Verbs/overview
import Foundation
import ServiceStack

public class Overview : IGet, Codable
{
    public var reload:Bool

    required public init(){}
}

public class OverviewResponse : Codable
{
    public var created:Date
    public var topUsers:[UserInfo]
    public var topTechnologies:[TechnologyInfo]
    public var latestTechStacks:[TechStackDetails]
    public var popularTechStacks:[TechnologyStack]
    public var allOrganizations:[OrganizationInfo]
    public var topTechnologiesByTier:[String:[TechnologyInfo]]
    public var responseStatus:ResponseStatus

    required public init(){}
}

public class UserInfo : Codable
{
    public var userName:String
    public var avatarUrl:String
    public var stacksCount:Int

    required public init(){}
}

public class TechnologyInfo : Codable
{
    public var tier:TechnologyTier
    public var slug:String
    public var name:String
    public var logoUrl:String
    public var stacksCount:Int

    required public init(){}
}

public enum TechnologyTier : String, Codable
{
    case ProgrammingLanguage
    case Client
    case Http
    case Server
    case Data
    case SoftwareInfrastructure
    case OperatingSystem
    case HardwareInfrastructure
    case ThirdPartyServices
}

public class TechStackDetails : TechnologyStackBase
{
    public var technologyChoices:[TechnologyInStack]

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case technologyChoices
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        technologyChoices = try container.decodeIfPresent([TechnologyInStack].self, forKey: .technologyChoices) ?? []
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if technologyChoices != nil { try container.encode(technologyChoices, forKey: .technologyChoices) }
    }
}

public class TechnologyStackBase : Codable
{
    public var id:Int
    public var name:String
    public var vendorName:String
    public var Description:String
    public var appUrl:String
    public var screenshotUrl:String
    public var created:Date
    public var createdBy:String
    public var lastModified:Date
    public var lastModifiedBy:String
    public var isLocked:Bool
    public var ownerId:String
    public var slug:String
    // @StringLength(Int32.max)
    public var details:String

    // @StringLength(Int32.max)
    public var detailsHtml:String

    public var lastStatusUpdate:Date?
    public var organizationId:Int?
    public var commentsPostId:Int?
    public var viewCount:Int
    public var favCount:Int

    required public init(){}
}

public class TechnologyInStack : TechnologyBase
{
    public var technologyId:Int
    public var technologyStackId:Int
    public var justification:String

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case technologyId
        case technologyStackId
        case justification
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        technologyId = try container.decodeIfPresent(Int.self, forKey: .technologyId)
        technologyStackId = try container.decodeIfPresent(Int.self, forKey: .technologyStackId)
        justification = try container.decodeIfPresent(String.self, forKey: .justification)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if technologyId != nil { try container.encode(technologyId, forKey: .technologyId) }
        if technologyStackId != nil { try container.encode(technologyStackId, forKey: .technologyStackId) }
        if justification != nil { try container.encode(justification, forKey: .justification) }
    }
}

public class TechnologyBase : Codable
{
    public var id:Int
    public var name:String
    public var vendorName:String
    public var vendorUrl:String
    public var productUrl:String
    public var logoUrl:String
    public var Description:String
    public var created:Date
    public var createdBy:String
    public var lastModified:Date
    public var lastModifiedBy:String
    public var ownerId:String
    public var slug:String
    public var logoApproved:Bool
    public var isLocked:Bool
    public var tier:TechnologyTier
    public var lastStatusUpdate:Date?
    public var organizationId:Int?
    public var commentsPostId:Int?
    public var viewCount:Int
    public var favCount:Int

    required public init(){}
}

public class TechnologyStack : TechnologyStackBase
{
    required public init(){ super.init() }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
    }
}

public class OrganizationInfo : Codable
{
    public var id:Int
    public var name:String
    public var slug:String
    public var refId:Int?
    public var refSource:String
    public var upVotes:Int?
    public var downVotes:Int?
    public var membersCount:Int
    public var rank:Int
    public var disableInvites:Bool?
    public var lang:String
    public var postTypes:[String]
    public var moderatorPostTypes:[String]
    public var locked:Date?
    public var labels:[LabelInfo]
    public var categories:[CategoryInfo]

    required public init(){}
}

public class LabelInfo : Codable
{
    public var slug:String
    public var color:String

    required public init(){}
}

public class CategoryInfo : Codable
{
    public var id:Int
    public var name:String
    public var slug:String

    required public init(){}
}


Swift Overview DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + JSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /overview HTTP/1.1 
Host: techstacks.io 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	reload: False
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	created: 0001-01-01,
	topUsers: 
	[
		{
			userName: String,
			avatarUrl: String,
			stacksCount: 0
		}
	],
	topTechnologies: 
	[
		{
			tier: ProgrammingLanguage,
			slug: String,
			name: String,
			logoUrl: String,
			stacksCount: 0
		}
	],
	latestTechStacks: 
	[
		{
			technologyChoices: 
			[
				{
					technologyId: 0,
					technologyStackId: 0,
					justification: String,
					id: 0,
					name: String,
					vendorName: String,
					vendorUrl: String,
					productUrl: String,
					logoUrl: String,
					description: String,
					created: 0001-01-01,
					createdBy: String,
					lastModified: 0001-01-01,
					lastModifiedBy: String,
					ownerId: String,
					slug: String,
					logoApproved: False,
					isLocked: False,
					tier: ProgrammingLanguage,
					lastStatusUpdate: 0001-01-01,
					organizationId: 0,
					commentsPostId: 0,
					viewCount: 0,
					favCount: 0
				}
			],
			id: 0,
			name: String,
			vendorName: String,
			description: String,
			appUrl: String,
			screenshotUrl: String,
			created: 0001-01-01,
			createdBy: String,
			lastModified: 0001-01-01,
			lastModifiedBy: String,
			isLocked: False,
			ownerId: String,
			slug: String,
			details: String,
			detailsHtml: String,
			lastStatusUpdate: 0001-01-01,
			organizationId: 0,
			commentsPostId: 0,
			viewCount: 0,
			favCount: 0
		}
	],
	popularTechStacks: 
	[
		{
			id: 0,
			name: String,
			vendorName: String,
			description: String,
			appUrl: String,
			screenshotUrl: String,
			created: 0001-01-01,
			createdBy: String,
			lastModified: 0001-01-01,
			lastModifiedBy: String,
			isLocked: False,
			ownerId: String,
			slug: String,
			details: String,
			detailsHtml: String,
			lastStatusUpdate: 0001-01-01,
			organizationId: 0,
			commentsPostId: 0,
			viewCount: 0,
			favCount: 0
		}
	],
	allOrganizations: 
	[
		{
			id: 0,
			name: String,
			slug: String,
			refId: 0,
			refSource: String,
			upVotes: 0,
			downVotes: 0,
			membersCount: 0,
			rank: 0,
			disableInvites: False,
			lang: String,
			postTypes: 
			[
				String
			],
			moderatorPostTypes: 
			[
				String
			],
			locked: 0001-01-01,
			labels: 
			[
				{
					slug: String,
					color: String
				}
			],
			categories: 
			[
				{
					id: 0,
					name: String,
					slug: String
				}
			]
		}
	],
	topTechnologiesByTier: 
	{
		String: 
		[
			{
				tier: ProgrammingLanguage,
				slug: String,
				name: String,
				logoUrl: String,
				stacksCount: 0
			}
		]
	},
	responseStatus: 
	{
		errorCode: String,
		message: String,
		stackTrace: String,
		errors: 
		[
			{
				errorCode: String,
				fieldName: String,
				message: String,
				meta: 
				{
					String: String
				}
			}
		],
		meta: 
		{
			String: String
		}
	}
}